深入浅出mysql索引

索引常见模型:

哈希表:适用于等值查询,区间查询速度很慢

有序数组:等值,区间查询性能优秀,适用与静态搜索引擎。 (更新成本高)

搜索树:N叉树应用为主(减少树高和磁盘交互次数),InnoDB B+树。

其他:跳表,LSM树等

哈希表结构

哈希表是一种以键 - 值(key-value)存储数据的结构,我们只要输入待查找的值即 key,就可以找到其对应的值即 Value。哈希的思路很

简单,把值放在数组里,用一个哈希函数把 key 换算成一个确定的位置,然后把 value 放在数组的这个位置。

不可避免地,多个 key 值经过哈希函数的换算,会出现同一个值的情况。处理这种情况的一种方法是,拉出一个链表

深入浅出mysql索引

哈希表示意图

深入浅出mysql索引

有序数组示意图

深入浅出mysql索引

二叉搜索树示意图

InnoDB 的索引模型

每一个索引在 InnoDB 里面对应一棵 B+ 树。

深入浅出mysql索引

InnoDB 的索引组织结构

主键索引的叶子节点存的是整行数据,也叫聚簇索引(InnoDB中)

非主键索引的叶子节点内容是主键的值。

基于非主键索引的查询需要多扫描一棵索引树。因此,我们在应用中应该尽量使用主键查询。

自增主键的插入数据模式,正符合了我们前面提到的递增插入的场景。每次插入一条新记录,都是追加操作,都不涉及到挪动其他记录,也不会触发叶子节点的分裂。

主键长度越小,普通索引的叶子节点就越小,普通索引占用的空间也就越小

所以自增主键往往是合理的选择。

重建索引的过程会创建一个新的索引,把数据按顺序插入,这样页面的利用率最高,索引更紧凑,更省空间。

主键索引只能重新建表才能重建索引。(钱的教训)删除数据,索引还在,索引树还是会很大。

覆盖索引

由于覆盖索引可以减少树的搜索次数,显著提升查询性能,所以使用覆盖索引是一个常用的性能优化手段。

如果现在有一个高频请求,要根据市民的身份证号查询他的姓名,这个联合索引就有意义了。它可以在这个高频请求上用到覆盖索引,不再需要回表查整行记录,减少语句的执行时间。

当然,索引字段的维护总是有代价的。因此,在建立冗余索引来支持覆盖索引时就需要权衡考虑了。这正是业务 DBA,或者称为业务数据架构师的工作。

最左前缀原则

这个最左前缀可以是联合索引的最左 N 个字段,也可以是字符串索引的最左 M 个字符。

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

索引下推

而 MySQL 5.6 引入的索引下推优化(index condition pushdown), 可以在索引遍历过程中,对索引中包含的字段先做判断,直接过滤掉不满足条件的记录,减少回表次数

\tmysql> select * from tuser where name like '张 %' and age=10 and ismale=1;
深入浅出mysql索引

无索引下推执行流程

深入浅出mysql索引

索引下推执行流程


分享到:


相關文章: