MySQL的数据库引擎
InnoDB
- 使用B+树作为底层数据结构:
- B+树的叶子节点存储的是每一条记录(主键索引或者聚簇索引),查询效率高,一次索引
- 叶子节点存储的是主键的值,查询效率较高,但是因为涉及到回表,所以比聚簇索引慢。它先根据其他索引即聚簇索引获取到主键值,然后在根据主键值去获取整个完整的记录,这个过程就是回表。
- 但是,如果覆盖索引的话就可以避免多次查询,这也是索引优化的方式之一。覆盖索引就是指你查询的数据全部包含在索引列中,也就是select语句后面的列全部包含在你where关键词后面的列中。这样就避免了二次查找。
- InnoDB搜索引擎支持事务处理
- MySQL中唯一支持外键的引擎
- 不保存表的具体行数:因为INnoDB支持事务处理,它的count会统计对于当前事务而言的行数而不是全表的行数,所以select * from table必须是全表扫描
- 支持表级锁和行级锁,但是行锁是基于索引的,所以行锁的前提是命中索引
- 不支持全文本索引
- 必须有主键
MyISAM
- 使用B+树作为底层数据结构:
索引和数据是分离的,.frm存储表定义.MYD保存的是数据而.MYI保存的是索引。因此具有查询速度比较快
非聚簇索引,主键索引和辅助索引是相互独立的,索引保存的数据文件的地址指针。 - 支持全文本索引
FULLTEXT(列名) 列必须是字符串列,配合MATCH()和AGAINST()进行匹配查找
速度比较快 - 不支持事务处理
- 不支持外键
- 保存表的具体行数,所以执行select * from table,只需要读出数据即可,速度很快
- 仅支持表级锁
- 可支持压缩查询