如果在查询中使用order by,如何在MySQL中对索引列进行排序?

亚历克斯

我正在阅读有关Pinterest如何分片其MySQL数据库的文章:https : //medium.com/@Pinterest_Engineering/sharding-pinterest-how-we-scaled-our-mysql-fleet-3f341e96​​ca6f

这里有一个表格示例:

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)

我在这里缺少什么还是误解了索引的工作方式?

比尔·卡温

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

INDEX(board_id, sequence, pin_id)

列应按以下顺序排列:

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

一旦相等条件找到匹配行的子集,它们就都按照它们的顺序进行绑定,因为自然地,它们对于质量条件的列都具有相同的值(board_id在这种情况下)。

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

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如果在Ruby中使用File类不存在目录,如何创建目录?

如果在查询中未考虑用户输入,使用mysqli_query()是否危险?

如果在Exchange中使用ews如何获得“现在可用”房间,如何获取?

如果在Haskell中使用do标记内的块,如何使用let内部

如果在ORDER BY sql php中

排序/排名| 如果在子查询中?

如果在角度6中使用formGroup,则会显示一些错误

如果在Angular 6中使用模运算符,则为ng

如果在cdkDropList中使用* ngFor,则无法进行角度拖放

如果在SPSS中使用列,如何从列表中获取具有最大值的列的标签?

如果在for循环中出现esle,如何在单行中使用“ continue”

如果在MySQL查询中的where条件下,我该如何使用?

在Laravel中,如果在控制器中使用/ else

如果在javascript .replace中使用,如何在RegEx中定位破折号或连字符?

如果在Virtual Element Knockout中使用if条件,如何使用'&'?

如果在SPIP中查询标签

listview或gridview如果在Android中使用一列?

如果在查询中使用索引列的子集,是否保留索引的MySQL查询性能优势?

如果在更新查询中不起作用

如果在使用计算的ORDER BY时指定了SELECT DISTINCT,则ORDER BY项目必须出现在选择列表中

如果在MySQL中使用SUM

如果在ajax中使用了序列化,如何在控制器中获取表单数据

如果在URL中使用斜杠,则进行重定向。htaccess

如果在 ngFor 中使用,如何获取 mat-checkbox 选中的值

如果在选择查询中使用别名,如何计算所有记录?

如果在 for 循环中使用 re.findall 找不到匹配项,如何打印?

如果在 Golang 中使用 mutex.lock() 锁定函数,如何发回响应?

如果在闭包中使用变量,则在扩充赋值中重新定义

如果在 cpanel 中使用 codeigniter,如何设置 cron 作业?