看到有资料说,where条件的顺序会影响查询的效率,根据的逻辑是:

where条件的运行是从右到左的,将选择性强的条件放到最右边,可以先过滤掉大部分的数据(而选择性不强的条件过滤后的结果集仍然很大),在根据其它条件过滤时,需要比较的数据量就少,提高查询的效率。

当我看到这个逻辑时,自我认为不是太合理,数据库引擎在执行SQL语句时,都是要经过查询优化器的,查询优化器会将SQL进行优化,选择最优的查询计划来执行,查询优化器应该会选择最优的查询计划,如果仅仅是因为where字句的顺序不同,就不能选择最优的查询计划,那么查询优化器得有多么差劲啊...

实践是检验真理的唯一标准

实验条件:
新建表test_condition,主键为id,还有两列表示姓名的name和年龄的age,数据量为10万条,年龄是18-45

单列的辅助索引

1. name列有索引

EXPLAIN
SELECT id,name,age from test_condition where name='test99500' and age=30

查询计划为

EXPLAIN
SELECT id,name,age from test_condition where age=30 and name='test99500'

查询计划为

从两者的查询计划上来看,两个没有什么区别。

2. name列有索引,age列有索引

EXPLAIN
SELECT id,name,age from test_condition where name='test99500' and age=30

查询计划

EXPLAIN
SELECT id,name,age from test_condition where age=30 and name='test99500'

查询计划

同样没有区别

多列的联合索引

联合索引<name,age>

表的索引:

1. 联合索引的列都使用

EXPLAIN SELECT * from test_condition where `name`='test100' and age = 30

查询计划:

EXPLAIN SELECT * from test_condition where age = 30 and `name`='test100'

查询计划:

结论: 当联合索引的列都出现在查询条件中时,查询条件的顺序不影响。

2. 仅使用联合索引中的一列

EXPLAIN SELECT * from test_condition where `name`='test100'

查询计划:

EXPLAIN SELECT * from test_condition where age = 30

查询计划:

修改表结构,增加dept列

EXPLAIN SELECT * from test_condition where `name`='test100' 

查询计划:

EXPLAIN SELECT * from test_condition where age = 30

查询计划:

在表只有id,name,age时,查询时仍然会用到索引,应该是因为使用到了覆盖索引(查询结果列在索引中都存在)。

当修改完表结构后,可以明确地看出,name条件查询用到了联合索引;而age查询时,使用不到联合索引。

结论:MySQL遵循最左前缀原理,当查询条件匹配联合索引的前面几列时,可以使用联合索引;否则,不会使用联合索引。

以上结果均是本人一次测试的结果,仅供参考,如有不对,欢迎指正。

转自:https://www.cnblogs.com/acode/p/7489258.html

