【问题标题】:MySQL composite index for OR condition用于 OR 条件的 MySQL 复合索引
【发布时间】:2017-07-07 11:21:23
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: mysql database indexing


    【解决方案1】:

    使用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)

    【讨论】:

    • @axiac 。 . .谢谢!
    • 第二个查询在不同顺序时如何使用索引(updated、upload_on、status)?
    • @sagarkalra 。 . .我不确定我是否理解你的问题。索引中的初始键需要匹配WHERE子句中的相等条件。
    • 知道了。谢谢。
    • 一般情况下WHERE中事物的顺序无关紧要; INDEX 中的订单确实如此。 (不过,这些索引中的顺序可能并不重要。)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-17
    • 1970-01-01
    • 2020-08-19
    • 1970-01-01
    • 1970-01-01
    • 2012-12-21
    相关资源
    最近更新 更多