MySQL如何选择索引?

时间:2016-08-04 11:21:44

标签: mysql database indexing

我有一个名为my_table的表,其中包含diduidpid列。 该表的索引是:

  • (uid, did, pid) - 唯一
  • (did)
  • (did, pid)

现在我有一个如下所示的查询:

SELECT * FROM my_table WHERE did = 1234

此查询在~12秒内匹配~150k行;但如果我删除最后一个索引,它会在~1秒内完成

有人可以解释发生了什么吗?

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)想做的任何操作,通常可以删除更短的索引。