mysql 分頁 不連續 mysql分頁的問題

2021-10-17 19:58:50 字數 1187 閱讀 9978

用過mysql的人肯定知道,mysql提供了原生的分頁功能-----limit關鍵字。limit 子句可以被用於強制 select 語句返回指定的記錄數。limit 接受乙個或兩個數字引數。引數必須是乙個整數常量。如果給定兩個引數,第乙個引數指定第乙個返回記錄行的偏移量,第二個引數指定返回記錄行的最大數目。tips:初始記錄行的偏移量是 0(而不是 1)。

但是我再實際的專案過程中使用limit子句時,在分頁數目很大的情況下(幾萬頁),後面的翻頁的速度明顯慢於前面,特別好奇這個現象的原因,於是explain了一下,才發現mysql limit 10000, 20的意思掃瞄滿足條件的10020行,扔掉前面的10000行,返回最後的20行。如下所示:

explain select * from exp_platform order by id desc limit 10000,5

***************** 1. row **************

id: 1

select_type: ******

table: message

type: index

possible_keys: null

key: primary

key_len: 4

ref: null

rows: 10020

extra:

1 row in set (0.00 sec)

這相當於越往後面翻頁越相當於全表掃瞄,這樣在乙個高併發的應用下,效能肯定是hold不住的。但是limit n這樣的語句效能是沒有問題的,因為只掃瞄n行。於是就想找解決辦法,如下:

solution1:使用limit n

select * from exp_platform where id >= 9500 limit 5

solution2:使用子查詢

select * from exp_platform where id >= (select id from exp_platform order by id limit 10000, 1) limit 20

子查詢是在索引上完成的,而普通查詢是在資料檔案上完成的,通常來說,索引檔案要比資料檔案小很多,所以操作起來更有效

solution3:使用join分頁方式,這個沒有嘗試過,有機會可以試試。

實際可以利用類似策略模式的方式去處理分頁,比如判斷如果是一百頁以內,就使用最基本的分頁方式,大於一百頁,則使用子查詢的分頁方式。

mysql主鍵id不連續

唯一鍵衝突 事務回滾 批量插入時申請主鍵的策略造成mysql中自增主鍵不連續 批量申請自增主鍵時它的申請數量是乘2遞增的,比如插入4條資料,第一條申請1個主鍵 第二個申請2個滿足第二和三條資料插入時使用,第四條資料插入時還需要再申請一次,這次會分配4個主鍵,但是只用了1個,有3個就浪費了,並出現了i...

MySQL自增id不連續問題

專案中有一張表是記錄人員,在每個新使用者呼叫介面認證通過了之後,會有乙個往該錶插入這個新使用者資訊的操作。1 唯一鍵衝突是導致自增主鍵id不連續的第一種原因 2 事務回滾是導致自增主鍵id不連續的第二種原因 3 批量申請自增id的策略是導致自增主鍵id不連續的第三種原因 在這篇文章中提到了mysql...

mysql分頁概念 MySQL 分頁

分頁的基本原理 mysql explain select from message order by id desc limit 10000,20 1.row id 1 select type table message type index possible keys null key prima...