Apakah menambahkan 'LIMIT 1' ke kueri MySQL membuatnya lebih cepat ketika Anda tahu hanya akan ada 1 hasil?

86

Ketika saya menambahkan LIMIT 1 ke kueri MySQL, apakah itu menghentikan pencarian setelah menemukan 1 hasil (sehingga membuatnya lebih cepat) atau apakah itu masih mengambil semua hasil dan memotong di bagian akhir?

Logan Serman
sumber
1
Tidak jika ada UNIQUE(atau PRIMARY KEY) batasan (atau indeks) pada kolom filter. stackoverflow.com/questions/8467092/…
ma11hew28

Jawaban:

81

Bergantung pada kueri, menambahkan klausa batas dapat berdampak besar pada kinerja. Jika Anda hanya menginginkan satu baris (atau mengetahui fakta bahwa hanya satu baris yang dapat memenuhi kueri), dan tidak yakin tentang bagaimana pengoptimal internal akan mengeksekusinya (misalnya, klausa WHERE tidak mengenai indeks dan sebagainya), maka Anda pasti harus menambahkan klausa LIMIT.

Adapun kueri yang dioptimalkan (menggunakan indeks pada tabel kecil) mungkin tidak terlalu penting dalam kinerja, tetapi sekali lagi - jika Anda hanya tertarik pada satu baris daripada menambahkan klausa LIMIT.

Eran Galperin
sumber
30
Untuk tujuan antibugging, Anda mungkin ingin mempertimbangkan untuk mengirimkan LIMIT 2 dan kemudian mengeluh atau membom jika asumsi baris tunggal Anda tidak berlaku.
Jeffrey Hantin
6
@JeffreyHantin Jika hanya ada satu, Anda sebaiknya memilih menambahkan batasan unik ke database. Jauh lebih bersih kemudian mengacaukan kode Anda dengan pemeriksaan kewarasan.
Cristian Vrabie
@CristianVrabie Jika dapat diekspresikan sebagai batasan unik, tentu saja, tapi itu adalah pernyataan tentang data dalam tabel. Mengirim LIMIT 2 dan memeriksa 1 adalah pernyataan tentang kueri itu sendiri, yang mungkin berisi bug seperti kondisi penggabungan yang ditentukan secara tidak memadai.
Jeffrey Hantin
1
@JeffreyHantin Cukup adil, tetapi kecuali jika Anda membuat kode untuk Mars Rover Anda menulis tes untuk ini daripada mencemari kode Anda.
Cristian Vrabie
8
@JeffreyHantin Jika asumsi bahwa hanya ada satu yang benar, bukankah menambahkan LIMIT 2 akan menghentikan pengoptimalan apa pun karena akan mencari semua baris? Menambahkan LIMIT 2 dalam hal itu tidak lebih baik (dari segi pengoptimalan) daripada menambahkan tidak ada sama sekali.
Chris Middleton
19

Batasan dapat mempengaruhi kinerja kueri (lihat komentar dan tautan di bawah) dan juga mengurangi kumpulan hasil yang dikeluarkan oleh MySQL. Untuk kueri di mana Anda mengharapkan hasil tunggal ada manfaat.

Selain itu, membatasi kumpulan hasil sebenarnya dapat mempercepat waktu kueri total karena mentransfer kumpulan hasil yang besar menggunakan memori dan berpotensi membuat tabel sementara pada disk. Saya menyebutkan ini karena saya baru-baru ini melihat aplikasi yang tidak menggunakan limit kill server karena kumpulan hasil yang sangat besar dan dengan batasan di tempat, pemanfaatan sumber daya turun drastis.

Periksa halaman ini untuk lebih jelasnya: Dokumentasi MySQL: LIMIT Optimization

rjamestaylor.dll
sumber
Halaman yang Anda tautkan mengatakan: "Jika Anda memilih hanya beberapa baris dengan LIMIT, MySQL menggunakan indeks dalam beberapa kasus ketika biasanya ia lebih suka melakukan pemindaian tabel lengkap." Sepertinya kueri itu sendiri tidak selalu diproses seperti biasa.
che
poin yang bagus. Saya membuat generalisasi berdasarkan pengamatan dari penggunaan EXPLAIN. Terima kasih untuk tangkapannya.
rjamestaylor
Tautan ini sangat dihargai. FWIW, sebagian besar jawaban ini tampaknya berlaku untuk situasi di mana tanpa Batas, mungkin ada kumpulan hasil yang besar . Pertanyaannya adalah menanyakan apakah penting jika hanya 1 baris yang berhasil cocok; dalam hal ini "kumpulan hasil" hanya 1 baris (bahkan tanpa Batas).
ToolmakerSteve
5

Jika hanya ada 1 hasil yang kembali, maka tidak, LIMIT tidak akan membuatnya lebih cepat. Jika ada banyak hasil, dan Anda hanya membutuhkan hasil pertama, dan tidak ada pernyataan GROUP atau ORDER maka LIMIT akan membuatnya lebih cepat.

Kris Erickson
sumber
2
Seharusnya lebih cepat bahkan dengan 1 baris, jika tidak ada kunci unik / primer, karena berhenti mencari setelah menemukan kejadian pertama
the_nuts
Kris, kalimat pertamamu bisa dibaca dengan salah satu dari dua cara. Jika maksud Anda "hanya 1 baris yang mungkin dapat dikembalikan" (misalnya meminta kolom unik), maka yang Anda katakan adalah benar. OTOH, jika maksud Anda "setiap kali hanya 1 hasil yang cocok ditemukan" batas tidak akan membuatnya lebih cepat: Anda yakin? Bukankah terkadang itu menghindari keharusan menarik halaman tambahan?
ToolmakerSteve
5

Jawabannya, singkatnya, ya. Jika Anda membatasi hasil Anda menjadi 1, bahkan jika Anda "mengharapkan" satu hasil, kueri akan lebih cepat karena database Anda tidak akan memeriksa semua catatan Anda. Ini hanya akan berhenti setelah menemukan catatan yang cocok dengan kueri Anda.

Max Alexander Hanna
sumber
1
Jawaban ini menyesatkan, karena tidak memiliki peringatan seperti yang terlihat dalam komentar pada jawaban lain (7 tahun sebelumnya!) Bahwa jika DB mengetahui bahwa hanya satu catatan yang mungkin cocok (misalnya meminta kolom unik), maka Batas 1 tidak akan berpengaruh.
ToolmakerSteve
Sungguh? Pengoptimal kueri dapat memanfaatkan fakta bahwa kondisi tertentu menjamin bahwa hanya 1 catatan yang mungkin dapat dikembalikan. Saya telah menunjukkan bahwa jawaban Anda tidak benar dalam semua keadaan. (Dan karena itu mengurangi nilai dari apa yang telah dikatakan bertahun-tahun sebelumnya.) Jika Anda setuju, Anda dapat mengakui kebenaran komentar saya. Jika Anda tidak setuju, Anda dapat menjelaskan alasannya.
ToolmakerSteve
1

Jika Anda benar-benar hanya mengharapkan satu hasil, sangat masuk akal untuk menambahkan LIMIT ke kueri Anda. Saya tidak tahu cara kerja MySQL, tapi saya yakin itu tidak akan mengumpulkan hasil kumpulan 100'000 + catatan hanya untuk memotongnya kembali ke 1 di akhir ..

driAn
sumber