mysql索引
最近用到mysql索引,赶紧了解了一下,最后做一个小小的总结。
关于索引
索引,就是按照索引排好序的数据结构,查询数据的时候走索引比不走索引要快很多,因为不走索引意味着全表扫描,而且还可能会锁住元组,效率比较低。
索引实现
mysql使用B+ Tree的索引模型,无论是MyISAM还是InnoDB。为什么使用B+树而不是红黑树、B树?不使用二叉树的原因主要是因为如果存储大量数据,二叉树很容易深度过深。而基于hash则无法支持范围查找。B+树的数据全部存储在叶子节点,按照索引排好序并且通过双向指针串在一起,这样就很容易的进行区间遍历。
联合索引
联合索引:mysql将多个列按照顺序作为一个索引,B+树按照索引的先后优先级别排序;建立的联合索引a,b,c之后索引的使用遵循最左配备原则。
聚簇索引与非聚簇索引
聚集索的叶子节点会存储数据(其他列的数据),非聚集索引则存储对应的磁盘指针。
辅助索引
叶子节点存储的是主键的值,拿到主键的值之后还需要查询一次才最终拿到数据,这个过程称为回表。
辅助索引通过create index indecName on tableName(columnName) 添加。
MyIsam 与 InnoDB
MyIsam使用非聚簇索引,B+树叶子节点的值存储的是磁盘指针,需要进行一次磁盘IO操作才能最终拿到数据,而InnoDB使用聚簇索引,到达叶子节点意味着直接拿到了数据。Mysam锁的粒度是表级,InnoDB支持行级锁。Mylsam不支持事务。
索引的缺点
更新操作有一定的损耗,需要维护索引树,而且占用磁盘空间。