MySQL - SELECT (sorgu) - son Derece yavaş alanında neden?
İncelemek istediğim bir veritabanında çiftleri bir çift var, çiftleri görmek için ne yaptım, bunu yaptım:
SELECT relevant_field
FROM some_table
GROUP BY relevant_field
HAVING COUNT(*) > 1
Bu şekilde, relevant_field ile tüm satırları bir kez daha ortaya çıkan alırım. Bu sorguyu çalıştırmak için saniye sürer.
Şimdi, çiftleri her incelemek istedim, böyle yaptım yukarıdaki sorguda bir relevant_field ile some_table her satır SEÇİN, düşündüm:
SELECT *
FROM some_table
WHERE relevant_field IN
(
SELECT relevant_field
FROM some_table
GROUP BY relevant_field
HAVING COUNT(*) > 1
)
Bu nedense (dakika sürer) extreeeemely yavaş ortaya çıkıyor. Tam olarak burada yavaş yapacak şey nedir? relevant_field dizine.
Sonunda bir görünüm "," ilk sorgu 7 ** ve sonra bu benim ikinci sorgu yapmak yerine: . temp_view oluşturmaya çalıştım
SELECT *
FROM some_table
WHERE relevant_field IN
(
SELECT relevant_field
FROM temp_view
)
Ve gayet güzel çalışıyor. MySQL birkaç milisaniye cinsinden yapar.
Neler olduğunu açıklayabilecek herhangi bir SQL uzmanlar burada?
CEVAP
Bu sorguyu yeniden yazın
SELECT st1.*, st2.relevant_field FROM sometable st1
INNER JOIN sometable st2 ON (st1.relevant_field = st2.relevant_field)
GROUP BY st1.id /* list a unique sometable field here*/
HAVING COUNT(*) > 1
st2.relevant_field
having
yoksa tümcesi hata verir çünkü seçin olmalı düşünüyorum, ama 0 emin değilim
Hiç bir sorgu ile IN
kullanın; bu, herkesin bildiği gibi yavaş.
Sadece değerleri sabit bir liste ile IN
kullanın.
Daha fazla ipucu
- Eğer sorguları daha hızlı yapmak istiyorsanız,
SELECT *
sadece bir seçme yapma alanları gerçekten gerek. relevant_field
dizin eş birleşim hızlandırmak için olduğundan emin olun.- Birincil anahtar
group by
emin olun. - Eğer Orada isenizvesadece endeksli bir alan seçin(işler çok karmaşık değildir)daha MySQL sorgunuzu sadece dizinler kullanarak, yol işleri hız çözer.
IN (select
sorguların �'ı için genel çözüm
Bu kodu kullanın
SELECT * FROM sometable a WHERE EXISTS (
SELECT 1 FROM sometable b
WHERE a.relevant_field = b.relevant_field
GROUP BY b.relevant_field
HAVING count(*) > 1)
Neden MYSQL yüksek LİMİTLİ sorgu aşağı...
Nasıl MySQL etkinleştir'MySQL yen...
Neden bir döngü iki döngü daha yavaş g...
Neden benim program tam olarak 8192 el...
Nasıl çıkış için MySQL csv biçiminde s...