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

面试八股之MySQL篇2——索引篇

 🌈hello,你好鸭,我是Ethan,一名不断学习的码农,很高兴你能来阅读。

✔️目前博客主要更新Java系列、项目案例、计算机必学四件套等。
🏃人生之义,在于追求,不在成败,勤通大道。加油呀!

🔥个人主页Ethan Yankang
🔥专栏:MySQL||Java八股文
🔥本篇概览:有关MySQL的索引知识

目录

 1、数据结构对比

(1)B tree

(2)B+ tree

(3)总结

2、聚簇索引与非聚簇索引

(1)什么是聚簇索引和非聚簇索引?

(2)回表查询

3、覆盖索引

(1)超大分页问题

(2)创建覆盖索引

(3)总结

 4、索引创建原则

(1)总结

(2)补充:联合索引

5、什么情况下索引会失效

(1)违反最左前缀法则

(2)范围查询右边的列,不能使用索引

(3)不要在索引列上进行运算操作,索引将失效

(4)字符串不加单引号,造成索引失效。(类型转换)

(5)以%开头的Like模糊查询,索引失效

总结


 1、数据结构对比

(1)B tree

(2)B+ tree


B+Tree是在BTree基础上的一种优化,使其更适合实现外存储索引结构,InnoDB存储引擎就是用B+Tree实现其索引结构


 

(3)总结

2、聚簇索引与非聚簇索引

(1)什么是聚簇索引和非聚簇索引?


聚簇索引主要是指数据与索引放到一块,B+树的叶子节点保存了整行数据,主键在作为聚簇索引的有且只有一个。
非聚簇索引值指的是数据与索引分开存储,B+树的叶子节点保存对应的主键,可以有多个,一般我们自己定义的索引都是非聚簇索引。

(2)回表查询


回表的意思就是通过二级索引找到对应的键值,然后再通过主键值找到聚集索引中所对应的整行数据,这个过程就是回表。

3、覆盖索引

覆盖索引是指查询使用了索引,并且需要返回的列,在该索引中已经全部能够找到

(1)超大分页问题

超大分页一般都是在数据量比较大时,我们使用了limit分页查询,并且需要对数据进行排序,这个时候效率就很低,我们可以采用覆盖索引和子查询来解决

先分页查询数据的id字段,确定了id之后,再用子查询来过滤,只查询这个id列表中的数据就可以了
因为查询id的时候,走的覆盖索引,所以效率可以提升很多。

以下是一个覆盖索引的具体例子: 假设有一个表 `students` ,包含字段 `id`(主键)、`name`、`age`。 创建了一个索引 `idx_name_age` 包含 `name` 和 `age` 字段。 现在有一个查询: `SELECT name, age FROM students WHERE name = '张三'` 。 在这个查询中,通过索引 `idx_name_age` 就可以直接获取到满足条件的 `name` 和 `age` 信息,而无需再去查找表中的数据行,这就是覆盖索引发挥作用了。因为查询所需要的列都在索引中直接找到了,避免了回表操作,提高了查询效率。

(2)创建覆盖索引

要创建覆盖索引,可以按照以下步骤进行:

1. **确定需要创建索引的表和字段**:

确定要在哪个表上创建索引,以及要包含在索引中的字段。

2. **使用`CREATE INDEX`语句**:

使用`CREATE INDEX`语句来创建索引。

例如,如果要在表`students`的`name`和`age`字段上创建索引,可以使用以下语句: ```sql CREATE INDEX idx_name_age ON students (name, age); ``` 在上述语句中,`idx_name_age`是索引的名称,可以根据需要自定义。`students`是要创建索引的表名,`(name, age)`是要包含在索引中的字段列表。 创建覆盖索引后,在查询中使用到这些索引字段时,数据库可以直接从索引中获取数据,而无需再进行回表操作,从而提高查询效率。

(3)总结


覆盖索引是指select查询语句使用了索引,在返回的列,必须在索引中全部能够找到,如果我们使用id查询,它性能高。会直接走聚集索引查询,一次索引扫描,直接返回数据 

如果按照二级索引查询数据的时候,返回的列中没有创建索引,有可能会触发回表查询,尽量避免使用select*

