当前位置: 首页 > news >正文

mysql8-索引的使用规则验证

MYSQL

1、mysql如何查看执行计划

EXPLAIN SELECT * FROM USER1 WHERE id1 = 1 AND id2 = 1 AND id3 = 1 AND id4 = 1;

oracle如何查看执行计划

可以使用语句:

explain plan FOR SELECT \* FROM SIBF_JHYSF_TRANS_SERIAL; -- 先执行第一条,仅仅是生成执行计划,不会自动显示
SELECT \* FROM TABLE(dbms_xplan.display); -- 再执行第二条,显示执行计划

2、mysql8-索引的使用规则验证

1、创建数据库

1660052682050

2、创建表user

CREATE TABLE USER(
	id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, -- 这里的顺序还有点问题,无符号要放在主键全面,不然会报错。。,大概是约束问题吧。
	NAME VARCHAR(20),
	age VARCHAR(10),
	phone VARCHAR(20),
	address VARCHAR(100),
	email VARCHAR(100),
	INDEX stu_index(NAME, age, phone, address)
)ENGINE = INNODB CHARSET = utf8;

1660052989968

3、查看sql执行计划

1、首先插入几条数据

INSERT INTO USER(NAME, age, phone, address, email) VALUES('aaa', 'aaa', 'bbb', 'ccc', 'ddd');
INSERT INTO USER(NAME, age, phone, address, email) VALUES('aaa', 'aaa', 'ccc', 'ccc', 'ddd');
INSERT INTO USER(NAME, age, phone, address, email) VALUES('aaa', 'aaa', 'bbb', 'cccc', 'dddd');
INSERT INTO USER(NAME, age, phone, address, email) VALUES('aaaa', 'aaaa', 'bbb', 'cccc', 'dddd');

2、使用唯一主键查找:

EXPLAIN SELECT * FROM USER WHERE id = 1;

1660053653049

3、使用普通索引查找:

3.1、首先使用符合最左前缀原则(也就是,mysql的索引,遇到了索引排序是乱序的条件,后面无法使用索引查找):

EXPLAIN SELECT * FROM USER WHERE age = 'aaa' AND phone = 'bbb' AND NAME = 'aaa';

此时索引虽然不按照创建时的顺序排列,但是SQL优化器会进行优化为按照最左前缀原则的索引序列。

1660056358638

3.2、然后使用不符合原则的SQL:

EXPLAIN SELECT * FROM USER WHERE age = 'aaa' AND phone = 'bbb';

1660056336540

就不会走这个索引了。

3.3、在普通索引字段上使用范围查询,看前面的索引字段会不会走索引?

是否走索引,看type,key就可以了,都不为空,说明走了索引。

EXPLAIN SELECT * FROM USER WHERE phone LIKE '%bbb%' AND age = 'aaa' AND NAME = 'aaa'; -- 走索引,后两个索引字段查询

1660055481493

EXPLAIN SELECT * FROM USER WHERE phone >= '%bbb%' AND age = 'aaa' AND NAME = 'aaa'; -- 走索引,索引范围

1660055515615

4、在普通索引字段上使用范围查询,看后面的索引字段会不会走索引?

EXPLAIN SELECT * FROM USER WHERE phone LIKE '%bbb%' AND age = 'aaa' AND NAME = 'aaa' AND address = 'ccc'; -- address不会走索引,也就是位于范围查找后的索引字段不会走索引

1660056079970

5、测试复合主键(a, b, c),在使用其中一部分字段(a, b)(b, c) (b)查询时,会不会走主键索引?

5.1、首先简单的新建一张表

CREATE TABLE USER1(
	id1 INT,
	id2 INT,
	id3 INT,
	id4 INT,
	NAME VARCHAR(20),
	PRIMARY KEY(id1, id2, id3, id4)
)ENGINE = INNODB CHARSET = utf8;

id1、id2、id3、id4为复合主键

插入一条数据,避免查询时,explain提示没有数据,而不显示执行计划。

INSERT INTO user1 VALUES(1, 1, 1, 1, 'aaa');
INSERT INTO user1 VALUES(1, 1, 2, 1, 'aaa');

5.2、使用复合主键全部字段查询

EXPLAIN SELECT * FROM USER1 WHERE id1 = 1 AND id2 = 1 AND id3 = 1 AND id4 = 1;

走索引,并使用了四个字段查询。1660056660098

5.3、使用复合主键部分字段查询,满足最左前缀原则

EXPLAIN SELECT * FROM USER1 WHERE id1 = 1 AND id2 = 1;

1660056747352

走索引。

