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

MyISAM和InnoDB索引有什么区别?_0

时间:2023-03-13 03:38:26 科技观察

数据库索引分为主键索引(PrimaryInkex)和普通索引(SecondaryIndex)。InnoDB和MyISAM是如何使用B+树来实现这两类索引的,有什么区别?这就是我今天要讲的内容。1.MyISAM索引MyISAM索引和行记录分开存储,称为非聚集索引(UnClusteredIndex)。主键索引和普通索引没有本质区别:有一个连续的聚合区,单独存储行记录;主键索引的叶节点存储主键,以及指向对应行记录的指针;普通索引的叶子节点存放索引列,以及对应行的Record指针;画外音: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的索引树,叶子指向行记录;name为KEY,有name的索引树,leaves也指向行记录;2.InnoDB索引InnoDB的主键索引和行记录存储在一起,所以称为聚集索引(ClusteredIndex):没有单独的区域来存储行记录;主键索引的叶子节点存储主键,以及对应的行记录(而不是指针);画外音:因此,InnoDB的PK查询是非常快的。因为这个特性,InnoDB的表必须有聚簇索引:如果表定义了PK,那么PK就是聚簇索引;如果表没有定义PK,第一个非空唯一列是聚集索引;否则,InnoDB将创建一个隐藏的row-id作为聚集索引;只能有一个聚簇索引,因为数据行在物理磁盘上只能有一个聚簇存储。InnoDB的普通索引可以有多个,与聚簇索引不同的是:普通索引的叶子节点存放的是主键(不是指针);对于InnoDB表,这里的启示是:不建议使用较长的列作为主键,例如char(64),因为所有普通索引都会存储主键,这会导致普通索引太大的;推荐使用具有递增趋势的键作为主键。由于数据行和索引是一体的,所以插入记录时不会造成大量的索引分裂。行记录运动;还是上面的例子,只是存储引擎换成了InnoDB:t(idPK,nameKEY,sex,flag);表中还有4条记录:1、shenjian、m、A3、zhangsan、m、A5、lisi、m、A9、wangwu、f、B,其B+树索引结构如上图:id为PK,行记录和id索引树存储在一起;name为KEY,有name的索引树,叶子存放id;当:选择*fromtwherename='lisi';它会先通过name辅助索引定位到B+树的叶子节点得到id=5,再通过聚簇索引定位到行记录。画外音:所以,实际上,索引树被扫描了两次。3、小结MyISAM和InnoDB都是使用B+树来实现索引的:MyISAM索引和数据是分开存储的;MyISAM索引留下存储指针,主键索引与普通索引没有太大区别;InnoDB的聚簇索引和数据行统一存储;InnoDB聚簇索引存储数据行本身,普通索引存储主键;InnoDB必须只有一个聚簇索引;InnoDB推荐使用趋势递增的整数作为PK,不宜使用较长的列作为PK;【本文为专栏作者《58神剑》原创稿件,转载请联系原作者】点此查看该作者更多好文