gpt4 book ai didi

mysql - 有没有办法强制 MySQL 执行顺序?

转载 作者:IT老高 更新时间:2023-10-28 23:47:36 26 4
gpt4 key购买 nike

我知道我可以通过使用 FORCE INDEX (abc) 关键字来改变 MySQL 执行查询的方式。但是有没有办法改变执行顺序呢?

我的查询是这样的:

SELECT c.*
FROM table1 a
INNER JOIN table2 b ON a.id = b.table1_id
INNER JOIN table3 c ON b.itemid = c.itemid
WHERE a.itemtype = 1
AND a.busy = 1
AND b.something = 0
AND b.acolumn = 2
AND c.itemid = 123456

我使用的每个关系/约束都有一个键。如果我对此语句运行解释,我会看到 mysql 首先开始查询 c。

id    select_type    table    type
1 SIMPLE c ref
2 SIMPLE b ref
3 SIMPLE a eq_ref

但是,我知道按 a -> b -> c 的顺序查询会更快(我已经证明了这一点)有没有办法告诉 mysql 使用特定的命令?

更新:这就是我知道 a -> b -> c 更快的原因。

上述查询需要 1.9 秒才能完成并返回 7 行。如果我将查询更改为

SELECT c.*
FROM table1 a
INNER JOIN table2 b ON a.id = b.table1_id
INNER JOIN table3 c ON b.itemid = c.itemid
WHERE a.itemtype = 1
AND a.busy = 1
AND b.something = 0
AND b.acolumn = 2
HAVING c.itemid = 123456

查询在 0.01 秒内完成(不使用 having 我得到 10.000 行)。然而,这不是一个优雅的解决方案,因为这个查询是一个简化的示例。在现实世界中,我从 c 连接到其他表。由于 HAVING 是一个对整个结果执行的过滤器,这意味着我会从数据库中提取比必要的更多的记录。

Edit2:只是一些信息:

  • 这个查询中的变量部分是c.itemid。其他一切都是固定值,不会改变。
  • 索引设置良好,mysql 为我选择了正确的索引
    • a 和 b 之间存在 1:n 关系(使用索引 PRIMARY)
    • b 和 c 之间存在多对多关系(使用索引 IDX_ITEMID)

重点是 mysql 应该开始查询表 a 并一直查询到 c 而不是相反。为实现这一目标而进行的任何更改。

解决方案:不完全是我想要的,但这似乎有效:

SELECT c.*
FROM table1 a
INNER JOIN table2 b ON a.id = b.table1_id
INNER JOIN table3 c ON b.itemid = c.itemid
WHERE a.itemtype = 1
AND a.busy = 1
AND b.something = 0
AND b.acolumn = 2
AND c.itemid = 123456
AND f.id IN (
SELECT DISTINCT table2.id FROM table1
INNER JOIN table2 ON table1.id = table2.table1_id
WHERE table1.itemtype = 1 AND table1.busy = 1)

最佳答案

也许你需要使用 STRAIGHT_JOIN

http://dev.mysql.com/doc/refman/5.0/en/join.html

STRAIGHT_JOIN is similar to JOIN, except that the left table is always read before the right table. This can be used for those (few) cases for which the join optimizer puts the tables in the wrong order.

关于mysql - 有没有办法强制 MySQL 执行顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3456134/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com