——————————————————
尽量在返回的列中都包含添加索引的字段

 4、索引创建原则


 

(1)总结

大频、查询、联合、控制

(2)补充:联合索引

5、什么情况下索引会失效

(1)违反最左前缀法则

在 MySQL 中,当使用联合索引时,如果查询条件没有遵循最左前缀法则,可能会导致索引无法被充分利用或完全不能使用索引。

最左前缀法则是指在查询中要按照联合索引中字段的顺序依次使用条件。

例如,有一个联合索引 `(col1, col2, col3)`,如果查询条件中只使用了 `col3` 而没有使用 `col1` 和 `col2` ,或者使用 `col2` 和 `col3` 而没有 `col1` ,就违反了最左前缀法则,此时索引可能就不能发挥最佳效果或无法使用索引。

以下是一些违反最左前缀法则的常见情况示例:

```sql

-- 只使用了 col3,违反最左前缀法则 SELECT * FROM table WHERE col3 = 'value';

-- 先使用 col2 再使用 col1,顺序错误,违反最左前缀法则 SELECT * FROM table WHERE col2 = 'value' AND col1 = 'value';

```

(2)范围查询右边的列,不能使用索引

(3)不要在索引列上进行运算操作,索引将失效

(4)字符串不加单引号,造成索引失效。(类型转换)

(5)以%开头的Like模糊查询,索引失效

总结

📣非常感谢你阅读到这里,如果这篇文章对你有帮助,希望能留下你的点赞👍 关注❤ 分享👥 留言💬thanks!!!
📚愿大家都能学有所得,功不唐捐!

相关文章:

  • 31.@Anonymous
  • 运行Android项目时,提示错误: 程序包javax.annotation.processing不存在
  • PersonalLLM——探索LLM是否能根据五大人格特质重新塑造一个新的角色?
  • 组播协议简介
  • javascript --对象构造器和class的区别
  • maven的tomcat运行不起来的解决方案
  • 当他们在说业务的时候,到底在说什么
  • 数据访问层设计_6.连接对象管理设计
  • Jenkins升级到2.458后publish over ssh报错
  • 基于深度学习的表情识别系统
  • 运行时间比较
  • Qt | QCalendarWidget 类(日历)
  • Qml:键盘事件
  • gpt-4o考场安排
  • Spring Cloud 框架的应用详解
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 【Leetcode】104. 二叉树的最大深度
  • 【跃迁之路】【669天】程序员高效学习方法论探索系列(实验阶段426-2018.12.13)...
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • flutter的key在widget list的作用以及必要性
  • iOS仿今日头条、壁纸应用、筛选分类、三方微博、颜色填充等源码
  • JavaWeb(学习笔记二)
  • JAVA多线程机制解析-volatilesynchronized
  • rabbitmq延迟消息示例
  • react-core-image-upload 一款轻量级图片上传裁剪插件
  • Redis 中的布隆过滤器
  • Redis的resp协议
  • Spring Cloud Feign的两种使用姿势
  • Spring框架之我见(三)——IOC、AOP
  • XForms - 更强大的Form
  • 更好理解的面向对象的Javascript 1 —— 动态类型和多态
  • 事件委托的小应用
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • NLPIR智能语义技术让大数据挖掘更简单
  • 东超科技获得千万级Pre-A轮融资,投资方为中科创星 ...
  • ​比特币大跌的 2 个原因
  • # 日期待t_最值得等的SUV奥迪Q9:空间比MPV还大,或搭4.0T,香
  • # 学号 2017-2018-20172309 《程序设计与数据结构》实验三报告
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (转)ObjectiveC 深浅拷贝学习
  • (转)setTimeout 和 setInterval 的区别
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .Net 路由处理厉害了
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .NETCORE 开发登录接口MFA谷歌多因子身份验证
  • .NET框架类在ASP.NET中的使用(2) ——QA
  • [ NOI 2001 ] 食物链
  • [20171113]修改表结构删除列相关问题4.txt
  • [AIGC 大数据基础]hive浅谈
  • [BZOJ] 2006: [NOI2010]超级钢琴