【实测版】联合索引,最左匹配原则,走?不走?
本文基本基于Explain做分析,如果不太了解可以先移步下文(。・ω・。)ノ
了解MySQL的Explain,读这一篇够了( ̄∇ ̄)/
开始✊✊✊
建表
我们先创建一个表
CREATE TABLE `aqin_index` (`id` BIGINT(20) UnSIGNED NOT NULL AUTO_INCREMENT,`name` VARCHAR(50) NOT NULL,`card_no` VARCHAR(50) NOT NULL,`time_created` DATETIME DEFAULT CURRENT_TIMESTAMP,`note` VARCHAR(100) NOT NULL,PRIMARY KEY (`id`),INDEX `index_unit` (`name`,`time_created`,`card_no`) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8;
Message字段显示OK则表示创建成功
这里创建的时候直接添加了一个联合索引
INDEX 索引名称 (字段1,字段2,字段3) USING 索引方法
索引名称:自己起个就成
字段1,字段2,字段3:想要添加的联合索引的所有字段(需要注意顺序)
索引方法:一般选择BTREE(BTREE/HASH)
也可以在现有的表中添加
ALTER TABLE `aqinindex` ADD INDEX `index_unit` (`name`,`time_created`,`card_no`)
插入数据
创建函数
-- 插入百万数据
DELIMITER $$
CREATE FUNCTION mock_data_4_aqin_index()
RETURNS INTBEGINDECLARE num INT DEFAULT 1000000;DECLARE i INT DEFAULT 0;WHILE i < num DO-- 插入语句INSERT INTO `aqin_index`(`name`,`card_no`,`note`)VALUES(CONCAT('name-',i), CONCAT('18', FLOOR(RAND()*((999999999-100000000)+100000000))),CONCAT('note-',FLOOR(RAND()*2), UUID(), FLOOR(RAND()*100)));SET i = i+1;END WHILE;RETURN i;END;
Message字段显示如上图即为执行成功
调用函数
SELECT mock_data_4_aqin_index()
Message字段显示如上图即为执行成功,瞅一眼咱们生成的数据
删除函数
DROP FUNCTION 函数名
注意⚠️此处的函数名是不加括号的
我们浅浅的测试下
执行测试语句
EXPLAIN select * from aqin_index where name = 'name-9999' and time_created="2023-01-09 16:37:56" and `card_no` = '18432153441'
可以看出type类型是ref,key_len值为310(三个字段长度和),走了联合索引并且3个字段都用上了
计算方式可以参考了解MySQL的Explain,读这一篇够了( ̄∇ ̄)/
替换三个字段的顺序
各个参数无变化
结论:字段都有,换顺序对结果无影响
删除第一个字段
type类型是ALL,即走了全表查询
结论:第一个字段缺失则不走索引
删除其他字段
type类型是ref,key_len值为158,用到了联合索引,但是只用了两个字段(name和time_created)
结论:第一个字段存在,就会使用联合索引,其他字段缺少只会影响用到索引的字段数
特殊情况
分析下上面两张图,他们的type类型是index,使用了全索引扫描,相比较ref挺慢的其实
分析下上面两张图,他们的区别在于查询的字段是否被联合索引覆盖,card_no在联合索引中,type类型是index,note不在type类型是ALL,index的性能虽然不如ref但优于全表扫描ALL
总结
联合索引的各个字段可以不按顺序出现(原因是WHERE后面字段的顺序会被优化器优化为符合最左前缀的顺序),但是第一个字段必须出现,否则不走索引(最左前缀匹配,即WHERE条件必须有联合索引的第一个字段,以最左边的为起点任何连续的索引都能匹配上),当SELECT后需要查询的字段被联合索引覆盖,也会走索引,但方式是进行全索引扫描,效率并不高
【实测版】联合索引,最左匹配原则,走?不走?相关推荐
- 联合索引-最左匹配原则
前言: 面试官:建过索引嘛? 我有一个朋友:见过呀! 面试官:那你知道MySQL的执行计划嘛? 我有一个朋友:啊?!! 面试官:那你肯定知道最左匹配原则吧. 我有一个朋友:额... 想必大家面试时都被 ...
- 联合索引最左匹配原则成因
使用col3,col2,col1 顺序建立联合索引,通过col3的值建立一个b+tree ,通过关键值去查找"Alice",在叶子节点中找到两个"Alice", ...
- 简述一下索引的匹配原则_Mysql联合索引最左匹配原则
[toc] 为什么使用联合索引 以联合索引(a,b,c)为例 建立这样的索引相当于建立了索引a.ab.abc三个索引.一个索引顶三个索引当然是好事,毕竟每多一个索引,都会增加写操作的开销和磁盘空间的开 ...
- 联合索引最左匹配原则
如果有一个2列的索引(col1,col2),则已经对(col1).(col1,col2)上建立了索引: 如果有一个3列索引(col1,col2,col3),则已经对(col1).(col1,col2) ...
- Mysql复合索引最左匹配原则以及索引失效条件
Mysql复合索引最左匹配原则以及索引失效条件 复合索引最左匹配原则 用EXPLAIN 来查看语句是否用到了索引 索引失效的条件 一般性建议 复合索引最左匹配原则 复合索引又叫联合索引.两个或更多个列 ...
- 数据库索引最左匹配原则
索引最左匹配原则 建立联合索引时会遵循最左匹配原则,即最左优先,在检索数据时从联合索引的最左边开始匹配 例如: 为user表中的name.address.phone列添加联合索引 ALTER TABL ...
- 索引使用原则-联合索引最左匹配
前面我们说的都是针对单列创建的索引,但有的时候我们的多条件查询的时候,也会建立联合索引.单列索引可以看成是特殊的联合索引. 比如我们在user 表上面,给name 和phone 建立了一个联合索引. ...
- mysql 最左_mysql索引最左匹配原则
创建表 插入 10000 条数据 建立了联合索引(a,b,c) 验证: explain 指令详解可以查看 explain select * from test where a<10 ; expl ...
- mysql索引最左匹配原则的理解
我记得网易面试的时候问到了.阿里也面到了 创建表 create table test( a int , b int, c int, d int, key index_abc(a,b,c) )engin ...
- 简述一下索引的匹配原则_索引最左匹配原则
写在前面:我在上大学的时候就听说过数据库的最左匹配原则,当时是通过各大博客论坛了解的,但是这些博客的局限性在于它们对最左匹配原则的描述就像一些数学定义一样,往往都是列出123点,满足这123点就能匹配 ...
最新文章
- Linux插件shellinabox结合翻译插件使用(以Chrome为例)
- 全球及中国焦炉气制天然气用催化剂行业前景动态与未来可行性研究报告2022版
- 【OpenCV 例程200篇】84. 由低通滤波器得到高通滤波器
- apache 2许可证_如何理解Apache 2专利许可
- ZZW_shell脚本中的调用MYSQL传参及注意的问题
- select下拉框带模糊查询_SQL 之 简单查询
- php文件苹果用什么软件打开,你知道php文件用什么软件打开吗?
- 嵌入式软件测试参考书籍
- JSP设置IE版本兼容
- css 选父元素,CSS子元素选择父元素的实现
- Snort的TILE64移植
- 【基础知识】8、加州房价预测项目精细解释
- 推荐一个好看的极简主义博客网站程序-liveblog
- On Smoothness of a Vector Field-Application to Optical Flow
- Java图形界面开发—简易登录注册小程序
- 连续两年进入Gartner SFA魔力象限,CRM领头羊销售易做对了什么?
- 汽车行业数据防泄露解决方案
- html格式桌面,HTML桌面壁纸
- 【教程】怎样在PC查看动漫之家(DMZJ)不能观看漫画
- Echarts中tooltips数据格式化(点击不同的lengend数据提示框中显示相应的单位)