5.4、使用复合主键部分字段查询,不满足最左前缀原则

EXPLAIN SELECT * FROM USER1 WHERE id3 = 1 AND id4 = 1;

1660056819753

不走索引。

5.5、使用复合主键,当作普通索引使用,验证范围查询是否会使得后面的索引字段不能使用?

EXPLAIN SELECT * FROM USER1 WHERE id3 > 1 AND id2 = 1 AND id1 = 1

1660057244422

EXPLAIN SELECT * FROM USER1 WHERE id3 > 1 AND id2 = 1 AND id1 = 1 AND id4 = 1;

可见,在id3范围查找下,添加id4,或者不添加,结果一样。但是是因为走的是range吧。

1660057266297

使用like,可以看到使用的索引字段。

EXPLAIN SELECT * FROM USER1 WHERE id3 LIKE '%1%' AND id2 = 1 AND id1 = 1;

1660057326099

EXPLAIN SELECT * FROM USER1 WHERE id3 LIKE '%1%' AND id2 = 1 AND id1 = 1 AND id4 = 1;

1660057277797

可见,在id3范围查找下,不加id4与添加id4结果一样,均使用了一个索引,以及其中的两个索引字段。也就可以说明,mysql中复合主键在使用上与复合索引并无差别。只是主键代表的含义是:一张表的唯一标识,多了一个唯一的约束

6、结论

1、mysql完全遵守最左前缀原则,即:使用的where条件导致索引字段排列无序,就不会走索引。当然不适用索引字段查找,更不会走索引了。

2、只要条件中的字段,遵循最左前缀原则,无论排序如何,SQL会被优化为可以走索引的形式。

3、遇到索引字段进行范围查询,同样,该字段前的索引正常使用,后面的索引字段不会再起作用。但是,这个索引仍然起作用了,只是某些索引字段没有起作用。这一点非常重要,是多个索引字段组成了一个索引,而不是每个字段都是一个索引

4、mysql中复合主键在使用上与复合索引并无差别。只是主键代表的含义是:一张表的唯一标识,多了一个唯一的约束

表中索引与代码定义的不匹配:

TL_REQMSG:索引没有建立*

相关文章:

  • Python神经网络入门与实战,神经网络算法python实现
  • un8.31:用jQuery实现调用不同项目api接口的功能。
  • Java Agent入门教程
  • 航班信息查询 易语言代码
  • C++ 小游戏 视频及资料集(四)
  • 利用HFSS-API设计指数渐变传输线
  • js的es6
  • 开源交流丨任务or实例 详解大数据DAG调度系统Taier任务调度
  • 配置Tomcat时系统环境变量已经配置好,但是启动Tomcat时还是闪退的解决办法
  • app,小程序打包
  • CVPR2022|比VinVL快一万倍!人大提出交互协同的双流视觉语言预训练模型COTS,又快又好!
  • 2023年考武汉安全员证有什么作用?安全员岗位职责是什么?甘建二
  • 开户许可证识别 易语言代码
  • ESP8266-Arduino编程实例-MLX90615红外测温仪驱动
  • 【算法leetcode】1837. K 进制表示下的各位数字总和(rust和go是真的好用)
  • 0x05 Python数据分析,Anaconda八斩刀
  • 2017-09-12 前端日报
  • - C#编程大幅提高OUTLOOK的邮件搜索能力!
  • Flannel解读
  • happypack两次报错的问题
  • HTML中设置input等文本框为不可操作
  • JS实现简单的MVC模式开发小游戏
  • linux学习笔记
  • PAT A1092
  • Phpstorm怎样批量删除空行?
  • python大佬养成计划----difflib模块
  • Tornado学习笔记(1)
  • vue--为什么data属性必须是一个函数
  • Vue组件定义
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 关于extract.autodesk.io的一些说明
  • 码农张的Bug人生 - 见面之礼
  • 新手搭建网站的主要流程
  • C# - 为值类型重定义相等性
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • # 飞书APP集成平台-数字化落地
  • #git 撤消对文件的更改
  • #Linux(帮助手册)
  • $jQuery 重写Alert样式方法
  • $refs 、$nextTic、动态组件、name的使用
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (Java岗)秋招打卡!一本学历拿下美团、阿里、快手、米哈游offer
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (SpringBoot)第七章:SpringBoot日志文件
  • (初研) Sentence-embedding fine-tune notebook
  • (附源码)php投票系统 毕业设计 121500
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (三)Honghu Cloud云架构一定时调度平台
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • *1 计算机基础和操作系统基础及几大协议
  • 、写入Shellcode到注册表上线
  • .net 4.0发布后不能正常显示图片问题