多字段查詢會導致索引失效?
在使用 mysql 的 select 查詢時,查詢字段可能會影響索引的使用。最近,有位開發者遇到了一個問題:他的 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