多字段查詢導致索引失效?如何解決 MySQL 查詢中的索引失效問題?

多字段查詢導致索引失效?如何解決 MySQL 查詢中的索引失效問題?

多字段查詢會導致索引失效?

在使用 mysqlselect 查詢時,查詢字段可能會影響索引的使用。最近,有位開發者遇到了一個問題:他的 sql 查詢在只有幾百條數據時可以使用索引,但是導入幾萬條數據后就無法使用了。

查詢代碼如下:

SELECT   dl.`user_type` AS userType,   dl.`user_name` AS userName,   dl.`phone` AS userPhone,   pc.`name` AS courtName,   dl.`build_unit` AS buildName,   dl.`dev_name` AS deviceName,   dl.`dev_no` AS deviceNo,   dl.`create_time` AS openTime,   dl.`status` FROM   dev_device_log dl   LEFT JOIN base_project_court pc     ON dl.`court_id` = pc.`id` ORDER BY dl.`id` DESC LIMIT 0, 100;

令人不解的是,當注釋掉 pc.name 字段時,查詢就可以使用索引了。

經過分析,問題出在索引覆蓋之上。因為主鍵索引字段是 varchar(32),使用 utf8mb4 字符集,每個字符占用 4 字節。因此,主鍵索引的長度為 130 字節,mysql 優化器認為直接全表查詢比逐行檢索更有效率,于是放棄了索引。

為了解決這個問題,可以在 base_project_court 表上創建包含 id 和 name 字段的組合索引。這樣,查詢就可以直接從索引中獲取所需的數據,無需回表,從而避免索引失效。

? 版權聲明
THE END
喜歡就支持一下吧
點贊7 分享