在 MySQL 中,将 id 作为组合索引的最后一个字段是多余的吗?

问题描述 投票:0回答:1

了解

id
是主要关键...

假设我们在 MySQL 中有一个类似的索引

 account_id / assignee_id / is_public

但是需要此索引的查询的排序是通过

id
(主索引)

将索引更改为

account_id / assignee_id / is_public / id 

在数据库上更容易。 正确还是错误?

如果是这样,您在文档中哪里看到它?


查询的

account_id
子句中有
assignee_id
is_public
WHERE
,则按
id
排序。但是要排序的列是数据库中的主键,因此 MySQL 默认情况下会保持主键有序。
    

mysql indexing query-optimization
1个回答
0
投票

id

将从列上定义的索引中受益 
... WHERE account_id=? AND assignee_id=? AND is_public=? ORDER BY id

如果使用 InnoDB 存储引擎(多年来一直是 MySQL 中的默认存储引擎)定义表,则主键列将隐式附加到索引中。因此 

(account_id, assignee_id, is_public, id)

上的索引实际上是

(account_id, assignee_id, is_public)
上的索引,无需您指定。
如果您使用不同的存储引擎,则不一定正确(您应该有一个很好的理由这样做)。

如果 WHERE 子句中的任何条件未使用

(account_id, assignee_id, is_public, id)

,则规则会发生变化。如果使用任何不等式或范围比较,则索引的排序优化不起作用,MySQL 必须手动对结果进行排序。

在此处阅读有关 MySQL 如何优化 ORDER BY 的更多信息:

https://dev.mysql.com/doc/refman/en/order-by-optimization.html

您应该使用

EXPLAIN

来分析 MySQL 计划如何为您的查询使用索引。 您可能会喜欢我的演示文稿

真正如何设计索引

,或者我演示它的视频:https://www.youtube.com/watch?v=ELR7-RdU9XU

© www.soinside.com 2019 - 2024. All rights reserved.