我有一个巨大的表,我想在上面运行带有 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 子句并在其上创建单列索引?
使用
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)
。
按照 OR 条件拆分查询,并使用应用程序逻辑并行这些查询。如果只能运行一个查询,则使用 union-all。但请记住 union-all 与顺序运行两个查询相同。