三道MySQL联合索引面试题,淘汰80%的面试者,你能答对几道「终于解决」

三道MySQL联合索引面试题,淘汰80%的面试者,你能答对几道「终于解决」众所周知MySQL联合索引遵循最左前缀匹配原则,在少数情况下也会不遵循(有兴趣,可以翻一下上篇文章)。
创建联合索引的时候,建议优先把区分度高的字段放在第一列。
至于怎么统计区分度,可以按照下面这种方

三道MySQL联合索引面试题,淘汰80%的面试者,你能答对几道

众所周知MySQL联合索引遵循最左前缀匹配原则,在少数情况下也会不遵循(有兴趣,可以翻一下上篇文章)。

创建联合索引的时候,建议优先把区分度高的字段放在第一列。

至于怎么统计区分度,可以按照下面这种方式。

创建一张测试表,用来测试:

CREATE TABLE `test` (
  `id` int NOT NULL AUTO_INCREMENT COMMENT "主键",
  `a` int NOT NULL,
  `b` int NOT NULL,
  `c` int NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT="测试表";

统计每个字段的区分度:

select 
    count(distinct a)/count(*), 
    count(distinct b)/count(*),
    count(distinct c)/count(*)
from test;

三道MySQL联合索引面试题,淘汰80%的面试者,你能答对几道「终于解决」

值越大,区分度越高,优先放在第一列。

很多人不知道联合索引在B+树中是怎么存储的?我简单画一下。

比如在(a,b)字段上面创建联合索引,存储结构类似下面这样:

三道MySQL联合索引面试题,淘汰80%的面试者,你能答对几道「终于解决」

叶子节点存储全部数据,用顺序指针相连,数据都是先按a字段排序,a字段的值相等时再按b字段排序。

a字段的值是全局有序的,分别有1,1,1,2,2,2。

b字段的值是全局无序的,分别有1,3,5,1,3,5,只有在a字段的值相等时才呈现出局部有序。

所以在进行SQL查询的时候,如果where条件中没有a字段,只有b字段,是无法用到索引的,像下面这样:

select * from test where b=1;

像有些文章上面说的,在(a,b)两个字段上创建联合索引,就会创建两个索引,分别是(a)和(a,b),这其实是一种不恰当的表述,虽然结果是对的。

下面做几道联合索引的经典面试题,试一下大家掌握的怎么样?

第一题:

下面这条SQL,该怎么创建联合索引

SELECT * FROM test WHERE a = 1 and b = 1 and c = 1;

你以为的答案是(a,b,c),其实答案是6个,abc三个的排列组合,(a,b,c)、(a,c,b)、(b,a,c)、(b,c,a)、(c,a,b)、(c,b,a)。

MySQL优化器为了适应索引,会调整条件的顺序。

再给面试官补充一句,区分度高的字段放在最前面,大大加分。

第二题:

下面这条SQL,该怎么创建联合索引

SELECT * FROM test WHERE a = 1 and b > 1 and c = 1;

考察的知识点是: 联合索引遇到范围匹配会停止,不会再匹配后面的索引字段。

所以答案应该是:(a,c,b)和 (c,a,b)。

当创建(a,c,b)和 (c,a,b)索引的时候,查询会用到3个字段的索引,效率更高。

怎么判断是用到了3个字段的索引,而不是只用到前两个字段的索引呢?

有个非常简单的方法,看执行计划的索引长度。

三道MySQL联合索引面试题,淘汰80%的面试者,你能答对几道「终于解决」

由于int类型的字段占4个字节,3个字段长度刚好是12个字节。

第三题:

下面这条SQL,该怎么创建联合索引

SELECT * FROM test WHERE a in (1,2,3) and b > 1;

答案是(a,b)。in条件查询会被转换成等值查询,可以验证一下:

三道MySQL联合索引面试题,淘汰80%的面试者,你能答对几道「终于解决」

可以看到用到了两个字段的索引。

所以我们在平时做开发,尽量想办法把范围查询转换成in条件查询,效率更高。

> 文章持续更新,可以微信搜一搜「 一灯架构 」第一时间阅读更多技术干货。

原文地址:https://www.cnblogs.com/yidengjiagou/archive/2022/08/23/16615287.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/4870.html

(0)
上一篇 2023-06-01
下一篇 2023-06-01

相关推荐

  • 用Python的Tkinter模块创建GUI窗口

    用Python的Tkinter模块创建GUI窗口图形用户界面(Graphical User Interface, GUI)是现代计算机上最流行的应用程序类型之一。它提供了一种直观和易于使用的界面,可以帮助用户更好地与计算机交互和控制应用程序。Python是一个强大的编程语言,它支持多种GUI工具包,其中Tkinter是一个Python标准库,它提供了创建GUI应用程序的基本工具。在本文中,我们将详细讨论使用Python的Tkinter模块创建GUI窗口的方法,从而帮助您掌握它。

    2024-02-25
    116
  • Python实现访问数据库的API接口设计

    Python实现访问数据库的API接口设计SQLAlchemy是一个Python SQL工具和对象关系映射器(ORM),可以方便地实现访问数据库的API接口,适用于多种关系型数据库。它提供了一种简单的方式来定义数据模型,并将其映射到数据库模式。相比于直接使用SQL语句,SQLAlchemy可以轻松地修改数据库模型而不用修改SQL语句。此外,SQLAlchemy还提供了一些高级功能,例如连接池、事务、数据库迁移等,使得访问数据库变得更加方便和可靠。

    2023-12-05
    117
  • Oracle学习(八) — SQL优化「建议收藏」

    Oracle学习(八) — SQL优化「建议收藏」1、前置工具:执行计划 Explain Plan 1.1、概念 一条查询语句在 ORACLE 中的执行过程或访问路径的描述。即就是对一个查询任务,做出一份怎样去完成任务的详细方案。 执行计划:用于记…

    2023-03-09
    177
  • 用Python对MongoDB中的数据进行排序

    用Python对MongoDB中的数据进行排序排序是一种将数据按照特定的规则重新排列的过程,可用于查找最大值、最小值、中位数或其他统计信息。对于大量数据,排序是常用的基本操作。在MongoDB中,我们可以使用Python对MongoDB中的数据进行排序。

    2024-01-16
    110
  • Python实现按钮展示功能 – 让用户轻松操作界面

    Python实现按钮展示功能 – 让用户轻松操作界面按钮展示是指在界面上显示可点击的按钮,通过点击按钮实现相应的操作。在界面中使用按钮展示可以提升用户交互体验,方便用户进行操作,也方便开发者实现用户需求。

    2024-04-11
    77
  • 利用Python实现有效的数字判断

    利用Python实现有效的数字判断在Python中,数字是一种基本数据类型,包括整型(int)、浮点型(float)、复数(complex)和布尔型(bool)。

    2024-02-09
    90
  • 基于Linux上Mysql8主从设置

    基于Linux上Mysql8主从设置上一篇已经说明了Mysql8的安装方法,这篇来说说主从怎么配置 一、配置修改 # 除去其他的,最关键的就是下面这些了,其实在上一篇里面已经设置好了 [mysqld3306] server_id=33…

    2023-03-14
    164
  • SQL-索引[通俗易懂]

    SQL-索引[通俗易懂]理解“聚集索引”和“非聚集索引” ① 聚集索引(clustered index,也称聚类索引、簇集索引):把内容本身就是一种按照一定规则排列的目录称为“聚集索引” 我们的汉语字典的正文本身就是一个聚集

    2023-04-22
    162

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注