如果在查询中使用order by,如何在MySQL中订购索引列?

时间:2017-11-15 02:11:28

标签: mysql indexing

我正在阅读一篇关于Pinterest如何分割MySQL数据库的文章:https://medium.com/@Pinterest_Engineering/sharding-pinterest-how-we-scaled-our-mysql-fleet-3f341e96ca6f

这里他们有一个表格的例子:

CREATE TABLE board_has_pins (
  board_id INT,
  pin_id INT,
  sequence INT,
  INDEX(board_id, pin_id, sequence)
) ENGINE=InnoDB;

他们正在展示他们如何从该表中查询:

SELECT pin_id FROM board_has_pins 
WHERE board_id=241294561224164665 ORDER BY sequence 
LIMIT 50 OFFSET 150

我在这里不明白的是索引的排序。如果索引是这样的话会不会更有意义,因为它们按顺序排序并通过board_id过滤?

INDEX(board_id, sequence, pin_id)

我在这里遗漏了什么,或者我误解了索引是如何工作的?

1 个答案:

答案 0 :(得分:2)

你是对的。此查询的更好索引是:

INDEX(board_id, sequence, pin_id)

列应按此顺序排列:

  • 参与平等比较的专栏。如果有多列,则它们的顺序无关紧要。
  • 列涉及ORDER BY子句,其顺序与ORDER BY中出现的顺序相同。
  • 用于获取值的其他列,例如pin_id

一旦相等条件找到了匹配行的子集,它们都与它们的顺序相关联,因为它们对于质量条件的列自然都具有相同的值(在这种情况下为board_id)。

根据索引中下一列的顺序解决关系。如果(且仅当)下一列是ORDER BY子句中使用的列,则可以按索引顺序读取行,而无需进一步排序。

我不知道您链接到的Pinterest博客文章的解释是什么。我想这是一个错误,因为索引对于他们展示的查询并不是最佳的。