查看MySQL提供的所有存储引擎:
mysql->show engines;
可以看到MySQL当前默认的存储引擎是InnoDB。
InnoDB
- InnoDB是MySQL默认的事务型存储引擎。
- 默认隔离级别是可重复读(REPEATABLE-READ),可以防止脏读、不可重复读以及幻读。它是通过多版本并发控制(MVCC)+ 间隙锁(Next-Key Locking)防止幻读的。
- 主索引是聚簇索引,在索引中保存了数据,从而避免直接读取磁盘,因此对查询性能有很大提升。
- 内部做了很多优化,包括:从磁盘读取数据时采用的可预测性读、能够加快读操作并且自动创建的自适应哈希索引、能够加速插入操作的插入缓冲等。
- 支持真正的在线热备份。
MyISAM
- 设计简单,数据以紧密格式存储。对于只读数据,或者表比较小、可以容忍修复操作,则依然可以使用他。
- 提供了大量的特性,如:压缩表、空间数据索引等。
- 不支持事务。
- 不支持行级锁,只能对整张表加锁。读取时会对需要读到的所有表加共享锁,写入时则对表加排它锁。但在表有读取操作的同时,也可以往表中插入新的记录,这被称为并发插入。
- 可以手动或自动检查和修复操作,但是可能会导致一些数据丢失,而且修复操作是非常慢的。
二者比较
在5.5版本以前,MyISAM是MySQL的默认数据引擎,不支持事务和行级锁,而且最大的缺陷是崩溃后无法安全恢复;5.5版本以后,MySQL引入了InnoDB(事务型存储引擎)。
二者的对比:
InnoDB | MyISAM | |
---|---|---|
事务 | 事务型,可以使用commit和rollback语句 | 无 |
并发 | 支持表级锁和行级锁(默认) | 仅支持表级锁 |
外键 | 支持 | 不支持 |
备份 | 支持在线热备份 | 不支持 |
崩溃恢复能力 | 更强 | 较弱 |
是否支持MVCC | 支持 | 不支持 |
InnoDB与MyISAM使用的索引:
MySQL索引使用的主要是哈希索引和B Tree索引。哈希索引的底层数据结构是哈希表,当查询单条记录时可选择哈希索引,查询性能最快;其余大部分场景,建议选择B Tree索引。
- MyISAM
B+Tree叶节点的data域存放的是数据记录的地址。在索引检索的时候,首先按照B+Tree搜索算法搜索索引,如果指定的key存在,则取出其data域的值作为地址,然后以此地址读取相应的数据记录。这被称为“非聚簇索引”。 - InnoDB
相比MyISAM(数据文件和索引问件是分离的),InnoDB的数据文件本身就是索引文件,树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。这被称为“聚簇索引”。而其余的索引都作为辅助索引,辅助索引的data域存储相应记录主键的值而不是地址,这也是和MyISAM不同的地方。在根据主索引搜索时,直接找到key所在的节点即可取出数据;在根据辅助索引查找时,则需要先取出主键的值,再走一遍主索引。