mysql索引一

首先mysql选择B+Tree作为存储数据结构,左闭合区间的B+Tree

一平衡二叉树一个节点存储数据太少,树的高度太大会导致需要需要搜索多次才能找到要查找的值。

B+Tree有一下几个有点

非叶子节点不存储data,只存储key,可以增大度,所以索引的值越小越好

叶子节点不存储指针

顺序访问指针,提高区间访问性能,将随机的io变成了顺序io。

mysql的两个主要索引结构

 

下面一个图是mysql数据库的基本架构

 联合索引创建的原则

1、最常用列,最左匹配原则

2、离散度高的列,选择性原则

3、最小的列,最少空间原则

联合索引和单索引不要重合完全是浪费空间

如果查询列可以通过索引节点中的关键字返回结果就称为覆盖索引,例如联合索引中a,b,c 搜索时使用where a and b

索引创建有如下几条原则

索引列的长度越小越好

索引不一定是越多越好,越全越好,一定要合适

like 99%可能可以用到索引,根据离散度不一样结果不同, like %99% like %99无法用到索引

where中not in 和不等于无法使用索引

多用指定列查询,只返回自己想要的数据列,无法使用索引

联合索引如果不是从最左列查找无法使用索引

联合索引中如果最左列精确匹配并范围匹配另外一列可以使用索引

联合索引中如果某列范围匹配,则其右边列无法使用索引。

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,然后再排序、分页,哪个更高效,一眼便知

猜你喜欢

转载自www.cnblogs.com/xiaofeiyang/p/11823584.html