mysql联合查询语句 数据库mysql安装教程

介绍本文是《面试官:谈谈你对mysql索引的理解》的续篇。我在写这篇文章的时候,由于篇幅问题,省略了联合索引的内容。我今天会补偿你的。本文预计分为两部分:(1)联合指标部分的基础知识在这一节中,让我们回顾一下联邦索引的基础。(2)联合索引部分的实际问题这一部分,列举几...

介绍

本文是《面试官:谈谈你对mysql索引的理解》的续篇。我在写这篇文章的时候,由于篇幅问题,省略了联合索引的内容。我今天会补偿你的。本文预计分为两部分:

(1)联合指标部分的基础知识

在这一节中,让我们回顾一下联邦索引的基础。

(2)联合索引部分的实际问题

这一部分,列举几个我认为实战中有代表性的问题,挑出来。

主体

基础

说到关节索引,一定要拉最左边的匹配!放心吧,我什么都不说,就懂几个字!最左匹配最左原则是指如果在你的SQL语句中使用了联合索引中最左的索引,那么这条SQL语句就可以使用这个联合索引进行匹配。值得注意的是,当遇到范围查询(>:、& lt,between,like)会停止匹配。假设,我们建立一个(a,b)域的索引,也就是在你where之后,条件是

a = 1a = 1 and b = 2

它可以匹配索引。但是要注意的是~你执行

b= 2 and a =1

也可以匹配到索引,因为Mysql有一个优化器,会自动调整A和B的顺序,使之与索引顺序一致。相反,你表演

b = 2

你比不上指数。而你索引(a,b,c,d),where之后的条件是

a = 1 and b = 2 and c > 3 and d = 4

然后可以用A、B、C三个字段进行索引,D无法匹配。因为范围查询!

最左匹配原则?假设我们对(a,b)字段进行索引,如下图所示。

如图,按A排序,A相等时才按B排序。

所以我们可以看到,A依次是1,1,2,2,3,3。而B是一种全局无序局部相对有序的状态!你什么意思?全局来看,b的值是1,2,1,4,1,2,这是乱序的。所以直接执行b = 2的查询条件是没有办法利用索引的。

局部来说,A的值确定了,B就妥当了。例如,当a = 1时,B的值为1,2是有序状态。当a = 2时,b的值为1,4也是有序状态。因此,当执行a = 1和b = 2时,可以对A和B字段进行索引。而你执行A >:当1和b = 2时,字段A可以被索引,但字段B不能被索引。因为此时A的值是一个范围,不是固定的,B的值在这个范围内是不排序的,所以B字段不能被索引。

综上所述,最左匹配原则遇到范围查询会停止匹配。

真正的战斗

好了,以上基础你懂了,我们就可以开始拉~我引用了经典的五个问题,你看完就明白了!

问题类型一

如果sql是

SELECT * FROM table WHERE a = 1 and b = 2 and c = 3;

如何建立一个指数?如果这个问题的答案是index (a,b,c),可以回去等通知。这个问题的正确答案是:(a,b,c)或者(c,b,a)或者(b,a,c)。重要的是把区分度高的领域放在前面,把区分度低的领域放在后面。性别、地位等字段的区分度较低,我们一般会放在后面。

例如,假设区分度从大到小依次为b、A、C、A、C。然后我们将索引(b,a,c)。在执行sql的时候,优化器会帮助我们调整where之后A,B,C的顺序,这样就可以使用索引了。

第二个问题类型

如果sql是

SELECT * FROM table WHERE a > 1 and b = 2;

如何建立一个指数?如果这个问题的答案是index (a,b),可以回去等通知。这个问题的正确答案是index (b,a)。如果构建(A,b)索引,那么只有A字段可以用于索引。毕竟最左匹配原则遇到范围查询就停止匹配。如果(b,a)被索引,那么两个字段都可以使用。优化器会帮助我们调整where之后A和B的顺序,这样我们就可以使用索引了。

三类问题

如果sql是

SELECT * FROM `table` WHERE a > 1 and b = 2 and c > 3;

如何建立一个指数?这个问题的答案不一定,(b,a)和(b,c)都可以,要结合具体情况具体分析。

展开。

SELECT * FROM `table` WHERE a = 1 and b = 2 and c > 3;

如何建立一个指数?嗯,大家一定要理解!

四类问题

SELECT * FROM `table` WHERE a = 1 ORDER BY b;

如何建立一个指数?这还需要考虑吗?一看就是为了索引(a,b)。当a = 1时,B相对有序,可以避免重新排序!因此

SELECT * FROM `table` WHERE a > 1 ORDER BY b;

如何建立一个指数?Index (A),因为A的值是一个范围,在这个范围内B的值是乱序的,所以不需要index (a,B)。

展开。

SELECT * FROM `table` WHERE a = 1 AND b = 2 AND c > 3 ORDER BY c;

如何建立一个指数?

五个问题

SELECT * FROM `table` WHERE a IN (1,2,3) and b > 1;

如何建立一个指数?或者INdex (a,b),因为in在这里可以视为等价引用,索引匹配不会停止,所以还是(a,b)!

展开。

SELECT * FROM `table` WHERE a = 1 AND b IN (1,2,3) AND c > 3 ORDER BY c;

如何建立一个指数?此时,索引不用于C排序。

摘要

希望你能在面试的时候回答一下联指的问题。

本文来自奶味小仙女投稿,不代表舒华文档立场,如若转载,请注明出处:https://www.chinashuhua.cn/24/634948.html

打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
() 0
上一篇 07-15
下一篇 07-15

相关推荐

  • mysql驱动jar包怎么装 mysql驱动包与mysql版本

    当您使用Idea和PyCharm连接到MySQL时,可能会遇到以下错误:服务器返回无效时区。去’高级’标签和设置‘serverTimezone & # 8217属性。今天我整理几个解决方案,供大家参考。首先我们来定位一下原因:原因:服务器返回了无效的时区。转到“高级”选项卡,手动设

    2023-07-28 06:51:01
    998 0
  • html连接mysql数据库PHP eclipse连接mysql数据库步骤

    将模拟仿真数据插入Mysql数据库有时候,我们在测试网站的时候需要大量的仿真数据,但是php并没有提供生成仿真数据的工具。这个时候我想到了mockjs可以生成仿真数据。能否将Mockjs生成的仿真数据填充到数据库中?然后开始工作:例如,mysql数据库表是以下字段:因此,参考模拟文

    2023-07-27 10:17:01
    190 0
  • mysql最新版安装教程 mysql数据库建表方法

    升级版本选择原则和建议MySQL的升级需要遵循以下几条原则和建议:支持从MySQL5.7升级到8.0,注意仅支持GA版本之间的升级。不支持跨大版本的升级,如从5.6升级到8.0是不支持的。建议升级大版本前先升级到当前版本的最近小版本,如5.7先升级到5.7.35后再升级到8.0。在大版本内部

    2023-07-25 19:46:01
    968 0
  • mysql客户端哪个好用 最好的MySQL客户端推荐

    我们在选择工具的时候,往往会优先考虑那些免费的,好用的!Navicat作为一款付费软件,功能强大,但并不能阻止我们探索新的工具。最近体验了MySQL的官方客户端工具MySQL Workbench。本文将它与Navicat进行对比,看它能否取代Navicat!固定我们先安装MySQL Workbench。上面有个

    2023-07-22 08:56:01
    982 0

评论列表

联系我们

在线咨询: QQ交谈

邮件:admin@qq.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信