mysql 强制优先执行_有没有办法强制执行MySQL的执行顺序?

我知道我可以通过使用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

我有一个钥匙,我使用的每个关系/约束。如果我在这个语句上运行explain,我看到mysql首先开始查询c。

id select_type table type

1 SIMPLE c ref

2 SIMPLE b ref

3 SIMPLE a eq_ref

但是,我知道按以下顺序查询 – > b – > c会更快(我已经证明了)

有没有办法告诉mysql使用特定的顺序?

更新:这就是我知道 – > 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秒内完成(不使用我得到10.000行)。

但是,这不是一个优雅的解决方案,因为这个查询是一个简化的例子。在现实世界中,我已经从c加入到其他表。因为HAVING是一个在整个结果上执行的过滤器,这意味着我将从db中提取一些更多的记录,而不是nescessary。

编辑2:只是一些信息:

>此查询中的变量部分是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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值