mysql怎么维护索引 mysql索引实现原理( 五 )


B+树比B树优势在于:
B+ 树非叶子节点存储的只是索引,可以存储的更多 。B+树比B树更加矮胖 , IO次数更少 。
B+ 树叶子节点前后管理,更加方便范围查询 。同时结果都在叶子节点,查询效率稳定 。
B+树中更有利于对数据扫描,可以避免B树的回溯扫描 。
索引的优点:
1、唯一索引可以保证每一行数据的唯一性
2、提高查询速度
3、加速表与表的连接
4、显著的减少查询中分组和排序的时间
5、通过使用索引,可以在查询的过程中 , 使用优化隐藏器,提高系统的性能 。
索引的缺点:
1、创建跟维护都需要耗时
2、创建索引时 , 需要对表加锁,在锁表的同时,可能会影响到其他的数据操作
3、 索引需要磁盘的空间进行存储 , 磁盘占用也很快 。
4、当对表中的数据进行CRUD的时,也会触发索引的维护,而维护索引需要时间 , 可能会降低数据操作性能
索引设计的原则不应该:
1、索引不是越多越好 。索引太多,维护索引需要时间跟空间 。
2、 频繁更新的数据 , 不宜建索引 。
3、数据量小的表没必要建立索引 。
应该:
1、重复率小的列建议生成索引 。因为重复数据少,索引树查询更有效率,等价基数越大越好 。
2、数据具有唯一性 , 建议生成唯一性索引 。在数据库的层面 , 保证数据正确性
3、频繁group by、order by的列建议生成索引 。可以大幅提高分组和排序效率
4、经常用于查询条件的字段建议生成索引 。通过索引查询,速度更快
索引失效的场景
1、模糊搜索:左模糊或全模糊都会导致索引失效 , 比如'%a'和'%a%' 。但是右模糊是可以利用索引的,比如'a%'。
2、隐式类型转换:比如select * from t where name = xxx , name是字符串类型,但是没有加引号,所以是由MySQL隐式转换的,所以会让索引失效 3、当语句中带有or的时候:比如select * from t where name=‘sw’ or age=14
4、不符合联合索引的最左前缀匹配:(A,B,C)的联合索引,你只where了C或B或只有B,C
关于索引的知识点:
主键索引:主键索引的叶子节点存的是整行数据信息 。在InnoDB里 , 主键索引也被称为聚簇索引(clustered index) 。主键自增是无法保证完全自增的哦,遇到唯一键冲突、事务回滚等都可能导致不连续 。
唯一索引:以唯一列生成的索引,该列不允许有重复值,但允许有空值(NULL)
普通索引跟唯一索引查询性能:InnoDB的数据是按数据页为单位来读写的 , 默认每页16KB,因此这两种索引查询数据性能差别微乎其微 。
change buffer:普通索引用在更新过程的加速,更新的字段如果在缓存中,如果是普通索引则直接更新即可 。如果是唯一索引需要将所有数据读入内存来确保不违背唯一性 , 所以尽量用普通索引 。
非主键索引:非主键索引的叶子节点内容是主键的值 。在InnoDB里,非主键索引也被称为二级索引(secondary index)
回表:先通过数据库索引扫描出数据所在的行,再通过行主键id取出索引中未提供的数据,即基于非主键索引的查询需要多扫描一棵索引树 。
覆盖索引:如果一个索引包含(或者说覆盖)所有需要查询的字段的值 , 我们就称之为覆盖索引 。
联合索引:相对单列索引,组合索引是用多个列组合构建的索引,一次性最多联合16个 。
最左前缀原则:对多个字段同时建立的组合索引(有顺序,ABC , ACB是完全不同的两种联合索引) 以联合索引(a,b,c)为例,建立这样的索引相当于建立了索引a、ab、abc三个索引 。另外组合索引实际还是一个索引,并非真的创建了多个索引,只是产生的效果等价于产生多个索引 。

推荐阅读