MySQL SELECT查询包含大量字段时,索引失效的原因是什么?

mysql select查询包含大量字段时,索引失效的原因是什么?

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字段,也可以使用索引。

以上就是MySQL SELECT查询包含大量字段时,索引失效的原因是什么?的详细内容,更多请关注其它相关文章!