Rumah >pangkalan data >tutorial mysql >Adakah Susunan Syarat dalam Klausa MySQL WHERE Mempengaruhi Prestasi Pertanyaan?

Adakah Susunan Syarat dalam Klausa MySQL WHERE Mempengaruhi Prestasi Pertanyaan?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-25 15:27:14560semak imbas

Does the Order of Conditions in a MySQL WHERE Clause Affect Query Performance?

Adakah Urutan Keadaan dalam MySQL WHERE Klausa Memberi Impak Prestasi?

Dalam pertanyaan MySQL dengan klausa WHERE yang luas dan banyak syarat, ia adalah penting untuk mengoptimumkan prestasi. Katakan satu syarat khusus, seperti pengecam syarikat, mengurangkan ruang carian dengan ketara daripada ratusan ribu kepada berdozen. Patutkah keadaan ini diletakkan di tempat pertama dalam klausa?

Pertimbangkan dua versi pertanyaan yang mencari pelanggan yang sepadan dengan parameter tertentu:

SELECT * FROM clients WHERE 
(firstname LIKE :foo OR lastname LIKE :foo OR phone LIKE :foo) AND 
(firstname LIKE :bar OR lastname LIKE :bar OR phone LIKE :bar) AND 
company = :ugh
SELECT * FROM clients WHERE 
company = :ugh AND
(firstname LIKE :foo OR lastname LIKE :foo OR phone LIKE :foo) AND 
(firstname LIKE :bar OR lastname LIKE :bar OR phone LIKE :bar) 

Kesan terhadap Prestasi

Secara tradisinya, tertib syarat dipercayai mempunyai kesan minimum atau tiada kesan terhadap prestasi MySQL. Walau bagaimanapun, ujian dan cerapan baru-baru ini telah mendedahkan bahawa dalam senario tertentu, ia sememangnya boleh membuat perubahan.

Litar Pintas dan Susunan Syarat

Faktor utama adalah pendek -litar. Dalam MySQL, apabila menilai keadaan kompaun yang disambungkan oleh DAN atau ATAU, enjin pangkalan data boleh menilai operan pertama hanya jika syarat itu berkaitan. Pengoptimuman ini boleh menjimatkan masa yang ketara jika syarat pertama mengecilkan ruang carian dengan ketara.

Demonstrasi

Untuk menggambarkan kesan ini, pertimbangkan pertanyaan berikut:

-- query #1
SELECT myint FROM mytable WHERE myint >= 3 OR myslowfunction('query #1', myint) = 1;

-- query #2
SELECT myint FROM mytable WHERE myslowfunction('query #2', myint) = 1 OR myint >= 3;

Perbezaannya hanyalah susunan operan dalam keadaan ATAU. myslowfunction ialah fungsi yang sengaja mahal yang merangkumi kesan sampingan mengelog setiap invokasi.

Apabila pertanyaan ini dilaksanakan:

myslowfunction called for query #1 with value 1
myslowfunction called for query #1 with value 2
myslowfunction called for query #2 with value 1
myslowfunction called for query #2 with value 2
myslowfunction called for query #2 with value 3
myslowfunction called for query #2 with value 4

Seperti yang dilihat dalam surih, myslowfunction dipanggil lebih sedikit kali untuk pertanyaan #1 kerana syarat pertama (myint >= 3) menghapuskan banyak baris yang tidak memenuhinya. Meletakkan syarat ini terlebih dahulu membolehkan penamatan awal dan menghalang penilaian yang tidak perlu bagi fungsi perlahan.

Kesimpulan

Oleh itu, jawapan kepada soalan ialah: Ya, susunan keadaan dalam klausa WHERE kadangkala boleh menjejaskan prestasi MySQL disebabkan litar pintas. Dengan meletakkan syarat terhad dahulu, enjin pangkalan data boleh mengoptimumkan pelaksanaan pertanyaan dengan mengelakkan pemprosesan yang tidak perlu dan memaksimumkan kecekapan.

Atas ialah kandungan terperinci Adakah Susunan Syarat dalam Klausa MySQL WHERE Mempengaruhi Prestasi Pertanyaan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn