索引的基本原理
索引⽤来快速地寻找那些具有特定值的记录。如果没有索引,⼀般来说执⾏查询时遍历整张表。
索引的原理:就是把⽆序的数据变成有序的查询
- 把创建了索引的列的内容进⾏排序
- 对排序结果⽣成倒排表
- 在倒排表内容上拼上数据地址链
- 在查询的时候,先拿到倒排表内容,再取出数据地址链,从⽽拿到具体数据
Mysql聚簇和⾮聚簇索引的区别
聚簇索引:将数据存储与索引放到了⼀块、并且是按照⼀定的顺序组织的,找到索引也就找到了数
据,数据的物理存放顺序与索引顺序是⼀致的,即:只要索引是相邻的,那么对应的数据⼀定也是
相邻地存放在磁盘上的
⾮聚簇索引:叶⼦节点不存储数据、存储的是数据⾏地址,也就是说根据索引查找到数据⾏的位置
再取磁盘查找数据,有点类似⼀本树的⽬录,⽐如我们要找第三章第⼀节,那我们先在这个
⽬录⾥⾯找,找到对应的⻚码后再去对应的⻚码看⽂章。
优势:聚簇索引可以直接获取数据,不需要二次查询,效率高,适用于排序场合,范围查询效率很高;
劣势:维护索引昂贵,特别是插入一条数据需要分页的时候,需要移动数据;而非聚簇索引则不需要。
Innodb 主键使用聚簇索引。
MySQL 为什么使用B+树,不使用B树
- B+树非叶子节点不存在数据只存索引,B树非叶子节点存储数据。
- B+树查询效率更高。B+树使用双向链表串连所有叶子节点,区间查询效率更高(因为所有数据都在B+树的叶子节点,扫描数据库 只需扫一遍叶子结点就行了),但是B树则需要通过中序遍历才能完成查询范围的查找。
- B+树查询效率更稳定。B+树每次都必须查询到叶子节点才能找到数据,而B树查询的数据可能不在叶子节点,也可能在,这样就会造成查询的效率的不稳定
- B+树的磁盘读写代价更小。B+树的内部节点并没有指向关键字具体信息的指针,因此其内部节点相对B树更小,一次IO加载进内存的关键字要更多,查询到关键字的效率就越高,产生的磁盘I/O更少。

