一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Mysql - 淺談mysql使用limit分頁優化方案的實現

淺談mysql使用limit分頁優化方案的實現

2019-06-12 12:23愛情小傻蛋服務器之家 Mysql

在mysql中limit可以實現快速分頁,但是如果數據到了幾百萬時我們的limit必須優化才能有效的合理的實現分頁了,否則可能卡死你的服務器哦。感興趣的可以一起來了解一下如何實現優化

Mysql limit分頁語句用法

與Oracle和MS SqlServer相比,mysql的分頁方法簡單的讓人想哭。

--語法:

SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset

--舉例:

select * from table limit 5; --返回前5行

select * from table limit 0,5; --同上,返回前5行

select * from table limit 5,10; --返回6-15行

如何優化limit

當一個查詢語句偏移量offset很大的時候,如select * from table limit 10000,10 , 最好不要直接使用limit,而是先獲取到offset的id后,再直接使用limit size來獲取數據。效果會好很多。

如:

select * From customers Where customer_id >=(
select customer_id From customers Order By customer_id limit 10000,1
) limit 10;

一、測試實驗

mysql分頁直接用limit start, count分頁語句:

select * from product limit start, count

當起始頁較小時,查詢沒有性能問題,我們分別看下從10, 100, 1000, 10000開始分頁的執行時間(每頁取20條),如下:

select * from product limit 10, 20 0.016秒
select * from product limit 100, 20 0.016秒
select * from product limit 1000, 20 0.047秒
select * from product limit 10000, 20 0.094秒

我們已經看出隨著起始記錄的增加,時間也隨著增大, 這說明分頁語句limit跟起始頁碼是有很大關系的,
那么我們把起始記錄改為40w看下(也就是記錄的一半左右)

select * from product limit 400000, 20 3.229秒

再看我們取最后一頁記錄的時間

select * from product limit 866613, 20 37.44秒

像這種分頁最大的頁碼頁顯然這種時間是無法忍受的。

從中我們也能總結出兩件事情:

  • limit語句的查詢時間與起始記錄的位置成正比。
  • mysql的limit語句是很方便,但是對記錄很多的表并不適合直接使用。

二、 對limit分頁問題的性能優化方法

2.1 利用表的覆蓋索引來加速分頁查詢

我們都知道,利用了索引查詢的語句中如果只包含了那個索引列(覆蓋索引),那么這種情況會查詢很快。

因為利用索引查找有優化算法,且數據就在查詢索引上面,不用再去找相關的數據地址了,這樣節省了很多時間。

另外Mysql中也有相關的索引緩存,在并發高的時候利用緩存就效果更好了。

在我們的例子中,我們知道id字段是主鍵,自然就包含了默認的主鍵索引。現在讓我們看看利用覆蓋索引的查詢效果如何:
這次我們之間查詢最后一頁的數據(利用覆蓋索引,只包含id列),如下:

select id from product limit 866613, 20 

查詢時間為0.2秒,相對于查詢了所有列的37.44秒,提升了大概100多倍的速度。

那么如果我們也要查詢所有列,有兩種方法,

id>=的形式:

SELECT * FROM product 
WHERE ID > =(select id from product limit 866613, 1) limit 20

查詢時間為0.2秒,簡直是一個質的飛躍啊。

利用join

SELECT * FROM product a 
JOIN (select id from product limit 866613, 20) b ON a.ID = b.id

查詢時間也很短,贊!

其實兩者用的都是一個原理嘛,所以效果也差不多。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 手机跑分排行最新排名 | 久久受www免费人成_看片中文 | 亚洲 色 欧美 爱 视频 日韩 | 亚洲女人国产香蕉久久精品 | 体检小说 | 亚洲男人天堂2023 | 深夜精品高中女学生 | 91传媒制片厂制作传媒破解版 | 欧美性欲 | 四虎在线观看 | 乌克兰18sex性hd | 午夜福利电影网站鲁片大全 | 日本高清在线不卡 | 亚洲午夜久久久久影院 | 日本一区二区三区国产 | 国产三级精品久久三级国专区 | 嫩草影院精品视频在线观看 | www.87福利| 欧美成人香蕉在线观看 | 亚洲精品tv久久久久久久久久 | 免费在线观看成年人视频 | 国产第一草草影院 | 色五婷婷 | 1024免费观看完整版在线播放 | 国产一区日韩二区欧美三 | tube性睡觉hd| 暖暖日本在线观看免费 | 欧美老妪 | 99re在线精品视频免费 | 亚洲波多野结衣日韩在线 | 美国一级大黄大色毛片 | 毛片应用| 18国产精品白浆在线观看免费 | 国产福利片在线 易阳 | 天天做日日做天天添天天欢公交车 | 欧美特欧美特级一片 | 白丝女仆被啪到深夜漫画 | 久久精品WWW人人爽人人 | 国模一区二区三区视频一 | asspics大尿chinese | 黄动漫车车好快的车车a |