MySQL索引原理详解, 何时失效

1. 索引的本质是什么

索引的本质是一种排好序的数据结构。

它就好比字典中的目录。

 

2. 索引的分类

索引的分类要看是什么维度。

如果是从数据库功能的维度来划分的,如下:

索引类型 详细描述
普通索引 create index index_name on table(column);
唯一索引 索引列的值必须唯一(可以为空) create unique index index_name on table(column);
主键索引 特殊的唯一索引,不允许为空 PK
组合索引 在多个字段上创建索引,遵循最左前缀原则。alter table t add index index_name(a,b,c);
全文索引 用来查找文本中的关键字

如果是从数据结构的维度来划分的,如下:

  • Hash 索引
    Hash 索引是比较常见的一种索引,他的单条记录查询的效率很高,时间复杂度为1。
    但是,Hash索引并不是最常用的数据库索引类型,尤其是我们常用的Mysql Innodb引擎就是不支持hash索引的
因为存储引擎都会为每一行计算一个hash码,hash码都是比较小的,
并且不同键值行的hash码通常是不一样的,hash索引中存储的就是Hash码,
hash 码彼此之间是没有规律的,且 Hash 操作并不能保证顺序性,
所以值相近的两个数据,Hash值相差很远,被分到不同的桶中。


  • 二叉树

一个节点只能有两个子节点。即度不超过2
二叉树的时间复杂度为 O(n)
左子节点 小于 本节点,右子节点 大于 本节点

二叉树的特点:
磁盘的IO由树高决定


  • B树(二三树)

B树的结构每个节点中不仅包含数据的 key 值,还有 data 值

见下图


B树结构

如果 data 比较大,会导致每个节点的 key 存储的较少,
当数据量较大的时候,同样会导致B树很深,从而增加了磁盘 IO 的次数,进而影响查询效率。


  • B+树

MySQL 中最常用的索引的数据结构是 B+ 树,它有以下特点:

1. 在 B+ 树中,所有数据记录节点都是按照键值的大小存放在同一层的叶子节点上,
    而非叶子结点只存储key的信息,这样可以大大减少每个节点的存储的key的数量,降低B+ 树的高度

2. B+ 树叶子节点的关键字从小到大有序排列,左边结尾数据都会保存右边节点开始数据的指针。

3. B+ 树的层级更少:相较于 B 树 B+ 每个非叶子节点存储的关键字数更多,
    树的层级更少所以查询数据更快

4. B+ 树查询速度更稳定:B+ 所有关键字数据地址都存在叶子节点上,
    所以每次查找的次数都相同所以查询速度要比B树更稳定;

5. B+ 树天然具备排序功能:B+ 树所有的叶子节点数据构成了一个有序链表,
    在查询大小区间的数据时候更方便,数据紧密性很高,缓存的命中率也会比B树高。

6. B+ 树全节点遍历更快:B+ 树遍历整棵树只需要遍历所有的叶子节点即可,
     而不需要像 B 树一样需要对每一层进行遍历,这有利于数据库做全表扫描。

关于B+树的详细介绍可以查看我的另一篇博客:
https://www.cnblogs.com/davidgu/p/14526659.html

 

3. 何时使用索引

MySQL每次查询只使用一个索引。
与其说是“数据库查询只能用到一个索引”,倒不如说,和全表扫描比起来,
去分析两个索引B+树更加耗费时间。

所以where A=a and B=b这种查询使用(A,B)的组合索引最佳,
B+树根据(A,B)来排序。

使用索引的场景:

a. 主键,unique字段
b. 和其他表做连接的字段需要加索引
c. 在where里使用>,≥,=,<,≤,is null和between等字段
d. 使用不以通配符开始的like,where A like 'China%'
e. 聚集函数MIN(),MAX()中的字段
f. order by和group by字段

 

4. 何时不使用索引

不使用索引的场景:

a. 表记录太少
b. 数据重复且分布平均的字段(只有很少数据值的列)
c. 经常插入、删除、修改的表要减少索引
d. text,image等类型不应该建立索引,这些列的数据量大
    假如text前10个字符唯一,也可以对text前10个字符建立索引
e. MySQL能估计出全表扫描比使用索引更快时,不使用索引

 

5. 索引何时失效

索引失效的场景:

a. 组合索引未使用最左前缀,例如组合索引(A,B),where B=b不会使用索引
b. like未使用最左前缀,where A like '%Sheep'
c. 搜索一个索引而在另一个索引上做order by,where A=a order by B,
    只使用A上的索引,因为查询只使用一个索引
d. or会使索引失效。如果查询字段相同,也可以使用索引。
    (eg: where A=a1 or A=a2(生效),where A=a or B=b(失效))
e. 如果列类型是字符串,要使用引号
    (eg: where A='Sheep',否则索引失效(会进行类型转换))
f. 在索引列上的操作,函数(upper()等)、or、!=(<>)、not in等

 

6. explain语句显示结果关键字解释

关键字 解释
ALL 全表扫描
index 索引全扫描
range 索引范围扫描,常用语<,<=,>=,between等操作
ref 使用非唯一索引扫描或唯一索引前缀扫描,返回单条记录,常出现在关联查询中
eq_ref 类似ref,区别在于使用的是唯一索引,使用主键的关联查询
const/system 单条记录,系统会把匹配行中的其他列作为常数处理,如主键或唯一索引查询
null MySQL不访问任何表或索引,直接返回结果
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容