mysql - 带有多个and子句的Mysql查询的执行顺序是什么?
问题描述
就像,如果你有一个查询
select * from employee where name = "John Dao" and location = "New York" and salary > 1000
在此查询中,AND
子句如何工作。它会先获取名为 John Dao 的结果集,然后对获取的结果集执行过滤器的位置等。或者它只是获取满足所有条件的结果吗?
如果我们更改查询中语句的顺序,查询响应是否有任何变化AND
?
解决方案
WHERE name = 'John dao'
AND location = 'New York'
AND salary > 1000
情况1,没有相关索引: 它将获取所有行,检查3列,直到其中一列失败或全部成功。检查的顺序无关紧要,除非存在复杂的问题,例如 UDF、FULLTEXT、子查询、非确定性函数等。数字和字符串、相等和不相等无关紧要。
案例 2:INDEX
在这 3 列中的每一个上单独设置: 优化器将使用可用的(尽管是粗略的)统计信息来决定 3 个子句中的哪一个将被过滤掉最多的行。然后其他两个检查将通过使用PRIMARY KEY
(隐式附加到索引上)对数据进行,以在数据的 BTree 中定位数据行。从该行中,它可以得到另外两列来完成过滤。MySQL 在这种情况下使用多个索引是非常罕见的。
Case 3: INDEX(name, location, salary)
or INDEX(location, name, salary)
: 这两种方法中的任何一种都是执行查询的最佳选择。请注意,用 测试的列在中排=
在首位,与INDEX
中的顺序无关WHERE
。它将向下钻取 BTree 到纽约的第一个工资 > 1000 的 John dao。然后它将在 B+Tree 中向前扫描以查找所有此类行。假设*
(of SELECT *
) 涉及的列多于这 3 列,则案例 3 将不得不进入数据 BTree 以获取其余列。请注意,这比案例 2 更好,因为它在到达另一个 BTree 之前完成了所有过滤。
有关设计最佳索引的更多信息:http: //mysql.rjweb.org/doc.php/index_cookbook_mysql
推荐阅读
- java - 如何在 Jenkins 中设置 AWS 凭证?
- groovy - 没有这样的属性:类的 api:groovy.lang.Binding 错误
- javascript - 为什么当我使用代码但在 codepen 上工作时,anime.js 示例不起作用?
- c++ - Qt/C++ 连接经典蓝牙设备
- python - 在没有条件语句的情况下在 python 中实现重载函数的最佳方法是什么?
- python-3.x - ValueError:检查输入时出错:预期 lstm_10_input 的形状为 (679, 1) 但得到的数组的形状为 (1, 1)
- c++ - 如何确定 QTextCodec 是否与 ASCII 兼容?
- python - 加快从 pandas 数据帧到 mysql 的数据插入
- javascript - jQuery(document).on("click") & document.getElementById('sign-out').addEventListener('click') 的区别
- javascript - 如何根据颜色选择器值 onclick 的值更改元素颜色