mysql tiDB limit offset

mysql tiDB limit offset

limit offset 常使用于分页, 前端展示不下这么多东西会传一个 limit, offset. 或者是page, page_size 参数。后端查询之后就需要做分页。以前一直没注意需要配合order by 一起使用。线上使用中出现了重复,于是查看了mysql 分页的实现原理,加以对比。

limit offset 的核心在于排序,在排序完之后按照需要的offset limit 去做偏移。

mysql 分页

官方文档

If multiple rows have identical values in the ORDER BY columns, the server is free to return those rows in any order, and may do so differently depending on the overall execution plan. In other words, the sort order of those rows is nondeterministic with respect to the nonordered columns.

One factor that affects the execution plan is LIMIT, so an ORDER BY query with and without LIMIT may return rows in different orders.

大意就是 order by 排序中如果相同的值存在,那么对这些相同的值的排序可能是不一样的。看起来就是有时在第一页有时在第二页。这就会比较困扰。
原因是因为如果不是特别大,使用的是堆排序,使用sort_buffer.不需要走temp_file.在内存中排序自然就比较快,但是堆排序不是稳定的排序,所以就会出现相同元素的顺序不一致的问题。(似乎和mysql 版本有关 比较尴尬。。)

解决

  1. 索引排序字段 之前的月报中,我们讨论过三星索引的设计,其中第二条就是利用索引的有序性,如果用户在字段添加上索引,就直接按照索引的有序性进行读取并分页,从而可以规避遇到的这个问题。

使用索引是因为索引树数据固定,不会出现这样的情景。

tiDB 分页

目前没有过多的资料,暂时认为和mysql语意一致

参考:
解决 MySQL 分页数据错乱重复

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章