我应该将ID(主键)添加到表的复合索引中吗?

Dan*_*min 4 mysql sql database

我想知道是否需要将主键添加到特定表的复合索引中。

让我们以这个查询为例:

SELECT id
FROM listings
WHERE account_id = 123 AND
      refreshed_at < '2018-01-05 09:33:15.314763' AND
      id > 123456
ORDER BY id ASC
LIMIT 1000
Run Code Online (Sandbox Code Playgroud)

所以我们可以看到这里有 3 个正在查询的字段:

  1. ID(清单表的主键)
  2. 帐户ID
  3. 刷新时间

到目前为止,我有以下索引:[“account_id”,“refreshed_at”]

我应该将 ID 添加到组合键以提高性能吗?

Bil*_*win 8

我假设该表是 InnoDB,因为它是默认存储引擎。

您不需要将主键添加到二级索引。即使您没有明确添加它,它也已包含在每个索引的末尾。

也就是说,在您显示的查询中,它可能无法使用id或 ORDER BY 上的条件的索引,因为您有一个范围条件refreshed_at < '2018-01-05'。一旦将索引中的列用于范围条件,索引中的后续列将无法帮助搜索或排序。

您可能会喜欢我的演示:如何设计索引,真的