当前位置: 首页 > news >正文

MySQL索引面试题(高频)

文章目录

  • 前言
  • 什么时候需要(不需要))使用索引?
  • 有哪些优化索引的方法
    • 前缀索引优化
    • 索引覆盖优化
    • 索引失效场景
  • 总结


前言

今天来讲一讲 MySQL 索引的高频面试题。主要是针对前一篇文章 MySQL索引入门(一文搞定)进行查漏补缺,建议大家看完前一篇再看这一篇。


什么时候需要(不需要))使用索引?

我们先来看看索引的优缺点吧。

优点:可以快速查询的效率,查询是在增删改查中最经常使用。

缺点:创建索引是要用到物理空间的。其次维护索引,当数据库进行增删改的时候,索引也要动态的进行变化。这样子的话过多的索引会影响到数据库的增删改性能。

从优缺点我们来切入什么需要使用索引,什么时候不需要索引

什么时候需要使用索引?

  1. 当字段经常出现在 where 当做条件中,我们可以考虑根据字段添加索引。
  2. 当字段经常出现在 order By 和 Group By 时,我们可以考虑根据字段添加索引。
  3. 当字段频繁的查询,而少更新时,我们可以考虑根据字段添加索引。

什么时候不需要使用索引?

  1. 反之,将字段频繁的更新时,不需要使用索引,因为索引的意义就是加速查询,既然用不上就不需要创建了。

  2. 当数据量少时,不用因为查询性能慢而烦恼时,就不需要使用索引。

  3. 当字段经常设计计算、函数等操作时,不需要使用索引,因为这会造成索引失效。

  4. 当有 where,order by ,group by 等关键词使用不到的字段,不需要使用索引,因为索引的价值是快速定位,这样子的话提现不出价值而且索引会占用物理空间。

  5. 当有字段存储了大量的重复数据时,不需要创建索引,比如性别,只有男/女两种值,这时候的索引是起不到作用的。因为MySQL 有个优化器会在执行前将SQL进行优化,如果有太多重复的数据,优化器默认是不会使用索引的。

有哪些优化索引的方法

前缀索引优化

前缀索引优化就是当类型为字符串(比如:varchar)的字段,该字段过长时,我们可以使用前缀索引就是将该字段的前几个字符作为索引。

这样子既可以节省空间,又可以起到索引优化查询的性能。

当然这种也有缺点。

  1. order by 无法使用前缀索引
  2. 前缀索引无法起到索引覆盖优化。

索引覆盖优化

索引覆盖优化一般是使用联合索引,就是B+树的叶子结点是包含索引(key)和数据(data)的。当使用联合索引时
,如果联合索引中的值包含了我们需要查询的值,那么就不用进行回表查询了。回表查询就是根据这次查询到的索引值再进行一次查询。

比如学生表,我们要查询出studentName,studentPhone,其中card(身份证卡号)是唯一值,我们创建联合索引(card、studentName、studentPhone)。然后我们使用SQL语句进行查询

select card,studentName, studentPhone from student where card = '445122335464654654463'

这样子就是索引覆盖优化拉。

索引失效场景

就不详细解释了,大家感兴趣底层原理可以阅读 “小林coding”的网站。

  1. 当like关键字进行左模糊(%xx)查询和左右模糊(%xx%)查询时会失效。因为索引是整个值,进行左模糊的话无法匹配出来。
  2. 当索引字段进行计算,函数,类型转化时,会出现索引失效。
  3. 当联合索引不符合最左匹配原则时会出现索引失效。
  4. where 条件字段中,如果 OR 前字段是索引列,后字段不是,会索引失效。

总结

总的来说,我们只要符合索引的优缺点就可以知道索引该如何使用拉。优点:快速查询,缺点:浪费空间,影响数据更新性能。

最后建议大家都可以去读一读 小林coding网站的索引篇,知道底层原理,知识才更牢固。


有启发点个赞 🌹

好文章不要错过,最近給大家分享的文章

MySQL的基础知识

1.MySQL的基础架构
2.SQL语句的执行流程
3.MySQL 的存储引擎

MySQL 索引

1.MySQL索引入门(一文搞定)

预计下篇分享:MySQL 事务基础知识

本篇参考:小林coding ,JavaGuide

我是小辉,正在进行 Java 实习的 24 届应届毕业生。欢迎关注,持续分享,包括但不限于技术文章。全网同名…

http://www.lryc.cn/news/304065.html

相关文章:

  • SouthLeetCode-打卡24年02月第2周
  • Rust CallBack的几种写法
  • Redis突现拒绝连接问题处理总结
  • css中选择器的优先级
  • python3字符串内建方法split()心得
  • html的列表标签
  • 【Pytorch深度学习开发实践学习】B站刘二大人课程笔记整理lecture04反向传播
  • PyTorch使用Tricks:学习率衰减 !!
  • 10MARL深度强化学习 Value Decomposition in Common-Reward Games
  • 2 Nacos适配达梦数据库实现方案
  • 【Gitea】配置 Push To Create
  • 关于postgresql数据库单独设置某个用户日志级别(日志审计)
  • 阿里云ECS香港服务器性能强大、cn2高速网络租用价格表
  • 实战打靶集锦-025-HackInOS
  • list.stream().forEach()和list.forEach()的区别
  • JS基础之JSON对象
  • 嵌入式学习之Linux入门篇——使用VMware创建Unbuntu虚拟机
  • 大模型中的token是什么?
  • 跳表是一种什么样的数据结构
  • 【刷题记录】最大公因数,最小公倍数(辗转相除法、欧几里得算法)
  • ETL快速拉取物流信息
  • 17.1 SpringMVC框架_SpringMVC入门与数据绑定(❤❤)
  • Leetcode 11.盛水最多的容器
  • 《Go 简易速速上手小册》第7章:包管理与模块(2024 最新版)
  • 【论文精读】IBOT
  • Yolo V5在实时视频流中的建筑物与彩钢房检测:性能评估与改进方法
  • 图——最小生成树实现(Kruskal算法,prime算法)
  • Unity3D xLua开发环境搭建详解
  • Python笔记-super().init(root)的作用
  • 【git 使用】使用 git rebase -i 修改任意的提交信息/合并多个提交