2011-07-13 20 views
2

我有一个大型数据库正在用来记录所有发生的事件。这就像售票系统。现在,由于我存储了具有不同状态的数据以知道同一列中某个故障单上的操作,因此我必须在语句中使用多个“或”来了解故障单中的当前状态。Mysql索引问题与多个'或'和'和'

例如:1表示开票,2表示确认,3表示关闭事件。现在查询选择具有1,2,3所有的事件将是:对于id

SELECT * 
    FROM tbl_name 
WHERE status IN (1, 2, 3) 
    AND event_id = 1; 

我已经创建了索引,并为event_idstatus领域的又一指标event_status

现在,当我在此查询上运行EXPLAIN时,它不使用event_status索引,而是使用其他现有索引,如event_status_dept,它由event_id,status和department组成。

如果我在IN i.e 'IN (1,2)'语句中只使用两个字段,它将使用event_status索引,否则它使用另一个索引,即event_status_dept。我不知道我的发言有什么问题。

+1

MySQL语句只能在EXPLAIN输出中每行使用一个索引 –

+1

只需注意:如果在'(event_id,status,department)'上有索引,'(event_id,status)'上的索引是多余的。这两者中的任何一个都可以用于您的查询(速度没有任何差异)。但是,当对表进行INSERT,UPDATE或DELETE时,MySQL必须更新两个索引。所以,你可以删除第二个无用的(在这种情况下)索引。 –

回答

3

我觉得没有什么是错的查询。 优化程序根据查询中的条件及其保存的统计信息使用它可找到的最佳索引。 如果超过一定百分比的记录满足条件,则索引无效。

例如: 如果优化器的统计数据表明只有5%的表中的事件属于1,2类型,那么这将是一个有效的索引,它将使用它。 但是,如果70%的事件属于1,2,3类型,则此索引无效,优化程序可能使用另一个索引或根本没有索引。

+0

谢谢Galz。当我对其他event_id使用相同的查询时,它会选择event_status索引。所以必须如你所建议的那样。 – Prakash