MySQL OR 条件复合索引

问题描述 投票:0回答:2

我有一个巨大的表,我想在上面运行带有 or 条件的查询

SELECT id, upload_key 
FROM product_data 
WHERE (status = 0 or updated = 0) and uploaded_on is NULL;

该表现在超过 5000 万条记录,执行需要几分钟。我尝试在键 status、updated 和 uploaded_on 上创建复合索引(与查询的顺序相同),但事实证明,查询不使用在两个不同列上带有 OR 的复合索引。

有没有办法创建索引来优化查询,或者我应该将 uploaded_on 作为第一个 where 子句并在其上创建单列索引?

mysql database indexing
2个回答
2
投票

使用

union all
:

编写查询
SELECT id, upload_key 
FROM product_data 
WHERE status = 0 and uploaded_on is NULL
UNION ALL
SELECT id, upload_key 
FROM product_data 
WHERE status <> 0 and updated = 0 and uploaded_on is NULL;

您需要两个索引:

(status, uploaded_on)
(updated, uploaded_on, status)


0
投票

按照 OR 条件拆分查询,并使用应用程序逻辑并行这些查询。如果只能运行一个查询,则使用 union-all。但请记住 union-all 与顺序运行两个查询相同。

© www.soinside.com 2019 - 2024. All rights reserved.