数据库索引(一)

数据库索引意在提升检索效率。
通过创建唯一索引可以保证数据库表中每一行数据的唯一性。排序后可以将随机的I/O转换成顺序I/O。

索引是如何提高检索速度的?
将无序的数据存储转为相对有序的数据。

索引为什么不是越多越好?

  1. 对表中的数据进行insert/update/delete时,索引需要动态维护,占用时间。
  2. 索引建立后需要占用存储空间,如果是聚簇索引,占用的存储空间更大。

MySQL数据库主要使用的两种数据结构

  1. 哈希索引


    image.png

    (图片来源于网络,侵删)
    哈希索引检索速度很快,但是也存在一定的局限性:
    1)哈希索引没有办法利用索引完成排序
    2)有重复键值的情况下,会发生哈希碰撞,索引效率较低
    3)不支持范围查询
    4)不支持最左匹配原则

  2. B+Tree索引


    image.png

    (图片来源于网络,侵删)
    每一页存在一个record_type:
    0:普通的用户记录
    1:目录项记录
    2:最小记录
    3:最大记录
    目录项记录只有主键值和页的编号两个列,而普通的用户记录的列是用户自己定义的(Innodb为列,MyISAM的叶子节点存储记录的指针),可能包含很多列,另外还有InnoDB自己添加的隐藏列。

Innodb和MySIAM实现B+Tree的方式:聚簇索引 & 非聚簇索引


image.png

(图片来源于网络,侵删)

聚簇索引:
叶子节点存储了完整的用户记录
在Innodb中,会自动创建聚簇索引,聚簇索引就是数据的存储方式。一张表有且仅有一个聚簇索引。
1)如果表定义了PK,则PK就是聚簇索引
2)如果表没有定义PK,则第一个not NULL unique列就是聚簇索引
3)否则,Innodb会创建一个隐藏的row-id作为聚簇索引

普通索引(二级索引,辅助索引,非聚簇索引)
对于Innodb来说二级索引的叶子节点存放的是索引列的值与主键
MyISAM因为存放的全是主键和行号,意味着MyISAM中建立的索引全部都是二级索引,那么MyISAM均需要回表查询。

索引覆盖
explain查询计划优化,即explain的输出结果Extra字段为Using index时,能够触发索引覆盖。
只需要在一棵索引树上就能获取SQL所需的所有列数据,无需回表,速度更快。
常见的方法是:将被查询的字段,建立到联合索引里去。
哪些情况可以利用索引覆盖来优化SQL:
1)全表count查询优化
2)列查询回表优化
3)分页查询

复合索引的范围查询与最左原则:

  1. SQL语句中where子句中范围查询之后的列无法使用联合索引
  2. 在mysql建立联合索引时会遵循最左前缀匹配的原则,即最左优先,在检索数据时从联合索引的最左边开始匹配
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,519评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,842评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,544评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,742评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,646评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,027评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,513评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,169评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,324评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,268评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,299评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,996评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,591评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,667评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,911评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,288评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,871评论 2 341

推荐阅读更多精彩内容

  • 索引 数据库中的查询操作非常普遍,索引就是提升查找速度的一种手段 索引的类型 从数据结构角度分 1.B+索引:传统...
    一凡呀阅读 2,851评论 0 8
  • MySql数据库索引原理 写在前面:索引对查询的速度有着至关重要的影响,理解索引也是进行数据库性能调优的起点。考虑...
    琴匣自鸣阅读 1,676评论 0 2
  • 聚簇索引并不是一种单独的索引类型,而是一种数据存储方式。比如,InnoDB的聚簇索引使用B+Tree的数据结构存储...
    sherlock_6981阅读 1,856评论 0 2
  • 聚簇索引并不是一种单独的索引类型,而是一种数据存储方式。比如,InnoDB的聚簇索引使用B+Tree的数据结构存储...
    大头8086阅读 17,452评论 7 40
  • 去昆士兰大学游学是我第一次出国,想象中的文化休克从我踏上这片土地直至离开却并没有发生。除了住家们听到我想喝开水而不...
    笨NANA阅读 147评论 0 0