返回顶部
首页 > 资讯 > 数据库 >MySQL最左匹配原则深入分析
  • 128
分享到

MySQL最左匹配原则深入分析

2024-04-02 19:04:59 128人浏览 八月长安
摘要

目录前言全列匹配最左前缀匹配精确匹配查询条件没有指定索引第一列匹配某列的前缀字符串范围查询查询条件中含有函数或表达式前言 接下来我们通过几种情况来描述最左匹配原则的使用。首先如下所示,为userName、phone以及u

前言

接下来我们通过几种情况来描述最左匹配原则的使用。首先如下所示,为userName、phone以及userDate创建联合索引。

MySQL最左匹配原则深入分析

全列匹配

explain select * from user where userName ='admin' and phone ='13413413400' 
and userDate ='2000-04-29-12:53'

MySQL最左匹配原则深入分析

很明显,当按照索引中所有列进行精确匹配(这里精确匹配指“=”或“IN”匹配)时,索引可以被用到。这里有一点需要注意,理论上索引对顺序是敏感的,但是由于Mysql的查询优化器会自动调整where子句的条件顺序以使用适合的索引,例如我们将where中的条件顺序颠倒,其效果是一样的。

explain select * from user where userName ='admin'  
and userDate ='2000-04-29-12:53' and phone ='13413413400'

MySQL最左匹配原则深入分析

最左前缀匹配

比如我们where条件中只有userName:

explain select * from user where userName ='admin' 

MySQL最左匹配原则深入分析

当查询条件精确匹配索引的左边连续一个或几个列时,如userName,索引可以被用

到,但是只能用到一部分,即条件所组成的最左前缀。

上面的查询从分析结果看用到了 const 索引,key_len为152,说明只用到了索引的第一列前缀。

精确匹配

查询条件用到了索引中列的精确匹配,但是中间某个条件未提供

比如下面我们没有phone:

explain select * from user where userName ='admin' 
and userDate ='2000-04-29-12:53'

MySQL最左匹配原则深入分析

注意,上图Extra中值是Using index condition,说明mysql正在使用覆盖索引,它只扫描索引的数据而不是按索引次序的每一行。它比按索引次序全表扫描的开销要少很多。

此时索引使用情况和情况二相同,因为phone未提供,所以查询只用到了索引的第一列,而后面的userDate虽然也在索引中,但是由于phone不存在而无法和左前缀连接,因此需要对结果进行扫描过滤userDate。

如果想让userDate也使用索引而不是where过滤,可以增加一个辅助索引<userName, userDate>,此时上面的查询会使用这个索引。

查询条件没有指定索引第一列

由于不是最左前缀,索引这样的查询显然用不到索引。

explain select * from user where userDate ='2000-04-29-12:53'

MySQL最左匹配原则深入分析

Using where:使用了用where子句来过滤结果集。这意味着Mysql服务器将在存储引擎检索行后再进行过滤。

匹配某列的前缀字符串

explain select * from user where userName ='admin' and phone like '134%' 
and  userDate ='2000-04-29-12:53'

MySQL最左匹配原则深入分析

此时可以用到索引,如果通配符%不出现在开头,则可以用到索引,但根据具体情况不同可能只会用其中一个前缀。

范围查询

explain select * from user where userName ='admin' and phone >'134' 
and  userDate ='2000-04-29-12:53'

MySQL最左匹配原则深入分析

范围列可以用到索引(必须是最左前缀),但是范围列后面的列无法用到索引。同时,索引最多用于一个范围列,因此如果查询条件中有两个范围列则无法全用到索引。

这里特别要说明MySQL一个有意思的地方,那就是仅用explain可能无法区分范围索引和多值匹配,因为在type中这两者都显示为range。同时,用了“between”并不意味着就是范围查询,例如下面的查询:

explain select * from user where userName ='admin' and phone 
between '13413413400' and '13513513500' and  userDate ='2000-04-29-12:53'

MySQL最左匹配原则深入分析

看起来是用了两个范围查询,但作用于phone上的“BETWEEN”实际上相当于“IN”,也就是说phone实际是多值精确匹配。可以看到这个查询用到了索引全部三个列。因此在MySQL中要谨慎地区分多值匹配和范围匹配,否则会对MySQL的行为产生困惑。

查询条件中含有函数或表达式

如果查询条件中含有函数或表达式,则MySQL不会为这列使用索引。

explain select * from user where userName ='admin' 
and left(phone ,6) and  userDate ='2000-04-29-12:53'

MySQL最左匹配原则深入分析

可以看到这个其实就是只用到了userName这一列的索引。

关于explain中各个关键字说明可以参考:认真学习传送门

到此这篇关于MySQL最左匹配原则深入分析的文章就介绍到这了,更多相关MySQL最左匹配内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

您可能感兴趣的文档:

--结束END--

本文标题: MySQL最左匹配原则深入分析

