MyISAM与InnoDB的索引,究竟有什么差异?

数据库的索引分为主键索引Primary Inkex)与普通索引Secondary Index)。InnoDB和MyISAM是怎么利用B+树来实现这两类索引,其又有什么差异呢?这是今天要聊的内容。
 
一,MyISAM的索引
MyISAM的索引与行记录是分开存储的,叫做非聚集索引UnClustered Index)。
其主键索引与普通索引没有本质差异:
(1)有连续聚集的区域单独存储行记录;
(2)主键索引的叶子节点,存储主键,与对应行记录的指针;
(3)普通索引的叶子结点,存储索引列,与对应行记录的指针;
画外音:MyISAM的表可以没有主键。
 
主键索引与普通索引是两棵独立的索引B+树,通过索引列查找时,先定位到B+树的叶子节点,再通过指针定位到行记录。
 
举个例子,MyISAM:
t(id PK, name KEY, sex, flag);
 
表中有四条记录:

1, shenjian, m, A

3, zhangsan, m, A

5, lisi, m, A

9, wangwu, f, B

MyISAM与InnoDB的索引,究竟有什么差异?
其B+树索引构造如上图:
(1)行记录单独存储;
(2)id为PK,有一棵id的索引树,叶子指向行记录;
(3)name为KEY,有一棵name的索引树,叶子也指向行记录;
 
二、InnoDB的索引
InnoDB的主键索引与行记录是存储在一起的,故叫做聚集索引Clustered Index):
(1)没有单独区域存储行记录;
(2)主键索引的叶子节点,存储主键,与对应行记录(而不是指针);
画外音:因此,InnoDB的PK查询是非常快的。
 
因为这个特性,InnoDB的表必须要有聚集索引
(1)如果表定义了PK,则PK就是聚集索引;
(2)如果表没有定义PK,则第一个非空unique列是聚集索引;
(3)否则,InnoDB会创建一个隐藏的row-id作为聚集索引;
 
聚集索引,也只能够有一个,因为数据行在物理磁盘上只能有一份聚集存储。
 
InnoDB的普通索引可以有多个,它与聚集索引是不同的:
(1)普通索引的叶子节点,存储主键(也不是指针);
 
对于InnoDB表,这里的启示是:
(1)不建议使用较长的列做主键,例如char(64),因为所有的普通索引都会存储主键,会导致普通索引过于庞大;
(2)建议使用趋势递增的key做主键,由于数据行与索引一体,这样不至于插入记录时,有大量索引分裂,行记录移动;
 
仍是上面的例子,只是存储引擎换成InnoDB:
t(id PK, name KEY, sex, flag);
 
表中还是四条记录:

1, shenjian, m, A

3, zhangsan, m, A

5, lisi, m, A

9, wangwu, f, B

 
MyISAM与InnoDB的索引,究竟有什么差异?
其B+树索引构造如上图:
(1)id为PK,行记录和id索引树存储在一起;
(2)name为KEY,有一棵name的索引树,叶子存储id;
 
当:
select * from t where name=‘lisi’;
MyISAM与InnoDB的索引,究竟有什么差异?
会先通过name辅助索引定位到B+树的叶子节点得到id=5,再通过聚集索引定位到行记录。
画外音:所以,其实扫了2遍索引树。
 
三,总结
MyISAM和InnoDB都使用B+树来实现索引:
(1)MyISAM的索引与数据分开存储;
(2)MyISAM的索引叶子存储指针,主键索引与普通索引无太大区别;
(3)InnoDB的聚集索引数据行统一存储;
(4)InnoDB的聚集索引存储数据行本身,普通索引存储主键;
(5)InnoDB一定有且只有一个聚集索引;
(6)InnoDB建议使用趋势递增整数作为PK,而不宜使用较长的列作为PK;

,如何系统学习数据库知识体系?

 

腾讯技TDSQL术专家秦玮联手前58集团高级架构师陈东,打磨了一套数据库实战32讲》在线专栏课,帮你快速掌握数据库核心架构技术。

 

课题:《数据库实战32讲》
讲师秦玮、陈东
时间:8.30-9.1 三天,20:00开始
费用1.99(原价499粉丝福利价 1.99
名额:200名,先到先得
如何参加?

MyISAM与InnoDB的索引,究竟有什么差异?

扫码报名,耐心等待顾问老师通过

希望对大家的数据库学习有帮助。
阅读原文,了解更多。

发布者:糖太宗,转载请注明出处:https://www.qztxs.com/archives/science/technology/5945

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022年5月11日 下午8:52
下一篇 2022年5月11日 下午8:53

相关推荐

  • 真的痛,小小的IP,大大的耦合

    什么是耦合? 耦合,是架构中,本来不相干的代码、模块、服务、系统因为某些原因联系在一起,各自独立性差,影响则相互影响,变动则相互变动的一种架构状态。 感官上,怎么发现系统中的耦合? 作为技术人,每每在心中骂上下游,骂兄弟部门,“这个东西跟我有什么关系?为什么需要我来配合做这个事情?”。明明不应该联动,却要被动配合,就可能有潜在的耦合。 因为IP配置,导致上下...

    技术 2022年5月11日
    1700
  • 热力图生成算法及其具体实现

    目录 1. 概述 2. 详论 2.1. 数据准备 2.2. 准备绘制 2.3. 绘制热力范围 2.4. 绘制热力图 2.5. 配色方案 3. 问题 4. 参考 1. 概述 以前一直觉得热力图非常高大上,现在终于有机会研究并总结这个问题了。其实从图像处理的角度上来说,热力图生成算法并没有什么特别的,要得到非常漂亮的效果,数据以及配色方案的也很重要。这里就用Op...

    2022年5月22日
    10000
  • Linux基础

    看到什么记什么,没有顺序   Linux各个目录的作用及内容 / /处于Linux文件系统树形结构的最顶端,它是Linux文件系统的入口,所有的目录、文件、设备都在/之下。 /bin 该目录存放着系统最常用的最重要的命令,相当于DOS下的内部命令,只不过它们是以独立的文件形式存在。比如:ls、cp、mkdir等命令。这个目录中的文件都是可执行的并且...

    技术 2022年5月27日
    3600
  • Docker部署sonar

    0x00 前言 Sonar是一个用于代码质量管理的开源平台,用于管理源代码的质量,可以从七个维度检测代码质量。通过插件形式,可以支持包括java,C#,C/C++,PL/SQL,Cobol,JavaScrip,Groovy等等二十几种编程语言的代码质量管理与检测。   0x01 安装 获取 postgresql 的镜像 1 $ docker pul...

    技术 2022年6月1日
    2500
  • linux下批量重命名rename

    操作系统:Ubuntu 安装rename 1 # apt-get install rename -y   -n:打印效果但不执行 -v:执行修改并打印结果 s:替换,支持正则表达式 使用 替换文件名中的字符串,将test1替换为test2 renema -v ‘s/test1/test2’ *.md去掉文件名中的日期,格式2018-10-10ren...

    技术 2022年6月2日
    6300

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信