1. 前言

偶然看到一个技术群,对一道关于联合索引的讨论。面试题如下:

a_b_c_index 三列复合索引 a =1 and b<100 and c=5 这个查询 会用到索引的那几部分?

复制代码

先说下个人经过本人查询多方资料得到的结论, 只会用到 a 和 b部分(这里和群里小伙伴的讨论结果一致,如果有疑问可以后续探讨)。

2. 验证

要验证这个需要观察explain结果中 key、key_len。key 代表用到的索引。key_len 代表索引使用的字节数,当索引的类型为int且默认值可以为null的时候,用到索引则key_len为4。

接下来是表结构:

CREATE TABLE `test` (

`id` int unsigned NOT NULL AUTO_INCREMENT,

`a` int unsigned NOT NULL DEFAULT '0',

`b` int unsigned NOT NULL DEFAULT '0',

`c` int unsigned NOT NULL,

`asda` varchar(45) DEFAULT NULL,

PRIMARY KEY (`id`),

KEY `a_b_c_index` (`a`,`b`,`c`)

) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

复制代码

分别执行下面的sql。

explain SELECT * FROM test.test where a=2 and b=12 and c=12;

复制代码

根据key_len和key两个字段发现,该sql用到了索引的全部部分。

explain SELECT * FROM test.test where a=2 and b>12 and c=12;

复制代码

其中key_len结果是8,说明只用到了,索引的两个部分,但无法确认是abc中的哪些用到了索引。

explain SELECT * FROM test.test where a=2 and b>12;

复制代码

其中key_len结果是8,说明a和b都用到了索引。

explain SELECT * FROM test.test where a=2 and c=12;

复制代码

其中key_len结果是4,发现其中只有一个字段用到了索引。

explain SELECT * FROM test.test where c=12;

复制代码

这里没用到索引。

根据以上的结果,可以得到那个面试题的结论。只会用到 a 和 b部分用到了索引。

3. 总结

对于联合索引最左原则的总结如下:

1.联合索引的最左侧列要在查询语句中才能用到联合索引。

2.查询语句中,存在最左侧连续的字段,且不能有范围查询的联合索引部分会生效。

3.最左原则在遇到范围查询后,之后往右的字段,索引不生效。

mysql最左_Mysql最左原则相关推荐

  1. mysql索引选择_MySQL 索引选择原则

    目的 MySQL查询优化器是基于代价(cost-based)的查询方式.因此,在查询过程中,最重要的一部分是根据查询的SQL语句,依据多种索引,计算查询需要的代价,从而选择最优的索引方式生成查询计划. ...

  2. mysql数据库校对_mysql数据库校对原则

    一.数据库瓶颈 不管是IO瓶颈,还是CPU瓶颈,最终都会导致数据库的活跃连接数增加,进而逼近甚至达到数据库可承载活跃连接数的阈值.在业务Service来看就是,可用数据库连接少甚至无连接可用.接下来就 ...

  3. mysql组合索最左_MySQL组合索引和最左匹配原则

    可以看到该查询使用到了索引 EXPLAIN SELECT * FROM student WHERE id = 2 AND name = 'defghijk' and age = 8; 可以看到该查询使 ...

  4. 找到符合条件的索引_高频面试题:MySQL联合索引的最左前缀匹配原则

    前言 之前在网上看到过很多关于mysql联合索引最左前缀匹配的文章,自以为就了解了其原理,最近面试时和面试官交流,发现遗漏了些东西,这里自己整理一下这方面的内容. 最左前缀匹配原则 在mysql建立联 ...

  5. mysql数据库内连接、左连接、右连接的区别

    mysql内连接.左连接.右连接的区别 1.内连接:结合两张表的记录,返回相关的查询结果,返回的是两个表的交集部分. 关键字:INNER JOIN SELECT * FROM emp e INNER ...

  6. mysql 索引 测试_mysql的索引测试

    Mysql高级 mysql索引测试 一.生成测试数据 1.创建测试表 /*创建t_user表用于数据测试*/ DROP TABLE IF EXISTS t_user; CREATE TABLE `t_ ...

  7. mysql索引实例_mysql索引之十:Mysql 索引案例学习

    理解索引最好的办法是结合示例,所以这里准备了一个索引的案例. 假设要设计一个在线约会网站,用户信息表有很多列,包裹国家,地区,城市,性别,眼睛颜色,等等.完整必须支持上面这些特征的各种组合来搜索用户, ...

  8. mysql中表联结_MySQL -- 表联结

    创建联结:(使用WHERE联结)SELECTvend_name,prod_name,prod_priceFROMvendors,productsWHEREvendors.vend_id=product ...

  9. MySQL数据库索引的最左匹配原则((a),(a,b),(a,b,c)都能用到索引,(a,c)呢?)

    MySQL数据库索引的最左匹配原则 一. 联合索引说明 二. 那ac是否能用到索引呢? 三. 思考 四. 最左匹配原则的成因 一. 联合索引说明 建立三个字段的联合索引 联合索引(a,b,c)相当于建 ...

最新文章

  1. python语言怎么用-这些小游戏是怎么用Python语言制作出来的……
  2. 为什么有的系统的事务码BSP_WD_CMPWB看不见Enhance Component这个按钮
  3. layui进度条bug
  4. JS,JQ,PHP的小知识点整理
  5. [C#] 等待启动的进程执行完毕
  6. MyBatis 源码解读-reflectorFactoryElement()
  7. How to debug Material delta download
  8. vue 判断同一数组内的值是否一直_前端代码+后端API,值得一学的Vue高仿音乐播放器实战项目
  9. 开源纯C#工控网关+组态软件(四)上下位机通讯原理
  10. java 集成开发工具_最好的Java开发人员测试和集成工具
  11. .NET 4.0 调用 C dll 触发 AccessViolationException 异常的处理方案
  12. jmeter压测前清理内存
  13. [oracle原]访问局域网内出现“ORA-12541:TNS:无监听程序”
  14. 圆变成长方形什么变了_中班数学教案详案图形变变变含PPT课件
  15. P3371 单源最短路径【模板】 洛谷
  16. java(8) HashMap源码
  17. python分支和循环的思维导图_思维导图的绘制步骤【PDCA管理循环】
  18. 10. python-es-8.3.3-IP范围聚合ip_range
  19. 如何对matlab .m代码文件进行加密
  20. 漏洞补丁在线更新失败或软件安装提示ERROR的解决方案

热门文章

  1. linux :vim 实现命令行下输出进度条
  2. mysql批量用trim限定_如何使用trim()并更新mysql中的所有行[复制]
  3. linux qt ping,Qt5.2中使用ping命令实现Ip扫描功能
  4. mongodb java报授权,mongoDB 3.0用户创建与授权
  5. SpringBoot整合Mybatis-plus实现增删查改
  6. 获取url参数值(可解码中文值)
  7. [Codeforces673A]Bear and Game(水题,思路)
  8. PowerBuilder调用.Net编译好的DLL
  9. Flash 杂志《summer tree》 第六期发布
  10. 母版中menu控件上传后出现脚本错误