首页 > 技术文章 > Mysql的学习整理(2)

chsblog 2021-11-08 11:18 原文

这里介绍下比较常见的索引底层实现。

Hash索引

基于哈希表实现,只有精确匹配索引所有列的查询才有有效。对于每一个行数据都会计算得出一个hash code,并且将所有哈希码保存在索引中,并且索引表中保存指向每个数据行的指针。

B-Tree索引

B-Tree能加快数据访问,因为存储引擎不用访问全表索引。只需要扫描各个节点,因为数据分布在各个节点中。

B+Tree索引(Mysql)

是B-Tree的改进版本,数据都在叶子节点上,并且增加了顺序访问的指针,每个叶子节点都指向相邻的叶子节点。对于B+树来说,进行范围查找只需要查找两个节点进行遍历即可。而B-树需要遍历所有节点,相比之下B+效率更高。

它的性质:

n棵子tree的节点包含n个关键字,不用来保存数据而是保存数据的索引。

所有的叶子节点包含着全部关键字的信息,及指向这些关键字记录的指针,且叶子结点本身依关键字的大小自大而小顺序连接。

所有的非终端结点可以看成索引部分,结点中仅含其子树中的最大或最小关键字。

B+树中,数据对象的插入和删除在叶子节点进行

B+树有两个头指针,一个是树的根节点,一个最小关键码的叶节点。

 

 

一些索引需要注意的原则和事项。

Mysql的最左前缀原则

最左前缀原则就是最左优先,在创建多列索引时,根据业务需求,where子句使用中最频繁的一列放在最左边。

mysql会一直向右匹配到遇到范围查询(<,>,between,like)就停止,比如a=1 and b=2 and c>3 and d =4如果建立此(abcd)顺序的索引,d是用不到的。如果建立abcd都可以用到的索引 ,那他们位置就可以调换。

=和in可以乱序,比如a=1 and 吧b =2 and c=3建立abc索引可以任意顺序。

 

创建需要注意的原则?

非空字段:应该指定为Not Null,除非你想存储Null。在mysql中,含有空值的列表很难进行查询优化,因为它们使得索引。索引的统计值变得更复杂,应该用0、一个特殊的值或者一个空串代替。

取值离散大的字段:(变量各个取值之间的差异程度)的列放到联合索引的前面,可以通过count()函数查看字段的差异值,返回值越大说明字段的唯一值越多的字段离散程度高。

索引字段越小越好:数据库的数据存储以页为单位,一页存储的数据越多一次IO操作获取饿数据效率越高。

 

 

索引失效的情况

1.使用!=或者<>导致索引失效

2.类型不一致导致索引失效

3.函数导致的索引失效

4.运算导致的索引失效

如:SELECT *FROM* 'user' WHERE age - 1=20 。你对列进行了(+-*/!)都不会走索引

5.OR引起索引失效。(在特定情况下才会导致索引失效,并不是所有都会,如果OR连接的是同一个字段,那么索引不会失效,反之会失效)

6.模糊搜索导致的索引失效。

7.NOT IN.NOT EXISTS导致索引失效

 

推荐阅读