MySQL sorgularına 'SINIR 1' eklemek, yalnızca 1 sonuç olacağını bildiğinizde onları daha hızlı yapar mı?


Yanıtlar:


81

Sorguya bağlı olarak, bir sınır cümlesi eklemenin performans üzerinde büyük bir etkisi olabilir. Yalnızca bir satır istiyorsanız (veya yalnızca bir satırın sorguyu tatmin edebileceğini biliyorsanız) ve dahili optimize edicinin onu nasıl çalıştıracağından emin değilseniz (örneğin, WHERE cümlesinin bir dizine çarpmaması vb.), kesinlikle bir LIMIT cümlesi eklemelisiniz.

Optimize edilmiş sorgulara gelince (küçük tablolarda dizinler kullanarak), muhtemelen performans açısından çok da önemli olmayacaktır, ancak yine - eğer sadece bir satırla ilgileniyorsanız, ne olursa olsun bir LIMIT cümlesi eklemektense.


30
Antiugging amacıyla LIMIT 2 göndermeyi düşünebilir ve ardından tek satırlık varsayımınız geçerli değilse şikayet edebilir veya bombalayabilirsiniz.
Jeffrey Hantin

6
@JeffreyHantin Gerçekten sadece bir tane varsa, veritabanına benzersiz bir kısıt eklemeyi tercih etmelisiniz. Çok daha temiz, sonra kodunuzu akıl sağlığı kontrolleriyle karıştırmak.
Cristian Vrabie

@CristianVrabie Benzersiz bir kısıtlama olarak ifade edilebiliyorsa, elbette, ancak bu tablolardaki verilerle ilgili bir iddia. LIMIT 2 göndermek ve 1'i kontrol etmek, sorgunun kendisiyle ilgili bir iddiadır ve bu, yetersiz bir şekilde belirtilen birleştirme koşulu gibi bir hata içerebilir.
Jeffrey Hantin

1
@JeffreyHantin Fair yeter, ancak Mars Rover'ı kodlamanız dışında, kodunuzu kirletmek yerine bunun için testler yazarsınız.
Cristian Vrabie

8
@JeffreyHantin Yalnızca bir tane olduğu varsayımı doğruysa, tüm satırları arayacağı için LIMIT 2 eklemek herhangi bir optimizasyonu öldürmez mi? Bu durumda LIMIT 2 eklemek, hiçbir şey eklemekten daha iyi (optimizasyon açısından) değildir.
Chris Middleton

19

Sınır, sorgunun performansını etkileyebilir (aşağıdaki yorumlara ve bağlantıya bakın) ve ayrıca MySQL tarafından çıkarılan sonuç kümesini azaltır. Tek bir sonuç beklediğiniz bir sorgu için faydalar vardır.

Dahası, sonuç kümesinin sınırlandırılması aslında toplam sorgu süresini hızlandırabilir çünkü büyük sonuç kümelerini aktarmak bellek kullanır ve diskte potansiyel olarak geçici tablolar oluşturur. Son zamanlarda büyük sonuç kümeleri nedeniyle bir sunucuyu öldürme limitini kullanmayan bir uygulama gördüğümde ve sınırın yerinde olması nedeniyle kaynak kullanımı büyük ölçüde düştü.

Daha ayrıntılı bilgi için bu sayfayı kontrol edin: MySQL Belgeleri: LIMIT Optimizasyonu


Bağlandığınız sayfada şöyle diyor: "LIMIT ile yalnızca birkaç satır seçiyorsanız, MySQL normalde tam bir tablo taraması yapmayı tercih ettiği bazı durumlarda dizinleri kullanır." Bu, sorgunun kendisi her zamanki gibi işleniyor gibi görünmüyor.
che

iyi bir nokta. EXPLAIN kullanarak gözlemlere dayanarak bir genelleme yapıyordum. Yakaladığınız için teşekkürler.
rjamestaylor

Bağlantı çok takdir ediliyor. FWIW, bu cevabın çoğu, Limit olmadan büyük bir sonuç kümesinin olabileceği durumlar için geçerli görünüyor . Soru, yalnızca 1 satırın başarılı bir şekilde eşleşip eşleşmeyeceğinin önemli olup olmadığını sormaktır; bu durumda "sonuç kümesi" yalnızca 1 satırdır (Sınırsız bile).
ToolmakerSteve

5

Geri gelen yalnızca 1 sonuç varsa, o zaman hayır, LIMIT daha hızlı yapmayacaktır. Çok fazla sonuç varsa ve yalnızca ilk sonuca ihtiyacınız varsa ve ifadelere göre GRUP veya SİPARİŞ yoksa, LIMIT daha hızlı hale getirecektir.


2
Benzersiz / birincil anahtar yoksa, 1 satırla bile daha hızlı olmalıdır, çünkü ilk geçtiği yeri
bulduktan

Kris, ilk cümlenin iki yoldan biri okunabilir. Eğer "muhtemelen sadece 1 satır döndürülebilir" demek istiyorsan (örneğin, benzersiz bir sütunu sorgulamak), o zaman söylediklerin doğrudur. OTOH, "sadece 1 eşleşen sonuç bulunduğunda" demek istiyorsan, limit onu daha hızlı yapmaz: Emin misin? Bazen ek sayfalar almak zorunda kalmaz mı?
ToolmakerSteve

5

Kısaca cevap evet. Sonucunuzu 1 ile sınırlandırırsanız, bir sonuç "bekliyor olsanız" bile, veritabanınız tüm kayıtlarınıza bakmayacağı için sorgu daha hızlı olacaktır. Sorgunuzla eşleşen bir kayıt bulduğunda duracaktır.


1
Bu cevap yanıltıcıdır, çünkü diğer cevaplarla ilgili yorumlarda (7 yıl önce!) Görülen uyarıdan yoksundur, eğer DB yalnızca bir kaydın eşleşebileceğini biliyorsa (örneğin, benzersiz bir sütunu sorgulamak), o zaman Limit 1'in hiçbir etkisi olmayacaktır.
ToolmakerSteve

Ciddi anlamda? Sorgu iyileştirici, belirli koşulların yalnızca 1 kaydın döndürülebileceğini garanti etmesinden yararlanabilir. Cevabınızın her koşulda doğru olmadığını söylüyordum. (Ve bu nedenle yıllar önce söylenenden değer çıkarır.) Kabul ederseniz, yorumumun doğruluğunu kabul edebilirsiniz. Kabul etmiyorsan nedenini açıklayabilirsin.
ToolmakerSteve

1

Gerçekten yalnızca tek bir sonuç bekliyorsanız, SINIRI sorgunuza eklemek gerçekten mantıklıdır. MySQL'in iç işleyişini bilmiyorum, ama eminim sonunda 100.000'den fazla sonuç kümesi toplamayacak ve sonunda 1'e düşürmeyecek ..

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.