看到有资料说,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

最新文章

  1. prototype继承(1)
  2. JSP中ResultSet的方法
  3. 【C#】Json数据 排版算法
  4. Qt之键盘讲解
  5. web.xml相关知识摘录整理
  6. js中查找一个字符是否存在。
  7. extjs分组查询
  8. mysql索引和缓存
  9. Open source and free log analysis and log management tools.
  10. Qt exe图标
  11. 对Extjs中时间的多种处理
  12. Spring boot 1: 使用IDEA创建Spring boot项目
  13. Hadoop 2.2.0单节点的伪分布集成环境搭建
  14. 深度学习——优化器算法Optimizer详解(BGD、SGD、MBGD、Momentum、NAG、Adagrad、Adadelta、RMSprop、Adam)
  15. css的position
  16. 2019/2/11 LinuxRPM包管理
  17. Balanced Number HDU - 3709 数位dp
  18. 古代猪文:数论大集合:欧拉定理,exgcd,china,逆元,Lucas定理应用
  19. Codeforces 786 B. Legacy
  20. 使用HibernateDaoSupport抽取BaseDao

热门文章

  1. BZOJ4076 : [Wf2014]Maze Reduction
  2. CallContext,ThreadStatic,AsyncLocal&lt;T&gt;,ThreadLocal&lt;T&gt;,学习笔记
  3. 向json对象中添加数组
  4. 100405之python程序安装
  5. js的几个补充事件
  6. jQuery 学习03——HTML:捕获、设置、添加元素、删除元素、CSS类、CSS()方法、尺寸
  7. C# GDI+之Graphics类 z
  8. 《2019测试面试题-上海悠悠.pdf》
  9. 解析 ViewTreeObserver 源码(下)
  10. RestTemplate之GET和POST调用和异步回调