Mysql索引有多个 'or'和 'and'的问题

标签 mysql sql indexing

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

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

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

我已为 id 字段创建了索引,并为 event_idstatus 字段创建了另一个索引 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/

相关文章:

MySQL 加载缓慢 - 分页

php - 通过 php api 从数据库获取图像 url 时获取空白 json 响应

MySQL 按列值分组 block ,按其他列排序

python - Algolia 索引的 ObjectID 列表

mysql - 从哪里开始优化/添加索引以加快查询速度?

javascript - 带有超时的JS函数应该每4秒发送一次数据,但只发送1次

mysql - 无法创建表 'mydb.contact'(错误号 : 150)

php - 无法运行查询 : SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'membersince' cannot be null

c++ - 实现自定义 Postgres 索引作为扩展

sql - 两个 SQL COUNT() 查询?