引言

这篇文章作为《面试官:谈谈你对mysql索引的认识》的续篇,我当时在写这篇的时候,考虑到篇幅问题所以略去了联合索引的内容,今天给大家补上。
本文预计分为两个部分:(1)联合索引部分的基础知识
在这个部分,我们温习一下联合索引的基础(2)联合索引部分的实战题
在这个部分,列举几个我认为算是实战中的代表题,挑出来说说。

正文

基础

讲联合索引,一定要扯最左匹配!放心,我不扯有的没的,几句话懂个大概就行!最左匹配
所谓最左原则指的就是如果你的 SQL 语句中用到了联合索引中的最左边的索引,那么这条 SQL 语句就可以利用这个联合索引去进行匹配,值得注意的是,当遇到范围查询(>、假设,我们对(a,b)字段建立一个索引,也就是说,你where后条件为

a = 

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

b= 

也是能匹配到索引的,因为Mysql有优化器会自动调整a,b的顺序与索引顺序一致。
相反的,你执行

b = 

就匹配不到索引了。
而你对(a,b,c,d)建立索引,where后条件为

1 

那么,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 and b = 2时a,b字段能用到索引的。而你执行a > 1 and b = 2时,a字段能用到索引,b字段用不到索引。因为a的值此时是一个范围,不是固定的,在这个范围内b值不是有序的,因此b字段用不上索引。

综上所示,最左匹配原则,在遇到范围查询的时候,就会停止匹配。

实战

OK,懂上面的基础,我们就可以开始扯了~我举了经典的五大题型,看完基本就懂!

题型一

如果sql为

SELECT * WHERE a = 

如何建立索引?
如果此题回答为对(a,b,c)建立索引,那都可以回去等通知了。
此题正确答法是:(a,b,c)或者(c,b,a)或者(b,a,c)都可以,重点要的是将区分度高的字段放在前面,区分度低的字段放后面。像性别、状态这种字段区分度就很低,我们一般放后面。

例如假设区分度由大到小为b,a,c。那么我们就对(b,a,c)建立索引。在执行sql的时候,优化器会帮我们调整where后a,b,c的顺序,让我们用上索引。

题型二

如果sql为

SELECT * WHERE a > 

如何建立索引?
如果此题回答为对(a,b)建立索引,那都可以回去等通知了。
此题正确答法是,对(b,a)建立索引。如果你建立的是(a,b)索引,那么只有a字段能用得上索引,毕竟最左匹配原则遇到范围查询就停止匹配。
如果对(b,a)建立索引那么两个字段都能用上,优化器会帮我们调整where后a,b的顺序,让我们用上索引。

题型三

如果sql为

SELECT * WHERE a > 

如何建立索引?
此题回答也是不一定,(b,a)或者(b,c)都可以,要结合具体情况具体分析。

拓展一下

SELECT * WHERE a = 

怎么建索引?嗯,大家一定都懂了!

题型四

SELECT * WHERE a = 

如何建立索引?
这还需要想?一看就是对(a,b)建索引,当a = 1的时候,b相对有序,可以避免再次排序!
那么

SELECT * WHERE a > 

如何建立索引?
对(a)建立索引,因为a的值是一个范围,这个范围内b值是无序的,没有必要对(a,b)建立索引。

拓展一下

SELECT * WHERE a = 

怎么建索引?

题型五

SELECT * WHERE a 

如何建立索引?
还是对(a,b)建立索引,因为IN在这里可以视为等值引用,不会中止索引匹配,所以还是(a,b)!

拓展一下

SELECT * WHERE a = 

如何建立索引?此时c排序是用不到索引的。

总结

希望大家在面试的时候遇到联合索引的题目,能够答出来吧

联合索引会创建几个索引_面试官:谈谈你对mysql联合索引的认识?相关推荐

  1. access建立两个字段唯一索引_面试官:谈谈你对mysql索引的认识?

    引言 这篇我们就来谈谈关于索引方面的mysql面试题.还是老规矩,讲的是在Innodb存储引擎下的情形,毕竟我还真没用过Mysiam之类的存储引擎. ps:其实很早就想写了,一直偷懒! 其实这下面每个 ...

  2. 面试官让我讲讲MySQL(索引篇)

    面试官让我讲讲MySQL(索引篇) 文章目录 面试官让我讲讲MySQL(索引篇) 1.请你说下你对MySQL架构的理解? 2.请你说下你对索引的理解? 3.那那那索引底层数据结构是什么呢? 4.那既然 ...

  3. mysql编写完怎么执行_面试官:一条MySQL更新语句是如何执行的?

    在面试中面试中如果被面试官问到在MySQL中一条更新语句是怎么执行的?,下面让我们来探究一下! 流程图 这是在网上找到的一张流程图,写的比较好,大家可以先看图,然后看详细阅读下面的各个步骤. 执行流程 ...

  4. 面试官问:为什么MySQL的索引不采用Kafka的索引机制

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 第一眼看到这个问题,也是很迷惑的,谁没事会问这种问题.然而,事实上 ...

  5. mysql 交集_面试官:来说说MySQL的常见优化方案……

    性能优化(Optimize)是在保证系统正确性的前提下,能够更快速响应请求的一种手段. 有些性能问题,比如慢查询等,如果积累到一定的程度或者是遇到急速上升的并发请求之后,会导致严重的后果,轻则造成服务 ...

  6. md5后得到的32位字符串存储到mysql中太占空间了_面试官:你对MySQL高性能优化有什么规范建议?...

    推荐阅读:吊打面试官!MySQL灵魂100问,你能答出多少? 文章篇幅较长,建议先收藏再找个合适的时间阅读 数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用 ...

  7. mysql重复记录大于十的数据库_面试官:在使用mysql数据库时,遇到重复数据怎么处理?...

    前言 前段时间,很多人问我能不能写一些数据库的文章,正好自己在测试mysql数据库性能的时候,出现了一个问题,也就是出现了很多重复的数据,想起来自己long long ago写过一篇类似的,仅此就拿来 ...

  8. jsp页面判断输入编号已存在mysql中_面试官让我聊聊Mysql基础架构之日志文件与数据文件...

    上一篇文章讲述了Mysql的基本框架,和sql执行的流程,这篇文章首先分析下每个流程的具体细节,然后介绍日志文件和数据文件以下面语句作为例子来分析流程中每一步的具体细节: select * from ...

  9. docker mysql日志_面试官问:了解Mysql主从复制原理么?我呵呵一笑

    搭建Mysql主从同步之前,我们先来说他们之间同步的过程与原理: 同步复制过程 献上一张图,这张图诠释了整个同步过程 主从复制过程: slave节点与主节点进行连接,建立主从关系,并把从哪开始同步,及 ...

最新文章

  1. 在DWZ框架中整合kindeditor复文本框控件
  2. JavaScript,等比例缩放图片的函数,很好用。
  3. 前端开发知识点解答-问题-面试问题
  4. Android系统(50)----Android窗口机制
  5. robot framework学习五——AutoltLibrary库
  6. Open3D+vs配置以及使用教程
  7. Code Commit Flow
  8. 哄女朋友玩的c语言编程,哄女朋友开心的小套路 逗女朋友开心的话套路
  9. LCA;未结合小扁豆凝集素(LCA)
  10. 看我是怎样捣鼓Linux的
  11. 即将发布的 Apache Spark 3.2 将内置 Pandas API
  12. mysql Events及存储过程查看
  13. java 获取本年第一天_java获取年份的第一天和最后一天
  14. 考研数学笔记26~30
  15. cannot delete inactive domain with nvram
  16. idea恢复被覆盖的本地未提交代码
  17. 在CygWin中设置proxy
  18. ios swift MVVM实例(Model-View-ViewModel)
  19. php防止灌水,如何防止网站论坛有效灌水
  20. 基于腾讯云Ubuntu主机搭建ghost

热门文章

  1. react-native 安卓支持 gif动态图
  2. VIJOS国庆节模拟赛之繁星春水
  3. SQL语句中order_by_、group_by_、having的用法区别
  4. 函数要多小才够好——谈小函数之道
  5. HttpWebRequest WebResponse 对象简单了解
  6. 不学Python迟早会被淘汰?Python真有这么好的前景?
  7. 希腊字母常用指代意义及其中文读音
  8. “人工智能的数理基础”主题论坛,五位学者从数学角度解决AI问题
  9. c语言 临时文件作用,c语言函数mktemp()产生唯一临时文件名实例源码介绍
  10. usessl mysql_mysql数据库连接useSSL=true