Kesan Perintah Keadaan Klausa WHERE terhadap Prestasi MySQL
Apabila membuat pertanyaan kompleks dengan banyak syarat, susunan yang anda tentukan syarat tersebut boleh memberi kesan kepada prestasi MySQL. Walaupun susunan secara amnya membuat sedikit perbezaan untuk keadaan mudah, ia menjadi lebih ketara apabila satu syarat mengecilkan set hasil dengan ketara.
Pertimbangkan dua pertanyaan berikut:
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)
Dalam kedua-dua pertanyaan, kami mencari baris yang memenuhi kriteria khusus merentas berbilang medan menggunakan syarat ATAU. Walaupun syarat pertama biasanya menghasilkan set hasil yang besar, syarat "syarikat" mengehadkan keputusan kepada set yang lebih sempit.
Menurut pelan pelaksanaan MySQL, ia mengikut perintah penilaian kiri ke kanan untuk keadaan WHERE . Ini bermakna dalam pertanyaan pertama, MySQL akan melaksanakan syarat "syarikat" sebelum menggunakan syarat ATAU. Jika keadaan "syarikat" mengembalikan sebilangan kecil baris, MySQL akan mengindeksnya untuk kecekapan, mengurangkan overhed pemprosesan keadaan ATAU berikutnya.
Sebaliknya, pertanyaan kedua mempunyai syarat "syarikat" yang disenaraikan selepas syarat ATAU. Akibatnya, MySQL akan melaksanakan syarat OR terlebih dahulu, berpotensi memproses bilangan baris yang lebih besar dan mencipta indeks sementara jika diperlukan. Langkah pengindeksan tambahan ini boleh meningkatkan overhed pertanyaan.
Litar Pintas dan Kesan Prestasi
Adalah penting untuk ambil perhatian bahawa susunan keadaan klausa WHERE juga boleh menjejaskan prestasi dalam kes di mana litar pintas berlaku. Apabila keadaan dinilai sebagai benar, MySQL serta-merta mengembalikan benar untuk keseluruhan keadaan, memintas penilaian keadaan berikutnya.
Sebagai contoh, pertimbangkan pertanyaan berikut:
SELECT myint FROM mytable WHERE myint >= 3 OR myslowfunction('query #1', myint) = 1;
Jika " myint >= 3" menilai kepada benar untuk baris tertentu, MySQL tidak akan melaksanakan panggilan "myslowfunction", yang merupakan operasi yang memakan masa. Walau bagaimanapun, jika "myslowfunction" muncul di sebelah kiri keadaan OR, ia akan dilaksanakan untuk semua baris, walaupun yang tidak memenuhi syarat "myint >= 3".
Kesimpulan
Walaupun susunan keadaan klausa WHERE umumnya mempunyai kesan prestasi yang minimum, ia boleh menjadi faktor dalam kes di mana satu keadaan ketara mengecilkan set keputusan atau di mana litar pintas terlibat. Dengan meletakkan syarat yang lebih ketat pada permulaan klausa WHERE, anda berpotensi meningkatkan prestasi dan kecekapan pertanyaan.
Atas ialah kandungan terperinci Bagaimanakah Urutan Keadaan Klausa WHERE Mempengaruhi Prestasi Pertanyaan MySQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!