我有一个名为my_table
的表,其中包含did
,uid
和pid
列。
该表的索引是:
(uid, did, pid)
- 唯一(did)
(did, pid)
现在我有一个如下所示的查询:
SELECT * FROM my_table WHERE did = 1234
此查询在~12秒内匹配~150k行;但如果我删除最后一个索引,它会在~1秒内完成
有人可以解释发生了什么吗?
答案 0 :(得分:0)
第一个查询可能发现它需要的大多数块都位于磁盘上。因此12秒主要是I / O.然后第二个查询发现它需要的所有东西都缓存在buffer_pool中,所以它可以运行10倍。
如需进一步讨论,请执行以下操作:
EXPLAIN SELECT ... -- for both cases
SHOW CREATE TABLE -- there are _many_ things here that _may_ impact your question
How much RAM do you have?
SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
由于INDEX(did, pid)
可以执行INDEX(did)
想做的任何操作,通常可以删除更短的索引。