MySQL索引资料总结

迈不过友情╰ 2021-09-22 08:00 407阅读 0赞

MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构。

  1. 本文是对一些讲解mysql数据库优秀文章的收集

索引类型

索引是在MYSQL的存储引擎层中实现的,而不是在服务层实现的。所以每种存储引擎的索引都不一定完全相同,也不是所有的存储引擎都支持所有的索引类型。MYSQL目前提供了一下4种索引。具体引擎对应索引如下:

link:三种引擎对应的四种索引说明


B-Tree 索引

B-Tree 索引:最常见的索引类型,大部分引擎都支持B树索引。下面文章详细地说明了mysql常用的B-tree索引的原理及其注意事项:

link:B-Tree索引的原理


B树和B+树的数据结构

B-Tree索引使用的是B-tree的数据结构,上面的文章已大概讲解到。具体的数据结构其一些B树的概念在下面文章提及。

B树数据结构详解

看完之后需要需要注意的是,B树的高度计算里面讲述错误。如下:

若B树某一非叶子节点包含N个关键字,则此非叶子节点含有N+1个孩子结点,(这里是错误的,N是指代一共有N个关键字,而N+1是最下面的叶子节点的最大数量,我这里的叶子节点指的是最下面那层节点的指针指向的那些空结点
如下:

我们可以得出:
因为根至少有两个孩子,因此第2层至少有两个结点。
除根和叶子外,其它结点至少有┌m/2┐个孩子,
因此在第3层至少有2*┌m/2┐个结点,
在第4层至少有2*(┌m/2┐^2)个结点,
在第 I 层至少有2*(┌m/2┐^(l-2) )个结点
考虑最后的叶子结点层第L层,因为整棵树一共有N个关键字,所以叶子结点层的结点个数最多为N+1,为什么是N+1呢?N个关键字排成一列可以有N+1个孩子结点,如果整颗树的孩子结点都是满的,即所有的孩子结点的指针都有指向下一个孩子。那么最后一层最后便是最多的N+1个结点。如果非叶子节点里面的指向孩子结点的指针没有满,即一些指向空结点,那么最后一层的孩子结点便会小于N+1。
所以2*(┌m/2┐^(L-2))≤N+1,也就是L层的结点最多为N+1个,即: L≤ log┌m/2┐((N+1)/2 )+2;
所以
当B树包含N个关键字时,B树的最大高度为L-1(因为计算B树高度时,我们最后一层实际的结点指向的空节点作为叶子结点,所以叶结点所在层不计算在内,应该减掉),即:L - 1 = log┌m/2┐((N+1)/2 )+1。
这才是正确的计算B树高度的方式。


最左前缀匹配及联合索引

注意,mysql一次查询最多只能用一个索引。
单索引不存在什么最左前缀匹配,如果单索引存在多个可用的索引,mysql会选择一个最严格(获得结果集记录数最少)的索引。

一、联合索引
下面是mysql里创建‘联合索引’的意义,看那些回答
link:为什么需要联合索引

二、最左前缀匹配
因为前面文章或多或少讲了一些最左前缀匹配的规则,下面是一些简单的例子:
link:匹配例子
里面的第二个例子要注意,索引不止看where语句,也和select相关,如果索引的值符合where+select涉及到的列同样也会使用索引。


慢查询优化

慢查询及查询速度太慢,通常是和最左前缀匹配有关,需要调整索引列或者索引列的顺序。
下面是美团点评技术团队的文章,里面的慢查询优化比较详细,里面的《MySQL索引原理》小节有点问题就不用看了。

link:慢查询优化


聚集索引

mysql的InnoDB引擎的表自身有一个主键作为索引,使用的就是聚集索引。
link:什么是聚集索引


Highlight

  1. mysql一次查询最多只能用一个索引。(Mysql5.0之后就可以用多个索引)
  2. 单索引如果存在多个可用的索引,mysql会选择一个最严格(获得结果集记录数最少)的索引。
  3. 建了一个(a,b,c)的复合索引,那么实际等于建了(a),(a,b),(a,b,c)三个索引
  4. 索引不止看where语句,也和select相关,如果索引的值符合where+select涉及到的列同样也会使用索引。
  5. InnoDB引擎的数据表自身就算是一个索引(主键),使用的就是聚集索引
  6. 请尽量在InnoDB上采用自增字段做主键。

Index merge

MySQL5.0之前,一个表一次只能使用一个索引,无法同时使用多个索引分别进行条件扫描。但是从5.1开始,引入了 index merge 优化技术,对同一个表可以使用多个索引分别进行条件扫描。
link : MySQL 优化之 index merge(索引合并)


附:

mysql引擎详解:
https://my.oschina.net/junn/blog/183341

发表评论

表情:
评论列表 (有 0 条评论,407人围观)

还没有评论,来说两句吧...

相关阅读

    相关 MYSQL索引总结

    MySQL索引 索引是存储引擎实现的,用于快速找到一条记录的一种数据结构。 索引的目的是为了提高数据查询的效率,让服务器快速地定位到表的指定位置,就像书的目录一样。对于数据

    相关 MySQL索引总结

    MySQL索引总结 1.索引的概念、作用与使用场景 本质上就是减少读写磁盘的次数。 索引是一种特殊的文件,包含这对数据表中所有记录的引用指针,可以对表中的一列或多

    相关 MySQL索引总结

    1.你真的懂索引吗? (1)索引定义以及使用误区 ​ 索引定义:索引(index)是高效获取数据的数据结构。本质上也是一种数据结构。 ​ 误区1:索引越多越好?

    相关 MySQL索引整理总结

    原文地址:[MySQL索引整理总结][MySQL] 1. 简介 索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。 举例说明

    相关 MySQL索引知识总结

    索引是存储引擎用于快速找到记录的一种数据结构。索引对于良好的性能非常关键。尤其是当表中的数据量越来越大时,索引对性能的影响越发重要。在数据量比较小且负载较低时,不恰当的索引对性

    相关 MySQL索引资料总结

    MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构。 本文是对一些讲解mysq