首页 > 解决方案 > 带有多个and子句的Mysql查询的执行顺序是什么?

问题描述

就像,如果你有一个查询

select * from employee where name = "John Dao" and location = "New York" and salary > 1000

在此查询中,AND子句如何工作。它会先获取名为 John Dao 的结果集,然后对获取的结果集执行过滤器的位置等。或者它只是获取满足所有条件的结果吗?

如果我们更改查询中语句的顺序,查询响应是否有任何变化AND

标签: mysqlperformance

解决方案


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


推荐阅读