2008-08-29 12 views
24

Bir sorguyu bir sonuç kaydıyla sınırlayacak, büyük bir (ish) MySQL tablosunda, tablo yalnızca bir eşleşen sonuca sahipse, performansı iyileştirecek mi? Bir kaydı bir sorguyla sınırlandırır Performansı iyileştirir

select * from people where name = "Re0sless" limit 1 

bu adla yalnızca bir kayıt varsa örneğin

için

? ve name, birincil anahtar/benzersiz olarak ayarlanmışsa ne olacak? ve sorguyu güncellemeye değer mi yoksa kazanım minimum mı olacak?

cevap

35

kolon

benzersiz bir dizin varsa: hayır, öyle hiçbir hızlı

benzersiz olmayan bir dizin: belki, o eşleşen ilk dışında herhangi bir ek satırlar gönderme önleyecektir çünkü, bazen

    : herhangi hayır indeksi

    varsa

  • 1 veya daha fazla satır sorgu ile eşleşiyorsa, yes, çünkü ilk satır eşleştikten sonra tam tablo taraması durdurulur.
  • hiçbir satır "adı" tablosundaki benzersiz ise tam bir tablo
+2

Tam tablo taramasını engeller mi, yoksa tam tablo taramasının erken durmasına neden olur mu? Kayıt yoksa, tam dolu bir tablo taraması yapmak zorunda kalır. –

+2

Evet, haklısınız. Tam bir tablo taramasının "önleyebileceğini" söylemiş olmalıydı. İletiyi –

+4

olarak ayarlayacağım. Anladığım kadarıyla burada önemli olan şey, limiti eklemek, sorgunuzu daha hızlı hale getirebilir, ancak daha yavaş yapamaz. Başka bir şey yoksa, aynı zamanda, koşulların sizin düşündüğünüz gibi benzersiz olmadığı bir durumun hatalarını ayıklaması durumunda, gelecekteki geliştiricilere yönelik niyetinizi açıkça telgraflamanıza da hizmet eder. Ben sadece bir sonuç olduğunda her zaman bir limit cümlesi eklemek için bir alışkanlık haline getiriyorum. Önceden var olan bir endeksin sizin için bunu yapıp yapmadığını anlamak sadece boşa harcanan beyin gücüdür. – GrandOpener

0

LIMIT'in veri kümesi bulunduğundan ve sonuç kümesinin oluşturulmasından sonra yapılması gereken bir şey olduğuna inanıyorum, bu yüzden hiç bir değişiklik yapmasını beklemem. Birincil anahtarın adının yapılması, sütun için bir dizin oluşturulmasına yol açacağı için önemli bir pozitif etkiye sahip olacaktır.

0

taramak o tamamlamanız gerekir çünkü sorgu, hiçbir, maç, sonra yine bir (çok çok az olabilir) Sorunuza limit kısıtlaması koyarak performans kazanın. İsim birincil anahtar ise, muhtemelen yok olacaktır.

2

Sorularınıza sırayla cevap vermek için: 1) evet, eğer isimde bir indeks yoksa. Sorgu ilk kaydı bulduğu anda sona erecek. sınırı al ve her seferinde tam bir tablo taraması yapmak zorunda. 2) no. Birincil/benzersiz anahtarların benzersiz olması garanti edilir. Sorgu, satırı bulduğu anda çalışmaya devam etmelidir.

0

Evet, verilerle çalışırken bir performans farkı göreceksiniz. Bir kayıt, birden çok kayıttan daha az yer kaplar. Birçok satırla uğraşmadıkça, bu pek bir fark yaratmaz, ancak sorguyu çalıştırdığınızda, verilerin size gösterilmesi gerekir, bu da maliyetlidir veya programatik olarak ele alınır. Her iki durumda da, bir kayıt çokludan daha kolaydır.

3

Biraz daha karmaşık bir sorgunuz varsa, bir veya daha fazla katma sahipse, LIMIT yan tümcesi ek olarak ek bilgi sağlar. İki tabloyu eşleşmesi ve tüm satırları döndürmesi beklenirse, hash join genellikle en uygunudur. Karma birleştirme, büyük miktarda eşleme için optimize edilmiş birleştirme türüdür.

Artık eniyileyici, LIMIT 1'i geçtiğini biliyorsa, büyük miktarda veri işlenmeyeceğini bilir. loop join'a dönebilir. Veritabanına (ve hatta veritabanı sürümüne) bağlı olarak, bu, performans üzerinde büyük bir etkiye sahip olabilir.