1、区别
MyisAm | Innodb |
---|---|
非聚集 | 聚集 |
可以没有主键 | 必须有主键 |
表级锁 | 行级锁(针对索引) |
data域存的是数据项的地址 | data域存的是数据本身 |
不支持事务 | 支持事务 |
支持全文索引 | 不支持全文索引 |
保存表的总行数(带where时失效,有索引走索引) | 逐行扫描获取总数(有索引也走索引) |
InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,innoDB才使用行级锁,否则InnoDB将使用表锁,在实际开发中应当注意。
通过聚集索引可以查到需要查找的数据, 而通过非聚集索引可以查到记录对应的主键值 , 再使用主键的值通过聚集索引查找到需要的数据
2、innodb为什么要用自增id作为主键:
如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。
如果使用非自增主键(如果身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页中间的某个位置,导致其他数据频繁的移动到其他页中、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,后续不得不通过OPTIMIZE TABLE(optimize table)来重建表并优化填充页面。