面试八股之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!!!
📚愿大家都能学有所得,功不唐捐!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/14075.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Springboot阶段项目---《书城项目》

一 项目介绍 本项目采用集成开发平台IntelliJ IDEA开发了在线作业成绩统计系统的设计与实现,实现了图书商城系统的综合功能和图形界面的显示,可以根据每个用户登录系统后,动态展示书城首页图书,实现了分类还有分页查询&#xff0c…

进程、线程——面经(一)

1、什么是进程(Process),线程(Thread),有什么区别? 进程(Process): 定义: 进程是一个独立的执行环境,它拥有独立的内存空间&#xf…

Linux应用入门(二)

1. 输入系统应用编程 1.1 输入系统介绍 常见的输入设备有键盘、鼠标、遥控杆、书写板、触摸屏等。用户经过这些输入设备与Linux系统进行数据交换。这些设备种类繁多,如何去统一它们的接口,Linux为了统一管理这些输入设备实现了一套能兼容所有输入设备的…

怎么压缩pdf pdf在线压缩 pdf文件压缩大小

pdf文件无论在何种设备上打开,PDF文件都能保持其原始的布局和格式,这对于文档共享和打印非常重要。PDF不仅支持文本,还能嵌入图像、视频、音频以及动态链接等元素。PDF文件支持加密和密码保护,可以限制访问、编辑、复制或打印文档…

C语言----深入理解指针(3)

1.字符指针变量 //int main() //{ // char ch w; // char*pc&ch; // printf("%c", *pc); // return 0; //}/*int main() {//char* p "abcdef";//char arr[] "abcdef";//常量字符串 a b c d e f \0//char* pc arr;//将数组首…

高防IP是什么意思?

在网络安全中,企业和用户经常会受到网络攻击和流量攻击,比如DDOS攻击和CC攻击等,那么对于这些网络攻击,企业和用户有什么解决方案呢? 对于网络攻击,高防IP是一种针对网络攻击和分布式拒绝服务攻击设计的IP解…

【002】FlexBison原理分析

0. 前言 Flex和Bison是用于构建处理结构化输入的程序的工具。它们最初是用于构建编译器的工具,但它们已被证明在许多其他领域都很有用。  在第一章中,我们将首先看一点(但不是太多)它们背后的理论,然后我们将深入研究一些使用它…

K8S认证|CKA题库+答案| 5. 创建 Ingress

5 . 创建 Ingress 您必须在以下Cluster/Node上完成此考题: Cluster Master node Worker node k8s master …

基于Tensorflow卷积神经网络垃圾智能分类系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 随着城市化进程的加速,垃圾问题日益严重,垃圾分类成为解决这一问题的关…

浅谈金融行业数据安全分类分级

数据安全管理是一项从上而下的、多方配合开展的工作。在进行数据安全管理组织架构建设时,需要从上而下建设;从而全面推动数据安全管理工作的执行和落地;以保证数据安全的合法合规、并长效推动业务的发展和稳定运行。 金融行业机构应设立数据…

「项目」负载均衡在线OJ(ONLINE_JUDGE)系统

🐶博主主页:ᰔᩚ. 一怀明月ꦿ ❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C,linux 🔥座右铭:“不要等到什么都没有了…

机器学习系列--强化学习

强化学习(Reinforcement Learning,RL)是一种机器学习方法,旨在通过智能体(Agent)在环境(Environment)中采取行动(Actions)并获取反馈(Reward&…

技术驱动未来,全面揭秘 Sui 的生态发展和布局

在不到一年的时间里,由 Mysten Labs 团队创立的 Layer1 区块链 Sui 迅速崛起,成功跃升至去中心化金融(DeFi)的前十名。根据 DeFi Llama 的数据,Sui的总锁定价值(TVL)在短短四个月内增长超过 100…

13-云原生监控体系-Mysqld_exporter 监控 MySQL[部署Dashborad告警规则实战]

文章目录 1. 部署1.1. 二进制方式部署1.1.1. 下载1.1.2. 部署1.1.3. MySQL 服务的配置1.2 docker-compose 方式1.3 配置 Prometheus1.4 测试1.5 mysqld_exporter 命令行运行参数1.5.1. 配置格式1.5.2. 运行参数详解1.5.3. 监控不同的集群2. Dashboard2.

【好玩的经典游戏】Docker环境下部署retroarch-web经典游戏模拟器

【好玩的经典游戏】Docker环境下部署retroarch-web经典游戏模拟器 前言一、RetroArch-web介绍二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍三、检查本地环境3.1 检查系统版本3.2 检查Docker服务状态四、拉取镜像五、创建retroarch-web容器5.1 创建容器5.2 查看容器状态六…

深度学习之基于Tensorflow+Flask框架Web手写数字识别

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 手写数字识别是深度学习领域中的一个经典问题,也是计算机视觉领域的重要应用之一。…

BFT Robotics - 您的智能自动化伙伴

“买机器人,上BFT” 自动化和机器人技术是推动现代工业发展的重要力量。BFT Robotics以其创新的产品系列和定制化解决方案,为企业提供了一条通往高效、智能生产环境的道路。通过采用BFT Robotics的产品和服务,企业不仅能够提高生产效率&#…

编程语言的集合判断逻辑

当判断一个Item是否在集合中,比如List,Map,Array等,只可以判断真,不可以判断假。 如果执着判断,也可以通过设置标志位去实现,这样代码就会显得臃肿,效率低下。 比如 list.forEach…

js JSON.stringify 对象转字符串

通过 JSON.stringify() 把 JavaScript 对象转换为字符串 注: 在 JSON 中,不允许日期对象。JSON.stringify() 函数将把任何日期转换为字符串。在 JSON 中,不允许函数作为对象值。 JSON.stringify() 函数将从 JavaScript 对象删除任何函数&am…