文章目录
- 🐒个人主页:信计2102罗铠威
- 🏅JavaEE系列专栏
- 📖前言:
- 🎀什么是索引?(按角度答!:作用,存放位置)
- 🐕索引的优缺点
- 🪀索引的适用场景:
- 🪀不适合创建索引的场景
- 🎀哪些情况会造成索引失效?“模型数空运最快”
🐒个人主页:信计2102罗铠威
🏅JavaEE系列专栏
📖前言:
本篇博客主要总结面试中对索引的提问以及优缺点分析
🎀什么是索引?(按角度答!:作用,存放位置)
索引是一种排好序的可以快速查找数据的一种数据结构
,因为在MySQL中除了对数据进行存储之外,还经常涉及到查询,所以就设计了对应的查找数据的算法,这个算法对应的就是数据库索引。它类似于字典目录一样,可以快速锁定待查找数据的位置。
索引是存储在磁盘中的
,这是因为索引本身也很大,不适合存储在内存中,假设如果我们存储在内存中的话,那么每次打开数据库,都要重新生成索引吗?
🐕索引的优缺点
优点:
1)索引就像字典目录一样,可以快速定位,降低了IO次数,提高了查询效率
2)使用索引可以加快排序速度,因为索引是有序的,可以降低排序成本,降低CPU消耗
3)使用索引可以提高表与表之间的连接速度、可以提高group by 分组的效率
缺点:
1)由于索引本身需要占用一定的存储空间,会增加一定的空间上的开销
2)再从时间上考虑,如果要更新数据时,同时还有维护索引树,增加了一些时间开销,如果数据量不断增大,那么维护的索引树也会不断增大,维护索引树产生的时间开销成本也会增大
🪀索引的适用场景:
1)在表中需要频繁作为筛选条件的字段适合创建索引
2)主键会自动创建索引、外键推荐建立索引(因为可以提高表与表之间的连接速度)
3)需要进行排序的字段推荐创建索引。(因为索引已经有序,按照索引排序速度更快)
4)经常需要进行范围查询的列适合建立索引
5)经常进行统计或者进行group by 分组的字段推荐创建索引
🪀不适合创建索引的场景
1)表数据太少的表不适合创建索引,因为暴力查找就很快
2)频繁进行数据更新的表不适合创建索引,因为每次更新数据,都要动态的维护索引树,维护开销太大
3)像那些区分度不高的列不适合建立索引,像 男女列
4)像数据类型为 text 或者 bit 类型的不建议使用索引,因为text字段数据量太大了,占空间。而bit数据类型太小了,区分度不高。
5)不经常作为查询条件的列不适合创建索引,(因为用不到,查询效率不会提高,相反如果更新数据,还需要维护,增加了时间和空间的开销)
🎀哪些情况会造成索引失效?“模型数空运最快”
1)模:模糊查询会使索引失效,(只要左边有%的都不行,因为不确定第一个字符,只能进行全表查询)
2)型:数据类型如果没有对应,也会使索引失效(因为不同类型的排序方式不一样,例如字符串按字典序,数字按升序,所以查询时要类型一致保持筛选条件的排序和索引的排序一样)
3)数:如果对索引列使用函数,也会导致索引失效
4)空:如果索引列为空null ,也会导致索引失效(因为索引不存储null值)
5)运:如果对索引列进行加减乘除运算,会导致索引失效
6)最:如果联合索引的适用不符合最左前缀原则,也会导致索引失效
7)快:如果数据量太小了,MySQL预计全表查询速度比索引查询快,就不会走索引