关于索引(2)

  • 1.什么是聚簇索引?

不是一种单独的索引方式,而是一种数据存储方式,innoDB的聚簇索引实际上在同一个结构中保存了B-tree索引和数据行;

当表有聚簇索引时,它的数据行实际上存放在索引的叶子页上,叶子页包含了行的全部数据,而节点页只包含索引列;"聚簇"表示数据行和相邻的键值紧凑地存储在一起,因为无法同时把数据行存放在两个不同的地方,所以一个表只能有一个聚簇索引,类似于oracle的索引组织表;
下图便展示了mysql的Innodb主键索引的原理图:


主键索引的原理图.png

在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶子页节点data域保存了完整的数据记录,这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引,所以必须有主键,也就是说innoDB通过主键聚集数据,如果没有显示定义,innoDB会选择一个唯一的非空索引代替.如果没有这样的索引,innoDB会隐式定义一个主键来作为聚簇索引.

  • 2.聚簇索引的优点和缺点
    优点:
    1 .可以把相关的数据保存在一起;比如根据用户ID来聚集邮件数据;
    2.数据访问更快,聚簇索引将索引和数据保存在同一个B-tree中,因此聚簇索引中获取数据通常比在非聚簇索引中查找要快。
    3.使用覆盖索引(索引列和查询列一致)扫描的查询可以直接使用聚簇索引页节点中的主键值;
    缺点:
    1.聚簇数据最大限度地提高了I/O密集型应用的性能,但如果数据全部都放在内存中,则访问的顺序就没那么重要了;
    2.插入速度严格依赖于插入顺寻,按照主键的顺序插入是加载到innodb;如果不是按照主键顺序加载数据,那么加载完成后最好使用OPTIMIZE TABLE TABLENAME命令重新组织一下表。
    3.更新聚簇索引列的代价很高,因为会强制innodb将每个被更新的行移动到新的位置。
    4.基于聚簇索引的表在插入新行,或者主键被更新导致需要移动行的时候,可能面临“页分裂”的问题.当行的主键值要求必须将这一行插入到某个已满的页中时,存储引擎会将该页分裂成两个页面来容纳该行,这就是一次页分裂操作,页分裂会导致表占用更多的磁盘空间;
    5.聚簇索引可能导致全表扫描变慢,尤其是行比较疏松,或者由于页分裂导致数据存储不连续的时候;
    6.二级索引(非聚簇索引) 可能比想象的要更大,因为在二级索引的叶子节点包含了引用行的主键列;二级索引访问需要两次索引查找,而不是一次;

不应该适用二级索引,应该使用hash索引;

  • 3.MyISAM支持的索引
    MyISAM是按照数据插入的顺序存储在磁盘上的,叶子节点存储数据行的指针引用,隐藏了行的物理细节 ,只显示索引中的节点,索引中的每个叶子节点包含了具体行的指针引用。其原理如图所示:


    MyISAM支持的索引.png

    由此可得出:MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址;

  • 4.InnoDB和MyISAM的二级索引
    innoDB二级索引的叶子节点中存储的不是“行指针”,而是主键值,并以此作为指向行的指针,如图所示:

    InnoDB主键索引与二级索引示意图.png

    这样做有什么好处嘞?
    这样就减少了出现当行移动或者数据页分裂时二级索引的维护工作,使用主键值当作指针会让二级索引占用更多的空间,但是,在移动行时无需更新二级索引中的这个主键值呀。
    解释下页分裂:页是InnoDB存储引擎管理数据库的最小磁盘单位,类型为B-Tree 节点的页,存放的即是表中行的实际数据了,InnoDB中的页大小为16KB,负载因子是15,且不可以更改,当超过这个数据就会进行页分裂,且分裂时InnoDB一般会记录下一个页的数据信息。
    页分裂带来的问题:页会变得稀疏且被不规则的填充,导致最终数据碎片化。
    解决:OPTIMIZE TABLE 来重建表并优化页的填充。

  • 5.MyISAM的二级索引
    MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key是可以重复的,如图所示:


    MyISAM二级索引.png

    这样相对于使用B+的InnoDB可通过辅助索引快速找到所有的数据,而不需要再遍历一边主键索引,所以适用于OLAP。

以上便是对索引的相关补充,后续将会对索引优化继续展开书写...

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

推荐阅读更多精彩内容