gpt4 book ai didi

mysql - 如何防止此 JOIN 查询执行几乎全表扫描

转载 作者:行者123 更新时间:2023-11-29 01:54:15 33 4
gpt4 key购买 nike

items 中的数据集包含大约 440 万行

updatedcreated 在每个表上单独索引

EXPLAIN SELECT i.id, j.id 
FROM jobs j
JOIN items i ON j.items_id = i.id
WHERE j.updated > DATE_SUB(NOW(), INTERVAL 60 MINUTE)
OR j.created > DATE_SUB(NOW(), INTERVAL 60 MINUTE)
OR i.updated > DATE_SUB(NOW(), INTERVAL 60 MINUTE);

这是我得到的:

1   SIMPLE  i   index   PRIMARY,updated_idx                     updated_idx       5     NULL            4168353    Using index
1 SIMPLE j ref items_id_idx,updated_idx,created_idx items_id_idx 9 my_db.i.id 1 Using where

如您所见,在使用 updated_idx 时,仍然接近全表扫描。

为什么会发生这种情况,我是否可以避免这种情况?

也试过这个,但是效果更差:

EXPLAIN SELECT i.id, j.id 
FROM jobs j
WHERE j.updated > DATE_SUB(NOW(), INTERVAL 60 MINUTE)
OR j.created > DATE_SUB(NOW(), INTERVAL 60 MINUTE)
OR j.items_id IN
(SELECT i.id FROM items i WHERE i.updated > DATE_SUB(NOW(), INTERVAL 60 MINUTE));

最佳答案

MySql 没有优化或在 where 标准中的条件太好。将您的查询重写为 3 个单独的选择并加入联合。这样每个查询都可以利用适当的索引:

SELECT i.id, j.id 
FROM jobs j
JOIN items i ON j.items_id = i.id
WHERE j.updated > DATE_SUB(NOW(), INTERVAL 60 MINUTE)
UNION DISTINCT
SELECT i.id, j.id
FROM jobs j
JOIN items i ON j.items_id = i.id
WHERE j.created > DATE_SUB(NOW(), INTERVAL 60 MINUTE)
UNION DISTINCT
SELECT i.id, j.id
FROM jobs j
JOIN items i ON j.items_id = i.id
WHERE i.updated > DATE_SUB(NOW(), INTERVAL 60 MINUTE);

关于mysql - 如何防止此 JOIN 查询执行几乎全表扫描,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33489206/

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