我有一个大型数据库,用于记录所有发生的事件。这就像一个票务系统。现在,由于我存储了具有不同状态的数据以了解同一列中某个故障单上的操作,因此我需要在语句中使用多个“或”来了解故障单中的当前状态。
例如:1表示打开的票证,2表示确认,3表示事件已关闭。现在,用1,2,3选择所有事件的查询将是:
SELECT *
FROM tbl_name
WHERE status IN (1, 2, 3)
AND event_id = 1;
我为id
字段创建了索引,为event_status
和event_id
字段创建了另一个索引status
。
现在,当我对此查询运行EXPLAIN时,它不使用event_status索引,而是使用其他现有索引,如event_status_dept,其中包含event_id,status和department。
如果我在IN i.e 'IN (1,2)'
语句中只使用两个字段,则它使用event_status
索引,否则它使用另一个索引,即event_status_dept。我不知道我的陈述有什么问题。
答案 0 :(得分:3)
我认为您的查询没有任何问题。 优化程序根据查询中的条件及其保存的统计信息使用它可以找到的最佳索引。 如果超过一定百分比的记录满足条件,则索引无效。
实施例: 如果优化器的统计信息表明表中只有5%的事件属于1,2类型,那么这将是一个有效的索引,它将使用它。 但是如果70%的事件都是1,2,3类型,那么这个索引无效,优化器可能会使用另一个索引或根本没有索引。
答案 1 :(得分:0)
每个表访问使用多个索引通常效率很低:
http://use-the-index-luke.com/sql/where-clause/searching-for-ranges/index-merge-performance
连接索引,就像你在event_id,status,department上一样,是更好的解决方案。
但是,MySQL有某种索引合并:
http://dev.mysql.com/doc/refman/5.5/en/index-merge-optimization.html