MySQL索引有哪些法则

发布时间:2021-08-04 14:35:27 作者:Leah
来源:亿速云 阅读:109

这篇文章给大家介绍MySQL索引有哪些法则,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

一、最佳左前缀法则

1. 定义

在创建了多列索引的情况下,查询从索引的最左前列开始且不能跳过索引中的列。

最佳左前缀法则就是说如果创建了多个索引,在使用索引时要按照创建索引的顺序来使用,不能缺少或跳过,当然如果只使用最左边的索引列,也就是第一个索引是可以的。

2. 环境准备

DROP TABLE IF EXISTS `tb_emp`; CREATE TABLE `tb_emp` (   `id` int(11) NOT NULL AUTO_INCREMENT,   `name` varchar(20) NOT NULL,   `age` int(11) NOT NULL,   gender varchar(10) NOT NULL,   email varchar(20),   PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; INSERT INTO `tb_emp` (name,age,gender,email) VALUES ('Tom', '22','male','1@qq.com'); INSERT INTO `tb_emp` (name,age,gender,email) VALUES ('Mary', '21','female','2@qq.com'); INSERT INTO `tb_emp` (name,age,gender,email) VALUES ('Jack', '27','male','3@qq.com'); INSERT INTO `tb_emp` (name,age,gender,email) VALUES ('Rose', '23','female','4@qq.com');

3. 创建组合索引

create index idx_all on tb_emp(name,age,gender); show index from tb_emp;

MySQL索引有哪些法则

这里用火车头代表name,车厢代表age,车尾代表gender。

4. 只有火车头

MySQL索引有哪些法则

说明:

5. 只有车厢

MySQL索引有哪些法则

说明:没使用火车头(name),直接用车厢,导致走全表扫描(type=ALL)

6. 火车头加车厢、火车头加车尾

MySQL索引有哪些法则

MySQL索引有哪些法则

说明:

火车头加车厢、火车头加车尾,虽然都是type=ref,但是观察key_len和ref两项,并对比只有火车头中的结果,可得出在使用火车头(name)和车尾(gender)时,只使用了部分索引也就是火车头(name)的索引。

通俗理解:火车头单独跑没问题,火车头与直接相连的车厢一起跑也没问题,但是火车头与车尾,如果中间没有车厢,只能火车头自己跑。

7. 火车头加车厢加车尾

MySQL索引有哪些法则

说明:火车头加车厢加车尾,三者串联,就变成了奔跑的小火车。type=ref,key_len=128,ref=const,const,const。

二、索引列不做计算

在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效从而转向全表扫描。

1. 函数计算

MySQL索引有哪些法则

说明:这里使用了函数计算,type=ALL,导致索引失效。

2. 隐式类型转换

MySQL索引有哪些法则

说明:这里'123'是字符串,而123是数字,发生了隐式类型转换,导致全表扫描(type=ALL)

三、范围右边索引列全失效

存储引擎不能使用索引中范围右边的列,也就是说范围右边的索引列会失效。

MySQL索引有哪些法则

对以上4个SQL进行分析:

结论:范围右边的索引列失效。

四、尽量使用覆盖索引

1. 覆盖索引定义

如果一个索引包含(或覆盖)所有需要查询的字段的值,称为‘覆盖索引’。即只需扫描索引而无须回表。

只扫描索引而无需回表的优点:

覆盖索引必须要存储索引列的值,而哈希索引、空间索引和全文索引不存储索引列的值,所以mysql只能用B-tree索引做覆盖索引。

当发起一个索引覆盖查询时,在explain的extra列可以看到using index的信息

2. 对比是否使用覆盖索引好处

尽量使用覆盖索引(查询列和索引列尽量一致,通俗说就是对A、B列创建了索引,然后查询中也使用A、B列),减少select *的使用。

mysql> explain select * from tb_emp where name='Jack' and age=27 and gender='male'; mysql> explain select name,age,gender from tb_emp where name='Jack' and age=27 and gender='male';

MySQL索引有哪些法则

说明:对比两个sql,第一个使用select *,第二个使用覆盖索引(查询列与条件列对应),可看到Extra从Null变成了Using  index,提高检索效率。

关于MySQL索引有哪些法则就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

推荐阅读:
  1. MySQL索引类型分类有哪些
  2. MySQL索引具体有哪些功能

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

mysql

上一篇:python3+PyQt5如何自定义窗口部件

下一篇:如何解决某些HTML字符打不出来的问题

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》