我在MYSQL数据库中有一个流表。它具有以下列 taskId、wName、key、status、envNo、updateTime 等。没有与其他表连接。它具有以下索引:index1 (taskId)、index2 (wName、key、name、evnNo)、index3 (name)、index4 (key)、index5 (updateTime)、index6 (envNo)
查询1:
Below query giving me 11 records
select * from Flow where status = 0 and wName = 'abc' order by updateTime LIMIT 50
Running Explain on above query giving below response:
type: index, possible_key: index2, actual_key: index5, rows : 3000, Filtered: 0.05, Extra : Using Where
查询2:
Below query giving me 50 records
select * from Flow where status = 0 and wName = 'xyz' order by updateTime LIMIT 50
Running Explain on above query giving below response:
type: index, possible_key: index2, actual_key: index5, rows : 108, Filtered: 1.84, Extra : Using Where
以下是 Flow 表中指定 wName 的总可用记录。
select count(*) from Flow where wName = 'abc' - it gives me 3000 records.
select count(*) from Flow where wName = 'xyz' - it gives me 120000 records.
这里的问题是查询 1 在 20 秒内响应,而查询 2 在不到 1 秒内响应。为什么会这样?与查询 2 相比,查询 1 的数据非常少。
当我删除时LIMIT 50
,两个查询都会在几毫秒内响应。
当我删除时order by updateTime
,两个查询都会在几毫秒内响应。
请注意,我无法更新索引,因为除了这种情况之外一切都运行正常。
到目前为止,我已经找到了以下根本原因。
- 行可能在存储中分布不均,从而导致碎片化。
- 由于选择性低,MySQL 可能无法有效使用索引。
如果以上是原因,我该如何证明这些原因?如果这不是原因,可能的原因是什么?