写点什么

MYSQL 索引篇(下)

用户头像
new life
关注
发布于: 2021 年 02 月 23 日
MYSQL 索引篇(下)

1.索引比较


mysql 数据库是关系型数据库中的杰出代表,在选择关系型数据库的时候,mysql 都会作为优先选择,一方面由于开源的特点,还有 mysql 自身一些好的设计,优异的性能,备受开发者青睐;而索引作为数据库加速查询的通用手段,mysql 自然也有自己一套索引设计机制,现在就让我们从最简单的索引分类开始分享吧。


1.1 建表语句

CREATE TABLE `t_combine_index` (  `id` int NOT NULL,  `a` int DEFAULT NULL,  `b` int DEFAULT NULL,  `c` int DEFAULT NULL,  `d` varchar(128) DEFAULT '',  PRIMARY KEY (`id`),  KEY `idx_a_b_c` (`a`,`b`,`c`),  KEY `index_pre_d` (`d`(6))) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
复制代码


1.2 数据准备

delimiter ;create procedure idata()begin    declare i int;    set i = 1;    while(i <= 100000)        do        		insert into t_combine_index values (i, i, i, i, concat(i + 100000,'lisi'));            set i = i + 1;        end while;end;delimiter ;call idata();
复制代码


1.3 索引验证

1.3.1 联合索引

1.3.1.1 无索引查询
select * from t_combine_index where b > 10000 and b <20000;
复制代码

执行耗时:

执行计划:

1.3.1.2 使用联合索引
select * from t_combine_index where a > 10000 and a <20000;
复制代码

执行耗时:

执行计划:

1.3.1.3 使用覆盖索引
select a,b,c from t_combine_index where a > 10000 and a <20000;
复制代码

执行耗时:

执行计划:


1.3.2 前缀索引

前置索引的索引列不能使用覆盖索引

1.3.2.1 等值查询
select * from t_combine_index where d = '199992li_si';
复制代码

执行耗时:

执行计划:


select d from t_combine_index where d = '199992li_si';
复制代码


执行耗时:

执行计划:


结论:上下两次执行时间差不多,因为前缀索引不是完整的一列,mysql 都要回表查询一次,故耗时相近;

1.3.2.2 模糊查询

1、索引查询

select * from t_combine_index where d like '199992%';
复制代码


执行耗时:

执行计划:


2、无索引查询

select * from t_combine_index where d like '%199992%';
复制代码

执行耗时:

执行计划:


发布于: 2021 年 02 月 23 日阅读数: 41
用户头像

new life

关注

还未添加个人签名 2019.03.04 加入

还未添加个人简介

评论

发布
暂无评论
MYSQL 索引篇(下)