索引分为两种, 聚集索引和非聚集索引
聚集索引指的是叶子顺序和物理地址顺序一致
非聚集索引指的是只有叶子顺序是连接着的, 物理地址则不一致
常用的存储引擎
MySQL 常用的存储引擎有 Innodb 和 Myisam, 都是基于 B + 树实现的.
Innodb
1.Innodb 默认聚集索引, 因此他的索引文件就是包含数据文件内容, 索引叶子节点直接保存数据(.idb 数据文件)
(1). 主键就是聚集索引
(2). 在没有主键的情况下会将唯一非空索引作为聚集索引
(3). 如果都没有的情况下就会在内部生成隐式主键作为聚集索引, 这个列是一个 6 字节 (48 位) 的整数作为聚集索引
2.Innodb 默认是行级锁, 行级锁是基于索引实现的, 因此 SQL 中如果没有使用到索引的情况下就不会使用行级锁, 而会换为使用表级锁, 从而导致性能下降
3. 支持事务
4. 需要维护 MVCC 一致性(多版本并发控制), 因此多出来了维护成本
Myisam
Myisam 属于非聚集索引, 因此他的数据文件内容和索引文件是分离的, 索引叶子节点保存数据指针(.myd 数据文件,.myi 索引文件)
1. 不支持事务, 崩溃后无法安全恢复
2. 比 Innodb 的查询速度更快
3.Myisam 使用的是表级锁, 在同时有读和写的操作时候, 即使读锁比写锁先进到锁等待队列, 写锁也会先插入到读锁的前面先进行写的操作, 因此在有大量写的操作时, Myisam 可能会造成读取数据大量在阻塞的情况
来源: http://www.bubuko.com/infodetail-3372557.html