面试问答:什么是索引?它有哪些优缺点?它的适用/不适用场景?哪些情况会造成索引失效?

🐒个人主页:信计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预计全表查询速度比索引查询快,就不会走索引

相关推荐

  1. 什么索引索引哪些优缺点

    2024-03-25 23:54:04       31 阅读
  2. 什么适配器模式?实现方式哪些

    2024-03-25 23:54:04       53 阅读
  3. MySQL索引哪些优缺点

    2024-03-25 23:54:04       61 阅读
  4. 什么单例模式?实现方式哪些

    2024-03-25 23:54:04       43 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-25 23:54:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-25 23:54:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-25 23:54:04       82 阅读
  4. Python语言-面向对象

    2024-03-25 23:54:04       91 阅读

热门阅读

  1. [python] 卡诺图化简 2

    2024-03-25 23:54:04       43 阅读
  2. == 和 equals 的区别是什么?

    2024-03-25 23:54:04       47 阅读
  3. LeetCode热题Hot100-无重复字符的最长子串

    2024-03-25 23:54:04       46 阅读
  4. vue3之RouterView插槽和过渡动效

    2024-03-25 23:54:04       43 阅读
  5. 【TypeScript系列】三斜线指令

    2024-03-25 23:54:04       39 阅读
  6. HashMap的底层结构

    2024-03-25 23:54:04       44 阅读
  7. rsync同步/传输工具ssh使用方法

    2024-03-25 23:54:04       37 阅读
  8. 什么是电磁爆

    2024-03-25 23:54:04       44 阅读
  9. python之内存管理

    2024-03-25 23:54:04       39 阅读
  10. C#关键字 namespace

    2024-03-25 23:54:04       44 阅读
  11. linux下用docker部署es和kibana(一)

    2024-03-25 23:54:04       41 阅读
  12. C++初阶:string类模拟实现

    2024-03-25 23:54:04       37 阅读
  13. mvvm/mvc/mvp三者区别

    2024-03-25 23:54:04       34 阅读
  14. 5.5.9、【AI技术新纪元:Spring AI解码】Qdrant

    2024-03-25 23:54:04       39 阅读
  15. 2024/3/24 蓝桥杯

    2024-03-25 23:54:04       48 阅读