当前位置: 首页 > 科技观察

1分钟搞懂MyISAM和InnoDB的索引区别

时间:2023-03-12 01:14:15 科技观察

《数据库索引,到底是什么做的?》介绍B+树,这是一种非常适合数据库索引的数据结构:(1)非常适合磁盘存储,可以充分利用局部性原理,磁盘预读;(2)树高极低,可存储大量数据;(3)索引本身占用的内存很小;(4)可以很好地支持单点查询、范围查询、有序查询;主键索引(PrimaryInkex)和普通索引(SecondaryIndex)。InnoDB和MyISAM是如何使用B+树来实现这两类索引的,有什么区别?这就是我们今天要讨论的内容。1.MyISAM索引MyISAM索引和行记录分开存储,称为非聚集索引(UnClusteredIndex)。主键索引和普通索引没有本质区别:主键索引的叶子节点在连续聚合的区域单独存放行记录,存放主键,对应行记录的指针叶子普通索引的节点存储索引列,以及对应的行记录指针画外音:MyISAM表可以没有主键。主键索引和普通索引是两个独立的索引B+树。通过索引列查找时,先定位到B+树的叶子节点,再通过指针定位到行记录。例如,MyISAM:t(idPK,nameKEY,sex,flag);表中有4条记录:1、shenjian、m、A3、zhangsan、m、A5、lisi、m、A9、wangwu、f、B及其B+树索引的结构如上图所示:行记录单独存储,id为PK,有id为索引树,叶子为KEY指向行记录名,有索引树为name,叶子也指向行记录2.InnoDB索引InnoDB主键索引是和行记录一起存储的,所以称为聚集索引(ClusteredIndex):没有单独的区域来存储行记录的叶子节点主键索引,主键被存储,而对应的行记录(而不是指针)画外音:因此,InnoDB的PK查询非常快。因为这个特性,InnoDB的表必须有聚簇索引:(1)如果表定义了PK,那么PK就是聚簇索引;(2)如果表没有定义PK,则第一个非空唯一列为聚集索引;(3)否则,InnoDB会创建一个hiddenrow-id作为聚集索引;只能有一个聚簇索引,因为数据行在物理磁盘上只能有一个聚簇存储。InnoDB的普通索引可以有多个,这与聚簇索引不同的是:普通索引的叶子节点存放的是主键(不是指针)。对于InnoDB表,这里的启发是:(1)不建议使用较长的列来做主键,比如char(64),因为所有的普通索引都会存储主键,这会导致普通索引太大;(2)推荐使用有递增趋势的键作为主键,因为数据行和索引是一体的,不容易插入记录。存在大量索引拆分和行记录移动;上面的例子还是一样,只是存储引擎换成了InnoDB:t(idPK,nameKEY,sex,flag);表中还有4条记录:1,shenjian,m,A3,zhangsan,m,A5,lisi,m,A9,wangwu,f,B的B+树索引结构如上图:id为PK,行record和id索引树存储在一起,name为KEY,有name的索引树,leaf存储idwhen:select*fromtwherename='lisi';它会先通过name辅助索引定位到B+树的叶子节点得到id=5,再通过聚簇索引定位到行记录。画外音:所以,实际上,索引树被扫描了两次。3.总结MyISAM和InnoDB都是使用B+树来实现索引的:MyISAM索引和数据是分开存储的。MyISAM索引留下存储指针。主键索引与普通索引没有太大区别。InnoDB的聚簇索引和数据行是统一存储的。InnoDB的聚集索引存储数据行本身,普通索引存储主键。InnoDB必须有并且只有一个聚簇索引。InnoDB推荐使用趋势递增的整数作为PK,而不是使用更长的列作为PK。联系原作者】点此阅读作者更多好文