索引分为两种,聚集索引和非聚集索引
聚集索引指的是叶子顺序和物理地址顺序一致
非聚集索引指的是只有叶子顺序是连接着的,物理地址则不一致
常用的存储引擎
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可能会造成读取数据大量在阻塞的情况
总结
1.Innodb主键索引叫聚簇索引、其他索引都叫辅助索引(二级索引,也可以叫非聚簇索引),当使用辅助索引时,会先从辅助索引中找到对应的行key,然后再根据key去主键索引找对应的行数据,造成两次索引查找。
2.Myisam的主键索引和辅助索引都是非聚簇索引,非聚簇索引的特性就是叶子节点不会保存行数据,而是保存数据记录的地址,再直接去数据文件中找。