婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > MySQL limit分頁大偏移量慢的原因及優化方案

MySQL limit分頁大偏移量慢的原因及優化方案

熱門標簽:湖南人工外呼系統多少錢 信陽穩定外呼系統運營商 廣東人工電話機器人 南通自動外呼系統軟件 石家莊電商外呼系統 申請外呼電話線路 芒果電話機器人自動化 日照旅游地圖標注 百度地圖圖標標注中心

在 MySQL 中通常我們使用 limit 來完成頁面上的分頁功能,但是當數據量達到一個很大的值之后,越往后翻頁,接口的響應速度就越慢。

本文主要討論 limit 分頁大偏移量慢的原因及優化方案,為了模擬這種情況,下面首先介紹表結構和執行的 SQL。

場景模擬

建表語句

user 表的結構比較簡單,id、sex 和 name,為了讓 SQL 的執行時間變化更加明顯,這里有9個姓名列。

CREATE TABLE `user` (
 `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
 `sex` tinyint(4) NULL DEFAULT NULL COMMENT '性別 0-男 1-女',
 `name1` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '姓名',
 `name2` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '姓名',
 `name3` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '姓名',
 `name4` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '姓名',
 `name5` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '姓名',
 `name6` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '姓名',
 `name7` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '姓名',
 `name8` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '姓名',
 `name9` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '姓名',
 PRIMARY KEY (`id`) USING BTREE,
 INDEX `sex`(`sex`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 9000001 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

數據填充

這里建立了一個存儲過程來進行數據的填充,一共9000000條數據,執行完函數后再執行一句SQL,修改性別字段。

ps:這個函數執行的挺久的,我運行了617.284秒。

CREATE DEFINER=`root`@`localhost` PROCEDURE `data`()
begin 
 declare i int; 
 set i=1; 
 while(i=9000000)do 
  insert into user values(i,0,i,i,i,i,i,i,i,i,i);
  set i=i+1; 
 end while;
end

-- 將id為偶數的user設置性別為1-女
update user set sex=1 where id%2=0;

SQL與執行時間

SQL 執行時間
select * from user where sex = 1 limit 100, 10; OK, Time: 0.005000s
select * from user where sex = 1 limit 1000, 10; OK, Time: 0.007000s
select * from user where sex = 1 limit 10000, 10; OK, Time: 0.016000s
select * from user where sex = 1 limit 100000, 10; OK, Time: 0.169000s
select * from user where sex = 1 limit 1000000, 10; OK, Time: 5.892000s
select * from user where sex = 1 limit 10000000, 10; OK, Time: 33.465000s

可以看到,limit 的偏移量越大,執行時間越長。

原因分析

首先來分析一下這句 SQL 執行的過程,就拿上面表格中的第一行來舉例。

由于 sex 列是索引列,MySQL會走 sex 這棵索引樹,命中 sex=1 的數據。

然后又由于非聚簇索引中存儲的是主鍵 id 的值,且查詢語句要求查詢所有列,所以這里會發生一個回表的情況,在命中 sex 索引樹中值為1的數據后,拿著它葉子節點上的值也就是主鍵 id 的值去主鍵索引樹上查詢這一行其他列(name、sex)的值,最后返回到結果集中,這樣第一行數據就查詢成功了。

最后這句 SQL 要求limit 100, 10,也就是查詢第101到110個數據,但是 MySQL 會查詢前110行,然后將前100行拋棄,最后結果集中就只剩下了第101到110行,執行結束。

小結一下,在上述的執行過程中,造成 limit 大偏移量執行時間變久的原因有:

  • 查詢所有列導致回表
  • limit a, b會查詢前a+b條數據,然后丟棄前a條數據

綜合上述兩個原因,MySQL 花費了大量時間在回表上,而其中a次回表的結果又不會出現在結果集中,這才導致查詢時間變得越來越長。

優化方案

覆蓋索引

既然無效的回表是導致查詢變慢的主要原因,那么優化方案就主要從減少回表次數方面入手,假設在limit a, b中我們首先得到了a+1到a+b條數據的id,然后再進行回表獲取其他列數據,那么就減少了a次回表操作,速度肯定會快上不少。

這里就涉及到覆蓋索引了,所謂的覆蓋索引就是從非主聚簇索引中就能查到的想要數據,而不需要通過回表從主鍵索引中查詢其他列,能夠顯著提升性能。

基于這樣的思路,優化方案就是先查詢得到主鍵id,然后再根據主鍵id查詢其他列數據,優化后的 SQL 以及執行時間如下表。

優化后的 SQL 執行時間
select * from user a join (select id from user where sex = 1 limit 100, 10) b on a.id=b.id; OK, Time: 0.000000s
select * from user a join (select id from user where sex = 1 limit 1000, 10) b on a.id=b.id; OK, Time: 0.00000s
select * from user a join (select id from user where sex = 1 limit 10000, 10) b on a.id=b.id; OK, Time: 0.002000s
select * from user a join (select id from user where sex = 1 limit 100000, 10) b on a.id=b.id; OK, Time: 0.015000s
select * from user a join (select id from user where sex = 1 limit 1000000, 10) b on a.id=b.id; OK, Time: 0.151000s
select * from user a join (select id from user where sex = 1 limit 10000000, 10) b on a.id=b.id; OK, Time: 1.161000s

果然,執行效率得到了顯著提升。

條件過濾

當然還有一種有缺陷的方法是基于排序做條件過濾。

比如像上面的示例 user 表,我要使用 limit 分頁得到1000001到1000010條數據,可以這樣寫 SQL:

select * from user where sex = 1 and id > (select id from user where sex = 1 limit 1000000, 1) limit 10;

但是使用這樣的方式優化是有條件的:主鍵id必須是有序的。在有序的條件下,也可以使用比如創建時間等其他字段來代替主鍵id,但是前提是這個字段是建立了索引的。

總之,使用條件過濾的方式來優化 limit 是有諸多限制的,一般還是推薦使用覆蓋索引的方式來優化。

小結

主要分析了 limit 分頁大偏移量慢的原因,同時也提出了響應的優化方案,推薦使用覆蓋索引的方式來優化 limit 分頁大偏移執行時間久的問題。

希望能幫助到大家。

以上就是MySQL limit分頁大偏移量慢的原因及優化方案的詳細內容,更多關于MySQL limit 分頁的資料請關注腳本之家其它相關文章!

您可能感興趣的文章:
  • MySQL查詢優化:LIMIT 1避免全表掃描提高查詢效率
  • 為什么MySQL分頁用limit會越來越慢
  • mysql優化之query_cache_limit參數說明
  • 詳解Mysql order by與limit混用陷阱
  • mysql分頁的limit參數簡單示例
  • Mysql排序和分頁(order by&limit)及存在的坑
  • MySQL limit使用方法以及超大分頁問題解決
  • mysql踩坑之limit與sum函數混合使用問題詳解
  • 如何提高MySQL Limit查詢性能的方法詳解
  • MySQL Limit性能優化及分頁數據性能優化詳解
  • 淺談mysql使用limit分頁優化方案的實現
  • MySQL中limit對查詢語句性能的影響

標簽:惠州 公主嶺 阿里 沈陽 天津 牡丹江 呼和浩特 合肥

巨人網絡通訊聲明:本文標題《MySQL limit分頁大偏移量慢的原因及優化方案》,本文關鍵詞  MySQL,limit,分頁,大,偏移量,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《MySQL limit分頁大偏移量慢的原因及優化方案》相關的同類信息!
  • 本頁收集關于MySQL limit分頁大偏移量慢的原因及優化方案的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    成人一区二区三区视频| 一区二区三区中文免费| 91老师片黄在线观看| 欧美电影影音先锋| 国产精品免费视频观看| 亚洲欧洲www| 国产成人综合自拍| 久久久国产午夜精品| 久久99国产精品免费网站| 99re热视频这里只精品| 国产区在线观看成人精品| 秋霞影院一区二区| 欧美乱熟臀69xxxxxx| 调教+趴+乳夹+国产+精品| caoporm超碰国产精品| 亚洲曰韩产成在线| 日韩一区二区三| 一区二区三区日韩精品| 从欧美一区二区三区| 亚洲欧美成aⅴ人在线观看| 处破女av一区二区| 亚洲人吸女人奶水| 91精品国产乱| 91在线视频免费91| 天天综合网 天天综合色| 久久午夜免费电影| 欧美最猛黑人xxxxx猛交| 三级不卡在线观看| 欧美在线一二三| 国产精品白丝jk黑袜喷水| 亚洲一区二区三区四区的| 久久综合色8888| 在线区一区二视频| 美女久久久精品| 亚洲日本一区二区| 91香蕉视频污| 日本一区二区三区四区| 欧美性猛片aaaaaaa做受| 狠狠色综合日日| 亚洲国产日韩a在线播放| 久久日一线二线三线suv| 精品视频1区2区3区| 成人国产精品视频| 亚洲www啪成人一区二区麻豆| 久久久精品欧美丰满| 欧美亚洲一区二区在线观看| 精品一区二区三区香蕉蜜桃| 一区二区成人在线观看| 中文在线免费一区三区高中清不卡| 在线亚洲高清视频| 视频一区中文字幕| 一区二区三区不卡在线观看| 国产精品视频观看| 国产人成一区二区三区影院| 欧美精品一区二区三区一线天视频| 在线看日韩精品电影| 成人国产精品免费网站| 国产精品亚洲综合一区在线观看| 麻豆一区二区三区| 久久成人免费网站| 玖玖九九国产精品| 国产一区二区三区在线观看免费 | 久久精品99国产精品日本| 一区二区三区精品视频在线| 国产精品国产三级国产aⅴ中文 | 婷婷久久综合九色综合绿巨人| 亚洲欧美国产三级| 亚洲日穴在线视频| 亚洲精品国产视频| 亚洲黄色小视频| 夜夜嗨av一区二区三区中文字幕| 亚洲天堂av一区| 亚洲制服欧美中文字幕中文字幕| 亚洲制服欧美中文字幕中文字幕| 亚洲国产日韩a在线播放性色| 亚洲大片在线观看| 久久99精品国产麻豆不卡| 国模无码大尺度一区二区三区| 狠狠狠色丁香婷婷综合久久五月| 国内精品国产三级国产a久久| 国产成人综合网站| 91伊人久久大香线蕉| 欧美午夜宅男影院| 欧美一级生活片| 国产欧美日韩精品a在线观看| 欧美精品aⅴ在线视频| 激情久久久久久久久久久久久久久久| 久久久国产一区二区三区四区小说| 精品成人一区二区三区| 国产精品不卡在线| 天天操天天综合网| 国产在线一区二区| 色哟哟精品一区| 日韩一级二级三级精品视频| 中文字幕免费一区| 亚洲小说欧美激情另类| 国内精品伊人久久久久av一坑| 91丨porny丨国产| 精品区一区二区| 一级做a爱片久久| 国产一区二区三区精品视频| 99久久99久久精品免费观看| 欧美一级二级三级蜜桃| 中文字幕亚洲精品在线观看| 蜜芽一区二区三区| 一本一道综合狠狠老| 久久久久九九视频| 首页国产欧美日韩丝袜| 色综合中文字幕国产 | 亚洲欧美偷拍卡通变态| 日韩中文字幕亚洲一区二区va在线 | 精品一区二区综合| 丁香网亚洲国际| 在线精品亚洲一区二区不卡| 精品精品国产高清一毛片一天堂| 亚洲免费在线播放| 国产a久久麻豆| 欧美一区二区网站| 亚洲一区av在线| 99精品视频在线观看| 久久这里只有精品6| 亚洲精品一二三区| 91在线视频18| 欧美日韩另类一区| www.66久久| 日韩一区二区三区免费看 | 蜜臂av日日欢夜夜爽一区| 91麻豆成人久久精品二区三区| 久久久久久久国产精品影院| 美女久久久精品| 日韩欧美一二区| 久久成人免费日本黄色| 欧美成人三级在线| 精品一区二区三区日韩| 欧美大肚乱孕交hd孕妇| 日本va欧美va瓶| 日韩一区二区三区电影在线观看| 亚洲高清中文字幕| 在线电影一区二区三区| 日本不卡一区二区三区高清视频| 欧美在线一二三| 精品粉嫩aⅴ一区二区三区四区| 免费不卡在线观看| 日韩三级在线观看| 天天色图综合网| 精品国产网站在线观看| 激情五月婷婷综合网| 国产三区在线成人av| 北岛玲一区二区三区四区| 一区在线中文字幕| 欧美日韩和欧美的一区二区| 欧美aⅴ一区二区三区视频| 欧美tickling网站挠脚心| 久久69国产一区二区蜜臀| 国产清纯美女被跳蛋高潮一区二区久久w| 激情综合亚洲精品| 亚洲欧美在线视频观看| 欧美视频一区二区| 久久精工是国产品牌吗| 欧美国产激情二区三区| 欧美三级韩国三级日本三斤 | 日韩一区二区在线看| 亚洲成av人片观看| 欧美一区二区三区四区久久| 国产一区二区三区在线观看精品 | 高清成人在线观看| 亚洲欧美偷拍卡通变态| 欧美二区在线观看| aaa欧美日韩| 麻豆专区一区二区三区四区五区| 日本一区二区三区在线观看| 欧美日韩电影在线播放| 国产成人在线观看| 五月婷婷欧美视频| 国产精品伦一区| 5566中文字幕一区二区电影| 岛国精品在线播放| 轻轻草成人在线| 一区二区三区视频在线观看| 国产日韩av一区| 欧美成人女星排行榜| 日本高清不卡在线观看| 东方欧美亚洲色图在线| 久久精品国产77777蜜臀| 亚洲黄色录像片| 中文字幕欧美国产| 日韩精品一区在线| 51精品秘密在线观看| 色噜噜狠狠成人网p站| 国产91富婆露脸刺激对白| 老司机免费视频一区二区| 亚洲成人免费视| 一区二区免费在线| 亚洲女与黑人做爰| 中文一区在线播放| 欧美国产丝袜视频| 国产偷国产偷精品高清尤物 | 亚洲国产成人av好男人在线观看| 91丨九色丨黑人外教| 日韩国产高清影视|