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 分頁數據錯亂重複

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