mysql执行成本分析1

130 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第17天,点击查看活动详情

们先通过几个例子来看一下为什么有些索引不走,带着这个疑问,我们来认识一下trace工具。

示例表结构

mysql-version : [8.0.27]

CREATE TABLE `test_index` (
  `id` int NOT NULL,
  `name` varchar(20) DEFAULT NULL,
  `score` int DEFAULT NULL,
  `addr` varchar(30) DEFAULT NULL,
  `ctime` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `union_name_score_addr` (`name`,`score`,`addr`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;

联合索引首字段范围查找失效

image.png

正常情况下,范围之后的索引失效,但是如果范围查询的是首个索引字段,则所有索引均失效

强制索引

我们有时可以强制某个查询用索引。用法如下:force index;虽然查询由上面的全表扫描变成了范围查询,而且扫描的行数也减少了,但是最终cost的时间未必最少。其内部有成本分析。

explain select * from test_index t force index (union_name_score_addr) where t.name > '北京' and Score=1 and addr='010北京' 

image.png

in和or在表数据量比较大的情况会走索引,在表记录不多的情况下会选择全表扫描

explain select * from test_index t where t.name in( '北京' )and Score=1 and addr='010北京' -- ken_len=161
explain select * from test_index t where t.name in( '北京' ,'上海')and Score=1 and addr='010北京' -- ken_len=161
 
explain select * from test_index t where t.name ='北京' or name='上海' and Score=1 and addr='010北京' -- ken_len=161
 

image.png 我们复制一份表,表记录仅保留10行记录,看效果 image.png

LIKE 'XX%'走索引(数据量大时)

当联合索引的首字段为like时,走索引 image.png

索引下推

首先该理论仅限于二级索引。(可能由于InnoDb引擎库中聚簇索引包含了所有数据,所以效率不高)。 索引下推:即在联合索引中根据第一个索引值筛选出结果后,同时在接下来的索引中进行条件判断,同时满足条件时进行回表,从而减少回表的次数。

下图为5.6版本前未索引下推以及索引下推的差异。 image.png