MySQL---索引


索引:
提高读写效率的数据结构很多,这里我先给你介绍三种常见、也比较简单的数据结构,它们分别是哈希表、有序数组和搜索树。
    哈希表这种结构适用于只有等值查询的场景。哈希做区间查询的速度是很慢的。
    有序数组在等值查询和范围查询场景中的性能就都很好,局限是有序数组索引只适用于静态存储引擎。

基于主键索引和普通索引的查询有什么区别?
如果语句是 select * from T where ID=1,即主键查询方式,则只需要搜索 ID 这棵 B+ 树;
如果语句是 select * from T where k=5,即普通索引查询方式,则需要先搜索 k 索引树,得到 ID 的值为 1,再到 ID 索引树搜索一次。这个过程称为回表。

什么情况下会导致页分裂?会带来什么后果?
一个数据页满了,按照B+Tree算法,新增加一个数据页,叫做页分裂,会导致性能下降。空间利用率降低大概50%。当相邻的两个数据页利用率很低的时候会做数据页合并,合并的过程是分裂过程的逆过程。


 select * from T where k between 3 and 5,需要执行几次树的搜索操作,会扫描多少行?

这条 SQL 查询语句的执行流程:

在 k 索引树上找到 k=3 的记录,取得 ID = 300;

再到 ID 索引树查到 ID=300 对应的 R3;

在 k 索引树取下一个值 k=5,取得 ID=500;

再回到 ID 索引树查到 ID=500 对应的 R4;

在 k 索引树取下一个值 k=6,不满足条件,循环结束。

查询结果所需要的数据只在主键索引上有,所以不得不回表,有没有可能经过索引优化,避免回表过程呢?
覆盖索引,什么是覆盖索引?要查询的值已经在普通索引树上了。由于覆盖索引可以减少树的搜索次数,显著提升查询性能,所以使用覆盖索引是一个常用的性能优化手段。

联合索引:
第一原则是,如果通过调整顺序,可以少维护一个索引,那么这个顺序往往就是需要优先考虑采用的。
第二原则是空间


1、覆盖索引:如果查询条件使用的是普通索引(或是联合索引的最左原则字段),查询结果是联合索引的字段或是主键,不用回表操作,直接返回结果,减少IO磁盘读写读取正行数据
2、最左前缀:联合索引的最左 N 个字段,也可以是字符串索引的最左 M 个字符
3、联合索引:根据创建联合索引的顺序,以最左原则进行where检索,比如(age,name)以age=1 或 age= 1 and name=‘张三’可以使用索引,单以name=‘张三’ 不会使用索引,考虑到存储空间的问题,还请根据业务需求,将查找频繁的数据进行靠左创建索引。
4、索引下推:like 'hello%’and age >10 检索,MySQL5.6版本之前,会对匹配的数据进行回表查询。5.6版本后,会先过滤掉age<10的数据,再进行回表查询,减少回表率,提升检索速度

你可能感兴趣的:(MySQL)