我有一个大型数据库,用于记录所有发生的事件。这就像一个票务系统。现在,由于我存储了不同状态的数据来了解同一列中特定工单的操作,因此我必须在语句中使用多个“或”来了解工单中的当前状态。
例如:1 表示已打开的工单,2 表示确认,3 表示事件已关闭。现在选择具有 1,2,3 的所有事件的查询将是:
SELECT *
FROM tbl_name
WHERE status IN (1, 2, 3)
AND event_id = 1;
我已为 id
字段创建了索引,并为 event_id
和 status
字段创建了另一个索引 event_status
.
现在,当我对此查询运行 EXPLAIN 时,它不使用 event_status 索引,而是使用其他现有索引,例如 event_status_dept,其中包含 event_id、状态和部门。
如果我在 IN 中仅使用两个字段,即“IN (1,2)”
语句,则它使用 event_status
索引,否则它使用另一个索引,即 event_status_dept。我不知道我的说法有什么问题。
最佳答案
我认为您的查询没有任何问题。 优化器根据查询中的条件和它保存的统计信息使用它能找到的最佳索引。 如果超过一定比例的记录满足条件,则索引无效。
示例: 如果优化器的统计数据表明表中只有 5% 的事件属于类型 1,2,则这将是一个有效的索引并且它将使用它。 但如果 70% 的事件属于类型 1、2、3,则该索引无效,优化器可能会使用其他索引或根本不使用索引。
关于Mysql索引有多个 'or'和 'and'的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6675175/