一、Mysql索引
1. 索引建立原则
- 索引列应该是经常出现在查询条件或者连接子句中的列,而不是容易被忽略的列。
- 唯一性索引的效率要高于非唯一性索引,因此在设计表结构时,需要选择合适的列作为唯一性索引。
- 对于多个相等条件的查询,联合索引比单个索引的效率更高。
- 在使用额外排序(order by)或分组(group by)语句时,可以考虑在相关的列上加上索引,以便加速查询。
- 避免创建过多的索引,过多的索引可能导致查询优化器难以选择最优的执行计划。因此只创建必要的索引,尽量避免重复索引的存在。
- 执行更新操作(insert、update和 delete)时,索引会额外的增加维护成本,所以应该避免不必要的索引。
2. 索引失效场景
- 使用函数操作符:如果在where子句中使用了函数、运算符或者表达式,MySQL就无法使用索引来优化查询,例如SELECT * FROM table WHERE year(date_column) = 2022;这时可以考虑将函数或运算符拆分出来,在查询之前进行一下预处理。
- 对索引列进行操作:如果查询语句对索引列进行了操作,如使用了LIKE 'xxx%'通配符查询,MySQL也无法使用该索引,这时可以考虑使用全文检索来代替模糊匹配。
- 多个条件之间存在OR关系:如果查询语句同时包含多个条件,且每个条件之间都是用OR连接,则MySQL不能有效地使用索引优化查询。
- 列类型不匹配:如果在查询条件中使用了不同类型的值进行比较,MySQL就需要转换这些值为相同类型,从而导致索引失效。因此要保持查询条件和列类型相同。
- 查询的结果集超过一个阈值:当查询数据集合非常大时(例如结果集超过索引统计信息的20%),MySQL会放弃使用索引而选择全表扫描,从而导致索引失效。
3. B+树索引的优势
- 从磁盘I/O效率方面来看:B+树的非叶子节点不存储数据,所以树的每一层就能够存储更多的索引数量,也就是说,B+树在层高相同的情况下,比B树的存储数据量更多,间接会减少磁盘I/O的次数。
- 从范围查询效率方面来看:在MySQL中,范围查询是一个比较常用的操作,而B+树的所有存储在叶子节点的数据使用了双向链表来关联,所以B+树在查询的时候只需查两个节点进行遍历就行,而B树需要获取所有节点,因此,B+树在范围查询上效率更高。
- 从全表扫描方面来看:因为,B+树的叶子节点存储所有数据,所以B+树的全局扫描能力更强一些,因为它只需要扫描叶子节点。而B树需要遍历整个树。
- 从自增ID方面来看:基于B+树的这样一种数据结构,如果采用自增的整型数据作为主键,还能更好的避免增加数据的时候,带来叶子节点分裂导致的大量运算的问题。
3. 聚集索引与非聚集索引的区别
简单来说,聚集索引就是基于主键创建的索引,除了主键索引以外的其他索引,称为非聚集索引,也叫做二级索引。基于InnoDB这样的特性,聚集索引并不仅仅是一种索引类型,还代表着一种数据的存储方式。
4. 索引分类
- 普通索引
- 唯一索引
- 主键索引
- 组合索引
- 全文索引
4. 索引数据结构
- B+树索引
- hash索引
总结
以上为个人学习过程中对java的一些学习总结,如有错误,欢迎各位批评指导,如有侵权,请联系本人删除,如果觉得有一点帮助麻烦点个赞加收藏!谢谢!