MySQL查询where条件的顺序对查询效率的影响<转>的更多相关文章

  1. MySQL查询where条件的顺序对查询效率的影响

    看到有资料说,where条件的顺序会影响查询的效率,根据的逻辑是: where条件的运行是从右到左的,将选择性强的条件放到最右边,可以先过滤掉大部分的数据(而选择性不强的条件过滤后的结果集仍然很大), ...

  2. mysql 中语句执行的顺序以及查询处理阶段的分析

    原文链接:http://www.php.cn/mysql-tutorials-408865.html 本篇文章给大家带来的内容是关于mysql中语句执行的顺序以及查询处理阶段的分析,有一定的参考价值, ...

  3. 【mybatis】mybatis查询发生条件传入值但是查询并没有这个条件的查询,Integer类型查询条件需要注意事项

    有下面这样一个查询: 下面标紫色的查询条件,type的类型为Integer <select id="findDealerInfo" parameterType="c ...

  4. QBC查询、离线条件查询(DetachedCriteric)和分页查询模版

    一.QBC检索步骤 QBC检索步骤: 1.调用Session的createCriteria()方法创建一个Criteria对象. 2.设定查询条件.Expression类提供了一系列用于设定查询条件的 ...

  5. TP5 查询 字符串条件如何实现

      TP5 查询 字符串条件如何实现 当查询条件是 (1,3,8) ,3,4) 这种情况改如何查询呢?   主要用到FIND_IN_SET $where[ ]=>['exp',Db::raw(& ...

  6. Mybatis按照SQL查询字段的顺序返回查询结果,使用resultType="java.util.LinkedHashMap"

    在使用Mybatis开发时,Mybatis返回的结果集就是个map,当返回map时只需要做好SQL映射就好了,减少了代码量,简单便捷,缺点是不太方便维护,但是写大量的vo类去返回也挺累的,这个看你个人 ...

  7. ElasticSearch查询 第四篇:匹配查询(Match)

    <ElasticSearch查询>目录导航: ElasticSearch查询 第一篇:搜索API ElasticSearch查询 第二篇:文档更新 ElasticSearch查询 第三篇: ...

  8. 什么时候出现死锁,如何解决?mysql 引擎? 多个like or 查询sql如何优化?什么是常量池?for条件执行顺序

    1. 什么时候出现死锁,如何解决?mysql 引擎? 多个like or 查询sql如何优化? 资源竞争导致死锁,比如A B 同时操作两条记录,并等待对方释放锁. 优化sql, 加缓存,主从(如读写分 ...

  9. {MySQL的逻辑查询语句的执行顺序}一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析

    MySQL的逻辑查询语句的执行顺序 阅读目录 一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析 一 SEL ...

随机推荐

  1. JavaScript—异步提交表单的6种方式

    FormData的详细介绍及使用请点击此处,那里对FormData的方法和事件已经表述的非常清楚,这里就不再浪费时间在介绍一遍了.本文主要针对FormData对象的使用以及异步文件上传进行详细的说明. ...

  2. Python2.*与Python3.*共存问题

    安装Python 2.7后,本来在3.4下能正常使用的脚本无法运行.网上有的方法是把两个版本的主程序分别改名为python2和python3,人眼判断脚本,手输命令行执行脚本.像我这样喜欢双击.拖拽的 ...

  3. Hibernate关联关系之多对多

    多对多映射关系 建立多对多单向关联关系 创建Employee类: public class Employee { private Integer empid; //员工编号 private Strin ...

  4. docker 导出导入镜像

    1.docker export jenkins > my_jenkins.tar   导出镜像到本地 cat my_jenkins | docker import my_jenkens:0.0. ...

  5. mysql的基本查询(等于,不等于,between...and...,)

    单个字段多个字段查询 查询员工姓名 *注:在SQL语句中不区分大小写:SQL语句以“:”分号结束 select ename from emp; 注:select询句后面跟的是字段名称,select是关 ...

  6. jsp 出现cannot be resolved to a type问题解决办法

    (1)检查<%@ page import>是否导入了相关的包.若是没有则需导入 (2)若导入相应的包后问题仍然存在则需创建相关的servlet

  7. Python基础-列表推导式、匿名函数、os/sys/time/datetime/pymysql/xlwt/hashlib模块

    列表推导式 [表达式 for 变量 in range(n) if 条件]  等效于 for 变量 in in range(n): if 条件: 表达式 优点:书写方便,缺点:不易读 注意:用的是方括号 ...

  8. 读取html文件,让其中的内容和notepad打开这个html的样子一样。

    然后我写了个python代码,让其读取这个html文件后,内容和这个一样: htmlf=open('13144815898.html','r',encoding="utf-8") ...

  9. poj3614 Sunscreen(贪心+STL)

    https://vjudge.net/problem/POJ-3614 如果这不是优先队列专题里的,我可能不一定能想到这么做. 结构体命名得有点不好,解题中看着Edge这个不恰当的命名,思路老是断掉. ...

  10. HTML5 学习05—— 拖放(Drag 和 Drop)

    拖放(Drag 和 drop)是 HTML5 标准的组成部分.即抓取对象以后拖到另一个位置. 例:将w3cschool图标拖动到矩形框中. <script> function allowD ...