問題描述:
有一條select查詢,包含大量字段,在某些情況下會使用索引,而在另一些情況下則不會。當查詢中注釋掉其中一個字段時,索引就會被使用。
表結構:
create table base_project_court ( id varchar(32) not null, name varchar(30) not null, ... ); create table dev_device_log ( id bigint(20) not null, court_id varchar(32) not null, ... );
分析:
當查詢中包含字段pc.name時,mysql優化器會認為回表獲取數據效率較低,因此會使用全表掃描而不是索引。這是因為id字段是varchar(32)類型,在utf8mb4字符集下,每個字符占用4個字節,這意味著id字段的鍵長為130字節。當查詢中包含大量字段時,優化器會權衡使用索引和全表掃描的成本,并選擇成本較低的方法。
當注釋掉pc.name字段時,僅需要使用id字段作為查詢條件,優化器認為使用索引可以更有效率。因此,此時查詢會走索引。
解決方法:
為了解決此問題,可以在base_project_court表上為id和name字段添加一個聯合索引:
ALTER TABLE base_project_court ADD INDEX idx_id_name (id, name);
此索引可以提高查詢速度,即使查詢包含pc.name字段,也可以使用索引。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END