SORU
26 Mayıs 2011, PERŞEMBE


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
26 Mayıs 2011, PERŞEMBE


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

  1. Eğer sorguları daha hızlı yapmak istiyorsanız, SELECT * sadece bir seçme yapma alanları gerçekten gerek.
  2. relevant_field dizin eş birleşim hızlandırmak için olduğundan emin olun.
  3. Birincil anahtar group by emin olun.
  4. 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) 

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • audivila

    audivila

    5 HAZİRAN 2009
  • FUNKER530 - Veteran Community & Combat Footage

    FUNKER530 -

    25 Ocak 2007
  • Mark Halberstadt

    Mark Halbers

    19 ŞUBAT 2010