本文链接: https://lsjlt.com/news/116997.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MySQL最左匹配原则深入分析
    目录前言全列匹配最左前缀匹配精确匹配查询条件没有指定索引第一列匹配某列的前缀字符串范围查询查询条件中含有函数或表达式前言 接下来我们通过几种情况来描述最左匹配原则的使用。首先如下所示,为userName、phone以及u...
    99+
    2024-04-02
  • 深入浅析Mysql联合索引最左匹配原则
    前言 之前在网上看到过很多关于mysql联合索引最左前缀匹配的文章,自以为就了解了其原理,最近面试时和面试官交流,发现遗漏了些东西,这里自己整理一下这方面的内容。 最左前缀匹配原则 在mysql建立联合...
    99+
    2024-04-02
  • MySQL最左匹配原则详细分析
    目录阐述一、最左匹配原则的原理二、违背最左原则导致索引失效的情况三、查询优化器偷偷干了哪些事儿四、知识点阐述 通常我们在建立联合索引的时候,相信建立过索引的同学们会发现,无论是oracle 还是 mysql 都会让我们选...
    99+
    2022-12-16
    MySQL最左匹配 MySQL最左匹配原则
  • mysql索引最左匹配原则
    索引最左匹配原则要求多列索引查询时,必须从最左边的列开始连续匹配条件,违反此原则将导致全表扫描。 MySQL 索引最左匹配原则 什么是索引最左匹配原则? 索引最左匹配原则规定,对于多列...
    99+
    2024-08-01
    mysql mysql索引
  • Mysql 联合索引最左匹配原则
    最左前缀匹配原则: 在MySQL建立联合索引时会遵守最左前缀匹配原则,即最左优先. 在检索数据时从联合索引的最左边开始匹配,Mysql会一直向右匹配直到遇到范围查询(>、5 and d=6如果建立(a...
    99+
    2023-09-03
    数据库 java
  • MySQL索引最左匹配原则是什么
    本篇内容介绍了“MySQL索引最左匹配原则是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • MySQL索引最左匹配原则实例详解
    目录简介准备理论详解聚集索引和非聚集索引回表查询索引覆盖最左匹配原则详细规则补充:为什么要使用联合索引总结简介 这篇文章的初衷是很多文章都告诉你最左匹配原则,却没有告诉你,实际场景下它到底是如何工作的,本文就是为了阐述清...
    99+
    2024-04-02
  • MySQL数据库索引的最左匹配原则
    目录一. 联合索引说明二. 那ac是否能用到索引呢?三. 思考四. 最左匹配原则的成因一. 联合索引说明 建立三个字段的联合索引 联合索引(a,b,c)相当于建立了索引:(a),(a...
    99+
    2024-04-02
  • MySQL组合索引与最左匹配原则详解
    前言 之前在网上看到过很多关于mysql联合索引最左前缀匹配的文章,自以为就了解了其原理,最近面试时和面试官交流,发现遗漏了些东西,这里自己整理一下这方面的内容。 什么时候创建组合索引? 当我们...
    99+
    2024-04-02
  • MySQL联合索引遵循最左前缀匹配原则
    面试官: 我看你的简历上写着精通mysql,问你个简单的问题,MySQL联合索引有什么特性? 心想,这还不简单,这不是问到我手心里了吗? 听我给你背一遍八股文! 我: MySQL联合索引遵循最左前缀匹...
    99+
    2022-08-16
    MySQL联合索引 MySQL最左前缀匹配原则
  • MySQL数据库索引的最左匹配原则是什么
    这篇文章主要为大家展示了“MySQL数据库索引的最左匹配原则是什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“MySQL数据库索引的最左匹配原则是什么”这篇文章吧。一. 联合索引说明建立三个字...
    99+
    2023-06-25
  • 验证Mysql中联合索引的最左匹配原则详情
    目录前言如何验证联合索引的有效性多个单一索引进行验证联合索引总结前言 后端面试中一定是必问mysql的,在以往的面试中好几个面试官都反馈我Mysql基础不行,今天来着重复习一下自己的...
    99+
    2022-11-13
    Mysql联合索引最左匹配 Mysql中联合索引
  • MySQL索引左前缀匹配规则
    MySQL索引最左原则原理及代码示例 在MySQL中,索引是提高查询效率的重要手段之一。其中,索引最左原则是我们在使用索引优化查询的过程中需要遵循的一个重要原则。本文将围绕MySQL索...
    99+
    2024-02-24
    原理 mysql索引 最左原则
  • mysql为什么是最左匹配
    本篇文章给大家分享的是有关mysql为什么是最左匹配,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。mysql为什么是最左匹配1.因Mysql创...
    99+
    2024-04-02
  • MySQL索引设计原则深入分析讲解
    哪些情况适合创建索引? 字段的数值有唯一性的限制 索引本身可以起到约束的作用,比如唯一索引,主键索引都是可以起到唯一性约束的,因此在我们的数据表中如果某个字段是唯一性的,就可以直接创...
    99+
    2023-01-02
    MySQL索引设计原则 MySQL索引
  • JavaScript单一职责原则深入分析
    目录单一职责原则设计模式中的SRP原则何时应该分离职责违反 SRP 原则SRP 原则的优缺点单一职责原则 就一个类而言,应该仅有一个引起它变化的原因。在 JavaScript 中,需...
    99+
    2022-11-13
    JavaScript单一职责原则 JavaScript单一职责 JavaScript设计模式
  • mysql中怎么实现索引最左原则
    这期内容当中小编将会给大家带来有关mysql中怎么实现索引最左原则,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。建表CREATE TABLE `use...
    99+
    2024-04-02
  • mysql中索引的最左原则是什么
    今天就跟大家聊聊有关mysql中索引的最左原则是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1、MySQL不会使用索引的情况:非独立的列独立的列是指索引列不能是表达式的一部分,...
    99+
    2023-06-15
  • Mysql索引的最左前缀原则是什么
    这篇文章主要介绍了Mysql索引的最左前缀原则是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Mysql索引的最左前缀原则是什么文章都会有所收获,下面我们一起来看看吧。前言之所以有这个最左前缀索引归根结底是...
    99+
    2023-06-29
  • ReactFiber原理深入分析
    目录为什么需要 fiberfiber 之前fiber 之后fiber 节点结构dom 相关属性tagkey 和 typestateNode链表树相关属性副作用相关属性flagsEff...
    99+
    2023-01-10
    React fiber原理 React fiber架构 React fiber算法
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作