MyISAM和InnoDB的区别
功能成本上看:
MyISAM读快,写慢,支持表锁不支持行锁,不支持事务和外键,支持全文索引
innodb相对而言写快,读慢,支持行锁、事务、外键,不支持全文索引
数据存储方式上来看:
MyISAM和InnoDB都使用B+树来实现索引:
(1)MyISAM的索引与数据分开存储;
(2)MyISAM的索引叶子节点存储指针,主键索引与普通索引无太大区别;都是非聚集索引
(3)InnoDB的聚集索引和行数据统一存储;
(4)InnoDB的聚集索引存储数据行本身,普通索引存储主键;
(5)InnoDB不宜使用较长的列作为PK;
(6)InnoDB普通索引可能存在回表查询,常见的解决方案是覆盖索引;
聚集索引和非聚集索引
MyISAM的索引与行记录是分开存储的,叫做非聚集索引(UnClustered Index)
其主键索引与普通索引没有本质差异:
(1)有连续聚集的区域单独存储行记录;
(2)主键索引的叶子节点,存储主键,与对应行记录的指针;
(3)普通索引的叶子节点,存储索引列,与对应行记录的指针;
InnoDB的主键索引与行记录是存储在一起的,故叫做聚集索引(Clustered Index)
(1)没有单独区域存储行记录;
(2)主键索引的叶子节点,存储主键,与对应行记录(而不是指针);
因为这个特性,InnoDB的表必须要有聚集索引:
(1)如果表定义了PK,则PK就是聚集索引;
(2)如果表没有定义PK,则第一个非空unique列是聚集索引;
(3)否则,InnoDB会创建一个隐藏的row-id作为聚集索引;
B+树
MyISAM和InnoDB都使用B+树来实现索引
B+树的特点是:
- 根节点和子节点都只保存关键字(索引字段),这样就可以降低树的高度,减少IO次数
- 只有叶子节点保存数据(主键索引的叶子节点保存行数据,其他索引叶子节点保存的是主键)
- 叶子节点上的数据是顺序存储的,节点之间还有引用关系(为排序和全表扫描提供更好的查询性能)
注意点: 建议使用自增id作为主键
原因参考第3点,如果使用趋势递增主键,插入记录时,不会索引分裂,不会大量行记录移动。
索引覆盖
在一张索引表上就可以查出想要的结果就是索引覆盖
比如在innodb引擎中,执行sqlselect id,name,age from user
,这张表刚好建立了name+age的联合索引,那边在索引中可以直接查出结果,无需回表到聚集索引中再去查。
网友评论