日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:28日期:2023-10-09 09:18:53

在 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 數據庫
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
久久精品xxxxx| 亚洲小说春色综合另类电影| 久久激情网站| 欧美经典一区| 久久亚洲风情| 国产在线观看www| 日本综合精品一区| 欧美日韩水蜜桃| 高清久久精品| 日韩av在线免费观看不卡| 午夜久久一区| 成人一区而且| 国产精品日本一区二区不卡视频| 丝袜美腿成人在线| 国内精品福利| 久久不卡国产精品一区二区| 麻豆精品网站| 日韩午夜精品| 欧美日一区二区| 久久久久午夜电影| 日本高清不卡一区二区三区视频| 麻豆成人综合网| 欧美日一区二区三区在线观看国产免| 国产精品呻吟| 激情五月综合网| 久久久人人人| 欧美~级网站不卡| 久久一区二区中文字幕| 91看片一区| 91视频一区| 国产精品va视频| 国产精品xxx| 久久爱www.| 久久精品色播| 精品亚洲二区| 亚洲欧洲美洲av| 日韩一区自拍| 久久久精品五月天| 久久精品主播| 偷拍欧美精品| 噜噜噜躁狠狠躁狠狠精品视频| 最新日韩av| 视频一区中文字幕| 亚洲精品乱码| 久久国产尿小便嘘嘘| 日韩精品一级| 国产精品一区二区三区四区在线观看| 国产精品第一| 日韩成人精品一区| 久久精品国产www456c0m| 亚洲福利专区| 男女男精品网站| 欧美日韩黄网站| 精品一区二区三区的国产在线观看| 精品欠久久久中文字幕加勒比| 电影91久久久| 欧美日中文字幕| 一区二区不卡| 欧美黄色精品| 久久一区二区三区喷水| 性欧美69xoxoxoxo| 亚久久调教视频| 欧美精品导航| 香蕉视频亚洲一级| 在线综合视频| 91九色综合| 国产精品黑丝在线播放| 日韩av福利| 香蕉成人久久| 国产精品久久久久久久久久齐齐| 国产一区二区三区91| 99久久激情| 亚洲欧洲日韩| 精品国产精品久久一区免费式 | 另类激情亚洲| 国产乱人伦精品一区| www.九色在线| 久久国产精品久久w女人spa| 18国产精品| 热三久草你在线| 亚洲影视一区| 精品视频在线你懂得| 亚洲午夜91| 日韩动漫一区| 日韩88av| 尤物在线精品| 国产精品久久久亚洲一区| 日韩综合精品| 日本不卡不码高清免费观看 | 久久久久91| 亚洲永久精品唐人导航网址| 久久不见久久见免费视频7| 久久中文字幕二区| 91精品国产自产精品男人的天堂| 日韩av福利| 欧美亚洲色图校园春色| 99精品在线| 久久国内精品| 99xxxx成人网| 国产毛片精品久久| 亚洲二区免费| 美女毛片一区二区三区四区最新中文字幕亚洲 | 另类综合日韩欧美亚洲| 日韩一区二区三区免费播放| 日韩高清电影免费| 亚洲婷婷免费| 国产亚洲精品精品国产亚洲综合| 亚洲成人国产| 久久成人av| 亚洲精品乱码| 九九久久婷婷| 国产精品久久久久久久久久10秀| 亚洲日本欧美| 视频一区中文| 97精品中文字幕| 国产亚洲久久| 久久都是精品| 亚洲二区视频| 国产在线观看www| 国产精品调教| 亚洲婷婷丁香| 天堂av在线| 国产精品一区二区三区av麻| 黄色成人91| 亚洲婷婷免费| 中文在线免费视频| 国产精品密蕾丝视频下载| 亚洲理论在线| 视频一区二区三区在线| 亚洲女同中文字幕| 久久美女性网| 欧美激情视频一区二区三区免费 | 日韩国产一区二| 性感美女一区二区在线观看| 免费一级欧美在线观看视频 | 日本在线观看不卡视频| 99国产精品久久久久久久| 日韩另类视频| 欧美aa在线观看| 综合日韩av| 蜜桃久久久久| 你懂的国产精品永久在线| 日本亚洲不卡| 亚洲天堂免费| 亚洲国产一区二区三区在线播放| 成人国产精品一区二区网站| 欧美久久精品| 国产日韩欧美三区| 国产日韩在线观看视频| 色在线中文字幕| 国产不卡精品在线| 欧美 日韩 国产精品免费观看| 香蕉久久99| 亚洲少妇诱惑| 丝袜美腿成人在线| 丝袜诱惑制服诱惑色一区在线观看| 国产激情综合| 国产日韩在线观看视频| 中文精品电影| 日韩三区四区| 蜜臀久久99精品久久久画质超高清 | 国产精品男女| 国产成人调教视频在线观看| 国产日韩欧美一区在线| 91精品麻豆| 国产乱论精品| 麻豆一区二区99久久久久| 国产日韩欧美一区二区三区| 久久国产欧美日韩精品| 久久超级碰碰| 国产精品午夜av| 久久中文欧美| 精品一区视频| 日本精品在线中文字幕| 99久久久久| 香蕉久久夜色精品国产| 亚洲三级视频| 国产精品视频一区二区三区综合| 国产精品www994| 日韩欧美一区二区三区免费看| 日韩av首页| 快she精品国产999| 日韩av中文字幕一区二区三区| 国产精品久久乐| 日韩黄色大片网站| 久久精品官网| 亚洲专区欧美专区| 日韩精品免费观看视频| 麻豆成人91精品二区三区| 欧美成人a交片免费看| 不卡在线一区| 日本色综合中文字幕| 国产成人久久精品一区二区三区| 香蕉成人av| 在线精品国产亚洲| 麻豆国产91在线播放| 亚洲国产专区| 啪啪亚洲精品| 日韩毛片在线| 亚洲一级大片|