什么是MySQL联合索引

联合索引又叫复合索引,是MySQL的InnoDB引擎中的一个索引方式,如果一个系统频繁地使用相同的几个字段查询结果,就可以考虑建立这几个字段的联合索引来提高查询效率。

如何建立索引

举个例子:

create table `table_name`(`id` bigint(20) NOT NULL  PRIMARY KEY,`a` int(11),`b` int(11),`c` varchar(22),KEY `key_a_b_c` (`a`,`b`,`c`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

如上面的代码其中

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

语句就是建立了a,b,c字段联合索引的语句。

最左前缀原则

在使用联合索引时要注意有个最左前缀原则,最左前缀原则就是要考虑查询的字段的顺序,只有遵守这个原则才能最大地提高查询的效率,下面我们举个例子说明最左前缀原则。

建立 (a,b,c)的联合索引

#完全按创建的顺序,能走到a,b,c3个字段的索引,评级:优化最高
SELECT * FROM tz_prod.table_name where a = 1 and b=2 and c = '3';
#换了b和c的顺序,MySQL会进行优化,效率和上面的一样,评级:优化最高
SELECT * FROM tz_prod.table_name where a = 1 and c = '3' and b=2;
 #能走到a和b的索引,评级:优化最高SELECT * FROM tz_prod.table_name where    a = 1 and b=2 ;
#能走到a和b的索引,b的范围查询不影响优化,评级:优化最高SELECT * FROM tz_prod.table_name where     a = 1 and b<2 ;
#能走到a的索引,评级:优化最高
SELECT * FROM tz_prod.table_name where    a = 1;
#能走到a的索引,评级:优化最高
SELECT * FROM tz_prod.table_name order by   a ;
#只能走到a的索引走不到c的索引,如果c的离散度高则查询效率很低,评级:优化差
SELECT * FROM tz_prod.table_name where     a = 1 and  c = '3';
#能走到a和b的索引走不到c的索引,b的范围查询使后面字段无法走索引,评级:优化差
SELECT * FROM tz_prod.table_name where     a = 1  and b<2 and  c = '3';
#能走到a的索引,评级:优化最高
SELECT * FROM tz_prod.table_name where   a > 1  order by a;
#能走到a的索引,走不到b索引 评级:优化差
SELECT * FROM tz_prod.table_name where   a > 1  order by b;
#同上,评级:优化差
SELECT * FROM tz_prod.table_name where   a > 1  order by c;
#走不到b和c的索引,最左前缀原则必须以建立索引的第一个字段作为第一个条件,评级:最差
SELECT * FROM tz_prod.table_name where   b=2 and  c = '3';

联合索引提高查询效率的原理

MySQL会为InnoDB的每个表建立聚簇索引,如果表有索引会建立二级索引。聚簇索引以主键建立索引,如果没有主键以表中的唯一键建立,唯一键也没会以隐式的创建一个自增的列来建立。聚簇索引和二级索引都是一个b+树,b+树的特点是数据按一定顺序存在叶子节点且每页数据相连。一般情况下使用索引查询时,先查询二级索引的b+树,查到数据并拿数据中保存的主键回查聚簇索引查到所有数据。下面我们举个例子来重现这个过程。

以下面表举例,假设表中已经存了部分数据:

create table `user_info`(`id` bigint(20) NOT NULL  PRIMARY KEY,`name` varchar(11),`age` int(11),`phone` varchar(20),KEY `key_name_age` (`name`,`age`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

InnoDB建立的聚簇索引和二级索引如下图

聚簇索引

二级索引

假如我们想要查找名字为zhaoliu,年龄为30的人的信息。即name='zhaoliu',age=30

  • (1)先查二级索引,先用二分法查找发现在wangwu名字的右边
  • (2)读取右边的这页的数据到内存,二分法查到数据2个name为zhaoliu人。
  • (3)继续二分法比较age查到数据id=31
  • (4)id=31回查聚簇索引先用二分法查找发现在31右边
  • (5)读取31左边这页数据到内存,二分法查到数据并返回数据

如果你仅仅查找id,name和age数据那么这样就用到了覆盖索引,这样就不用回查聚簇索引,在第(3)步直接返回数据即可。

转载于:https://my.oschina.net/u/945573/blog/2985834

MySQL联合索引原理解析相关推荐

  1. MySQL复合索引原理解析

    什么是MySQL联合索引 联合索引又叫复合索引,是MySQL的InnoDB引擎中的一个索引方式,如果一个系统频繁地使用相同的几个字段查询结果,就可以考虑建立这几个字段的联合索引来提高查询效率. 如何建 ...

  2. 深入浅析Mysql联合索引原理 之 最左匹配原则。

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

  3. MySQL联合索引原理_复合索引_组合索引_多列索引

    文章目录 联合索引原理示意图 联合索引就是复合索引.组合索引.多列索引. 联合索引原理示意图

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

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

  5. mysql联合索引怎么存储_联合索引在B+树上的存储结构及数据查找方式

    能坚持别人不能坚持的,才能拥有别人未曾拥有的. 关注编程大道公众号,让我们一同坚持心中所想,一起成长!! 引言 上一篇文章<MySQL索引那些事>主要讲了MySQL索引的底层原理,且对比了 ...

  6. mysql联合索引abc

    mysql 联合索引 复合索引 (abc) 命中率:在工作中经常会使用到联合索引,在百度查询多很多资料也有说法不一的.给大家实测下100w数据下查询命中率,废话不多说.上干货: 创建测试表: SET ...

  7. mysql联合索引的数据结构

    一.本文主要讲解的内容有: 联合索引在B+树上的存储结构 联合索引的查找方式 为什么会有最左前缀匹配原则 在分享这篇文章之前,我在网上查了关于MySQL联合索引在B+树上的存储结构这个问题,翻阅了很多 ...

  8. mysql 联合索引详解

    mysql 联合索引详解 联合索引又叫复合索引.对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key index (a,b,c). ...

  9. mysql联合索引测试

    mysql联合索引和查询条件的匹配原则: 只有当联合索引的第一个字段在where条件中出现时,才会使用索引查询,不然就是全表扫描查询. 表的索引为: KEY `Index_query` (`trans ...

最新文章

  1. Opengl-阴影(分为定向光的和点光源的)
  2. 动态卷积超进化!通道融合替换注意力,减少75%参数量且性能显著提升|ICLR 2021
  3. My SQL InnoDB 1217 - Cannot delete or update a parent row:aforeign key constraint fals
  4. CRMEB微信商城源码下载
  5. Boost学习笔记-智能指针
  6. 深入理解ES6之迭代器与生成器
  7. 解决为什么JDK要带着JRE一起下载
  8. linux中如何查看某个端口是否被占用,LINUX中如何查看某个端口是否被占用
  9. 爱链工具怎么使用 爱链工具详细使用图文教程
  10. werkzeug response
  11. 关于ASP.NET MVC开发设计中出现的问题与解决方案汇总 【持续更新】
  12. 乌班图系统设置系统语言,以及中文输入法
  13. linux delete快捷键,Linux 常用快捷键
  14. 汇编语言期末复习不挂科——知识点总结
  15. 怎么直接运行js文件
  16. 秒 毫秒 微秒 纳秒 皮秒。。。时间单位换算
  17. vs2008 html5 的安装,vs2008安装教程,详细教您vs2008安装教程
  18. 三年级语文课外阅读赏析——心田花开
  19. win10自带虚拟机的窗口太小的调整办法,亲测有效
  20. 计算机毕业设计SSM大学生志愿者管理系统【附源码数据库】

热门文章

  1. Activity讲解(疯狂android)
  2. eoLinker-AMS接口管理系统 项目管理教程
  3. 第二天-03-安卓手机的入侵实验
  4. google colab使用入门
  5. 字符串搜索算法之Sunday
  6. Sentinel持久化
  7. 【Spring】Spring入门
  8. 关于HTTP请求 415错误
  9. 从网络访问此计算机guest密码,Windows XP网络共享访问总是弹出输入Guest密码对话框的解决...
  10. 把backtrader改造成金融强化学习回测引擎