了解
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 默认情况下会保持主键有序。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.htmlEXPLAIN来分析 MySQL 计划如何为您的查询使用索引。 您可能会喜欢我的演示文稿
真正如何设计索引,或者我演示它的视频:https://www.youtube.com/watch?v=ELR7-RdU9XU