Mysql优化系列之索引(index)

一、简介

  • 什么是索引?
    Mysql官方定义:索引(index)是帮助Mysql高效获取数据的 排好序数据结构
    简单来说,可以理解为:索引是数据结构。

  • 为什么要使用索引?
    MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车。

二、索引的数据类型

上面介绍索引知道了索引就是数据结构,那么,我们都知道,数据结构有:hash表,二叉树,红黑树,B-Tree,B+树等
例如有如下表数据:

col1 col2
1 34
2 77
3 5
4 91
5 22
6 89
7 23

那么有一条sql查询语句:

select * from table where col2 = 89;
二叉树

那么使用二叉树查询如下(col2创建索引的情况下):


二叉树索引结构

根据二叉树的类型(右边节点的值大于父节点的值)可以推论,从根节点 34 开始,需要进行两次的磁盘I/O操作,就可以查询到二叉树的key和value,key存的是89这个值,value是“0x77”,也就是该条数据所对应的磁盘文件指针。然后再根据磁盘指针“0x77”,可以查找到该行 col1=6,col2=89所对应的数据结果。
如果说col2的值比较大,表数据又比较多,那可能就需要N次磁盘I/O操作才能查询到数据,效率比较低。
再比如:把col1增加索引,col1为自增列的情况下,

select * from table where col1 = 6;

那么二叉树的结果为:


col1为索引的二叉树

因为是自增列,所以右边节点的值会一直大于父节点,最终变成这样的单边增长树。那么在执行上面的sql查询语句,会经过6次磁盘I/0操作。

所以二叉树不适合mysql的索引数据结构。

红黑树

同样的,把col1增加索引,col1为自增列的情况下,

select * from table where col1 = 6;

那么红黑树的结果为:

红黑树

从图中可以看出来,需要三次操作就能找到 col1=6的节点。由于数据量比较少,所以查询比较快。如果有几十上百万的数据,那么就容易造成树的节点比较深,导致树的高度不可控,所以红黑树不适合mysql的索引数据结构。

B+树

在mysql中,索引用到的是 B+树,B+Tree的高度是可控的,mysql通常是3到5层。注意:B+Tree只在最末端叶子节点存数据,叶子节点是以双向链表的形势互相指向的。
使用B+树结构存储的优点:

  • 非叶子节点不存储data,只存储索引(冗余),可以放更多的索引
  • 叶子节点包含所有索引字段
  • 叶子节点用指针连接,提高区间访问的性能
B+树示例图
b+树性质
  • 索引字段要尽量的小
    我们知道I/O次数取决于b+数的高度h,假设当前数据表的数据为N,每个磁盘块的数据项的数量是m,则有h=㏒(m+1)N,当数据量N一定的情况下,m越大,h越小;而m = 磁盘块的大小 / 数据项的大小,磁盘块的大小也就是一个数据页的大小,是固定的,如果数据项占的空间越小,数据项的数量越多,树的高度越低。这就是为什么每个数据项,即索引字段要尽量的小,比如int占4字节,要比bigint8字节少一半。这也是为什么b+树要求把真实的数据放到叶子节点而不是内层节点,一旦放到内层节点,磁盘块的数据项会大幅度下降,导致树增高。当数据项等于1时将会退化成线性表。
  • 索引的最左匹配特性(即从左往右匹配)
    当b+树的数据项是复合的数据结构,比如(name,age,sex)的时候,b+数是按照从左到右的顺序来建立搜索树的,比如当(张三,20,F)这样的数据来检索的时候,b+树会优先比较name来确定下一步的所搜方向,如果name相同再依次比较age和sex,最后得到检索的数据;但当(20,F)这样的没有name的数据来的时候,b+树就不知道下一步该查哪个节点,因为建立搜索树的时候name就是第一个比较因子,必须要先根据name来搜索才能知道下一步去哪里查询。比如当(张三,F)这样的数据来检索时,b+树可以用name来指定搜索方向,但下一个字段age的缺失,所以只能把名字等于张三的数据都找到,然后再匹配性别是F的数据了, 这个是非常重要的性质,即索引的最左匹配特性。

hash

在mysql中,创建索引,也可以使用hash表,


创建hash索引

mysql会对hash索引创建一个hash值对应的表,每一个索引字段对应一个hash值
如果在查询语句执行的时候,

select * from table where col2 = 49;

索引为hash索引,则mysql会对sql语句进行优化,mysql底层自己的hash算法,所以hash索引查询会非常快,速度会比BTree还快。

select * from table where col2 = hash(49);

hash特点:

  • 哈希索引只包含哈希码和指针,不存储数据字段值
  • 哈希索引数据并不是按循序存储的,因此无法用于排序
  • 因为要通过查询值计算确定的哈希码,所以哈希索引不支持部分匹配,不支持范围查找,只支持等值比较查询
  • 当哈希冲突很多的时候,效率会降低
    基于以上特点,所以mysql中最常见的索引,都使用的是B+树索引。

三、索引的优缺点

  • 优点:可以快速检索,减少I/O次数,加快检索速度;根据索引分组和排序,可以加快分组和排序;
  • 缺点:索引本身也是表,因此会占用存储空间,一般来说,索引表占用的空间的数据表的1.5倍;索引表的维护和创建需要时间成本,这个成本随着数据量增大而增大;构建索引会降低数据表的修改操作(删除,添加,修改)的效率,因为在修改数据表的同时还需要修改索引表;
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,186评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,858评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,620评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,888评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,009评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,149评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,204评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,956评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,385评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,698评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,863评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,544评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,185评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,899评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,141评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,684评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,750评论 2 351

推荐阅读更多精彩内容