Mysql中联合索引的最左匹配原则(百度)
创建联合索引时列的选择原则
- 经常用的列优先(最左匹配原则)
- 离散度高的列优先(离散度高原则)
- 宽度小的列优先(最少空间原则)
在Mysql建立多列索引(联合索引)有最左前缀的原则,即最左优先。
如果我们建立了一个2列的联合索引(col1,col2),实际上已经建立了两个联合索引(col1)、(col1,col2);
如果有一个3列索引(col1,col2,col3),实际上已经建立了三个联合索引(col1)、(col1,col2)、(col1,col2,col3)。
解释
1、b+树的数据项是复合的数据结构,比如(name,age,sex)的时候,b+树是按照从左到右的顺序来建立搜索树的,比如当(张三,20,F)这样的数据来检索的时候,b+树会优先比较name来确定下一步的所搜方向,如果name相同再依次比较age和sex,最后得到检索的数据;但当(20,F)这样的没有name的数据来的时候,b+树就不知道第一步该查哪个节点,因为建立搜索树的时候name就是第一个比较因子,必须要先根据name来搜索才能知道下一步去哪里查询。
2、比如当(张三,F)这样的数据来检索时,b+树可以用name来指定搜索方向,但下一个字段age的缺失,所以只能把名字等于张三的数据都找到,然后再匹配性别是F的数据了, 这个是非常重要的性质,即索引的最左匹配特性。(这种情况无法用到联合索引)
mysql里创建联合索引的意义
一个顶三个
建了一个(a,b,c)的复合索引,那么实际等于建了(a),(a,b),(a,b,c)三个索引,因为每多一个索引,都会增加写操作的开销和磁盘空间的开销。对于大量数据的表,这可是不小的开销!
覆盖索引
同样的有复合索引(a,b,c),如果有如下的sql: select a,b,c from table where a=1 and b = 1。那么MySQL可以直接通过遍历索引取得数据,而无需回表,这减少了很多的随机io操作。减少io操作,特别的随机io其实是dba主要的优化策略。所以,在真正的实际应用中,覆盖索引是主要的提升性能的优化手段之一
索引列越多,通过索引筛选出的数据越少
有1000W条数据的表,有如下sql:select * from table where a = 1 and b =2 and c = 3,假设假设每个条件可以筛选出10%的数据,如果只有单值索引,那么通过该索引能筛选出1000W10%=100w 条数据,然后再回表从100w条数据中找到符合b=2 and c= 3的数据,然后再排序,再分页;如果是复合索引,通过索引筛选出1000w 10% 10% 10%=1w,然后再排序、分页,哪个更高效,一眼便知
列的离散性计算:count(distinct col)/ count(col)
例如:
id列一共9列都不重复 9/9 = 1
性别列一共9列只有(男或者女)两列 2/9 约等于0.2
离散性越高选择性越大
相关文章
- MySQL深度解析:BTree索引的优势和应用(b树mysql)
- 失败MySQL修复遇挫:解决之道(mysql使用中修复)
- MySQL:有没有可免费使用的选择?(mysql收费吗)
- 实现MySQL数据库快速检索:创建索引.(创建索引mysql)
- MySQL数据库之旅——借助导航猫一路前行(导航猫mysql)
- 深入理解MySQL主键和索引技术(mysql主键索引)
- MySQL排序的数字索引(mysql排序序号)
- MySQL中Limit来获取部分数据(mysql的limit)
- 索引优化21分钟,MySQL索引优化实现快速响应(21分钟mysql)
- 优化MySQL聚合索引优化技巧研究(mysql聚合索引)
- 什么MySQL中添加索引的命令详解(mysql添加索引命令是)
- 式索引MySQL索引:有效优化查询效率(mysql缩影)
- MySQL中的非唯一索引:它的特点及作用(mysql非唯一索引)
- MySQL查看数据库索引:简单易行方式(mysql查看数据库索引)
- MySQL下载之艰:缓慢而不可攀(mysql下载好慢)
- 建立MySQL组合索引以提升查询性能(mysql建组合索引)
- 如何解决MySQL不释放内存的问题?(mysql不释放内存)
- 如何使用MySQL建立联合索引?(mysql建联合索引吗)
- MySQL主主复制的不足之处(mysql主主复制缺点)
- MySQL索引:如何创建一个有效的索引(mysql索引如何创建)
- 如何使用MySQL创建复合索引:简单步骤解析(mysql建立复合索引)
- MySQL:利用位运算提高索引性能(mysql 位运算索引)
- 获取适用于32位系统的MySQL下载包(mysql下载32位)
- MySQL删除数据库用户:一步搞定(mysql删除数据库用户)
- MySQL 中 RET 的用法及其实现原理简介(mysql中ret的用法)
- MySQL的三种分页方式(mysql三种分页)
- MySQL限制禁止重复索引设计(mysql不能重复索引)
- MySQL索引问题无法创建索引的解决方法(mysql不能创建索引)
- 如何优化MySQL查询时不使用索引的情形(mysql不用索引情形)