【问题标题】:How MySQL selects indexes?MySQL如何选择索引?
【发布时间】:2016-12-10 11:55:57
【问题描述】:

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

  • (uid, did, pid) - 独一无二的
  • (did)
  • (did, pid)

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

SELECT * FROM my_table WHERE did=1234

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

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

【问题讨论】:

  • 听起来像一个边缘案例。请做一个分析表。如果结果仍然很慢发布全表结构和解释结果,并且还指示表中的总行数
  • 专业提示:避免使用 SELECT * 。而是提供您需要的列的列表。有时查询规划器可以利用该列表来优化您的查询。

标签: mysql database indexing


【解决方案1】:

第一个查询可能发现它需要的大部分块都位于磁盘上。因此,这 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) 想做的事情,所以通常最好删除较短的索引。

【讨论】:

    猜你喜欢
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 2022-12-31
    • 2011-01-13
    相关资源
    最近更新 更多