Beberapa situasi dan contoh kod kegagalan indeks MySQL
Pengenalan:
Dalam pangkalan data MySQL, indeks adalah salah satu faktor penting untuk meningkatkan prestasi pertanyaan. Walau bagaimanapun, kadangkala kami mendapati bahawa indeks tidak memainkan peranan yang diharapkan, prestasi pertanyaan tidak dipertingkatkan, malah menyebabkan pertanyaan menjadi lebih perlahan. Sebabnya mungkin indeks itu tidak sah. Artikel ini akan memperkenalkan beberapa situasi biasa yang menyebabkan kegagalan indeks MySQL dan memberikan contoh kod yang sepadan.
1. Gunakan fungsi atau ungkapan untuk melaksanakan operasi pada lajur indeks
Jika panggilan fungsi atau operasi ungkapan dilakukan pada lajur indeks dalam pernyataan pertanyaan, indeks akan menjadi tidak sah dan MySQL tidak akan dapat menggunakan indeks untuk pertanyaan pantas. Berikut ialah contoh:
-- 创建表 CREATE TABLE `user_address` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) DEFAULT NULL, `address` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_user_id` (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; -- 查询示例,索引失效 SELECT * FROM `user_address` WHERE YEAR(`address`) = 2022;
Dalam kod di atas, disebabkan penggunaan fungsiYEAR
untuk lajuraddress
, MySQL tidak boleh menggunakan indeksidx_user_id< /code> , mengakibatkan kegagalan indeks dan mengurangkan kecekapan pertanyaan.
address
列使用了YEAR
函数进行运算,使得MySQL无法利用索引idx_user_id
,导致索引失效,查询效率下降。
二、在索引列上使用了函数
在索引列上使用函数也会导致索引失效,比如下面的示例:
-- 查询示例,索引失效 SELECT * FROM `user_address` WHERE LEFT(`address`, 5) = 'China';
上述代码中,由于对address
列使用了LEFT
函数,同样使得MySQL无法利用索引idx_user_id
,导致索引失效。
三、使用LIKE操作符模糊查询
在使用LIKE操作符进行模糊查询时,如果不是以%通配符开头,将导致索引失效。示例如下:
-- 查询示例,索引失效 SELECT * FROM `user_address` WHERE `address` LIKE 'Shanghai%';
上述代码中,由于LIKE操作符不是以%通配符开头,MySQL无法利用索引idx_user_id
,查询性能下降。
四、查询条件中使用OR关键字
在查询条件中使用OR关键字,如果每个OR子句中的列没有索引,将导致索引失效。示例如下:
-- 查询示例,索引失效 SELECT * FROM `user_address` WHERE `user_id` = 1 OR `address` = 'Shanghai';
上述代码中,由于user_id
和address
Menggunakan fungsi pada lajur indeks juga akan menyebabkan kegagalan indeks, seperti contoh berikut:
rrreee
alamat
The fungsi kod>LEFT juga menjadikan MySQL tidak dapat menggunakan indeks
idx_user_id
, menyebabkan indeks gagal.
3. Gunakan operator LIKE untuk pertanyaan kabur
rrreee
Dalam kod di atas, kerana operator LIKE tidak bermula dengan % aksara wildcard, MySQL tidak boleh menggunakan indeksidx_user_id
dan prestasi pertanyaan berkurangan. 4 Gunakan kata kunci OR dalam keadaan pertanyaan Gunakan kata kunci OR dalam keadaan pertanyaan Jika lajur dalam setiap klausa OR tidak diindeks, indeks akan menjadi tidak sah. Contohnya adalah seperti berikut: rrreeeDalam kod di atas, memandangkan lajur
user_id
dan
address
masing-masing mempunyai indeks mereka sendiri, ia digunakan dalam dua syarat OR sambungan kata kunci masing-masing. Indeks yang berbeza membawa kepada kegagalan indeks. Ringkasan: Apabila menggunakan pangkalan data MySQL, kita perlu mengelakkan senario di atas yang membawa kepada kegagalan indeks. Apabila menulis pernyataan SQL, anda harus cuba mengelak daripada melaksanakan fungsi atau operasi ekspresi pada lajur indeks dan menggunakan pengendali dan kaedah sambungan yang sesuai untuk membina keadaan pertanyaan bagi memastikan indeks boleh digunakan dengan berkesan dalam operasi pertanyaan dan meningkatkan prestasi pertanyaan. Rujukan: Dokumentasi rasmi MySQL (https://dev.mysql.com/doc/)(Nota: Struktur jadual dan pernyataan pertanyaan dalam contoh di atas hanya untuk demonstrasi. Keadaan sebenar mungkin berbeza bergantung pada versi pangkalan data dan tetapan indeks dll. )
Atas ialah kandungan terperinci Situasi yang menyebabkan kegagalan indeks MySQL. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!