简体   繁体   English

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

[英]How to prevent this JOIN query from doing an almost full table scan

The dataset in items contains about 4.4 million rows 项目中的数据集包含约440万行

updated and created are indexed individually on each table 在每个表上分别对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);

Here is what I get: 这是我得到的:

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

As you can see the items, while using updated_idx , still runs close to a full table scan. 如您所见,在使用updated_idx ,这些项目仍然接近全表扫描。

Why is this happening, and is there anyway I can avoid this? 为什么会这样,无论如何我都可以避免这种情况?

Also tried this, but it performs worse: 也尝试过此方法,但性能较差:

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 does not optimize or conditions in the where criteria too well. MySql没有优化或在where条件中设置的条件太好。 Rewrite your query as 3 separate selects joined with union. 将查询重写为3个单独的选择,并与并集相连。 This way each query can utilise the appropriate indexes: 这样,每个查询都可以利用适当的索引:

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);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM