MySQL SELECT查询包含大量字段时,索引失效的原因是什么?
问题描述:
有一条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字段,也可以使用索引。