Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 多个';或';和';和';_Mysql_Sql_Indexing - Fatal编程技术网

Mysql 多个';或';和';和';

Mysql 多个';或';和';和';,mysql,sql,indexing,Mysql,Sql,Indexing,我有一个大型数据库,用来记录所有发生的事件。它就像一个票务系统。现在,由于我在同一列中存储了具有不同状态的数据以了解对特定票据的操作,因此我必须在语句中使用多个“or”来了解票据中的当前状态 例如:1表示已打开的票证,2表示确认,3表示事件已关闭。现在,选择1,2,3的所有事件的查询将是: SELECT * FROM tbl_name WHERE status IN (1, 2, 3) AND event_id = 1; 我为id字段创建了索引,为event\u id和sta

我有一个大型数据库,用来记录所有发生的事件。它就像一个票务系统。现在,由于我在同一列中存储了具有不同状态的数据以了解对特定票据的操作,因此我必须在语句中使用多个“or”来了解票据中的当前状态

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

SELECT * 
  FROM tbl_name 
 WHERE status IN (1, 2, 3) 
   AND event_id = 1;
我为
id
字段创建了索引,为
event\u id
status
字段创建了另一个索引
event\u status

现在,当我在这个查询上运行EXPLAIN时,它不使用event\u status索引,而是使用其他现有索引,如event\u status\u dept,它由event\u id、status和depart组成


如果我在
语句中只使用了两个字段,即“在(1,2)”中,它将使用
事件状态
索引,否则它将使用另一个索引,即事件状态。我不知道我的语句有什么问题

每个表访问使用多个索引通常效率很低:

一个串联索引,如您在事件id、状态、部门上的索引,是更好的解决方案

但是,MySQL有某种索引合并:


我认为您的查询没有任何问题。 优化器根据查询中的条件和它所持有的统计信息,使用它能找到的最佳索引。 如果超过一定百分比的记录满足条件,则索引无效

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

MySQL语句在解释输出中每行只能使用一个索引。请注意:如果您在
(event\u id,status,department)
上有索引,则
(event\u id,status)
上的索引是多余的。这两种方法中的任何一种都可以用于查询(速度没有任何差异)。但是MySQL在对表进行INSERT、update或DELETE时必须更新这两个索引。因此,您可以删除第二个无用的(在本例中)索引。谢谢Galz。当我对其他事件id使用相同的查询时,它会选择事件状态索引。所以一定是你建议的。