Rumah >pangkalan data >tutorial mysql >Adakah Susunan Syarat dalam Klausa MySQL WHERE Mempengaruhi Prestasi Pertanyaan?
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!