成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

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

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

瀏覽:6日期: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 數據庫
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
国产精品污污网站在线观看| 午夜欧美大尺度福利影院在线看| 中文字幕欧美区| 国产一区二区三区免费| 先锋影音久久久| 国产情人综合久久777777| 国产麻豆精品在线| 欧美久久久一区| 日韩电影在线免费看| 亚洲高清不卡| 久久久综合视频| 国产精品一卡二| 色哟哟精品一区| 一区二区在线观看不卡| 欧美日韩综合网| 欧美videos中文字幕| 韩国女主播一区| 老**午夜毛片一区二区三区| 亚洲免费观看高清完整版在线观看 | 精品福利一区二区三区| 中文字幕一区av| 国产一区二区在线电影| 一区二区日本视频| 欧美久久久影院| 一区二区视频在线| 一区二区在线免费| 国产丝袜欧美中文另类| 久久影院午夜片一区| 亚洲精品久久久蜜桃| 毛片av一区二区三区| 日韩和欧美的一区| 欧美变态凌虐bdsm| 欧美视频在线观看一区| 91精品在线观看入口| 校园激情久久| 床上的激情91.| 欧美三级第一页| 久久国产精品一区二区三区 | 欧美性受极品xxxx喷水| 亚洲国产精品一区制服丝袜| 成人综合在线观看| 日韩精品每日更新| 国产精品一区二区在线观看| 成人小视频免费观看| 欧美日韩国产一区| 天天综合色天天综合色h| 国产农村妇女精品一二区| 亚洲精品乱码久久久久久日本蜜臀| 欧美日韩理论| 国产欧美精品一区二区色综合| 99v久久综合狠狠综合久久| 最新热久久免费视频| 蜜臀久久久久久久| 在线观看亚洲精品| 美国毛片一区二区| 欧美三级资源在线| 国产在线一区观看| 91精品国产色综合久久久蜜香臀| 国产一区欧美日韩| 日韩久久免费av| 风流少妇一区二区| 久久久久久97三级| 亚洲国产高清视频| 亚洲图片一区二区| 91成人在线观看喷潮| 麻豆精品国产传媒mv男同| 欧美日韩精品系列| 国产二区国产一区在线观看| 欧美一区二区三区系列电影| 成人污污视频在线观看| 欧美精品一区二区三区一线天视频| av激情综合网| 国产精品另类一区| 国产欧美二区| 免费观看日韩av| 欧美精品色综合| 成人手机电影网| 中文字幕av一区二区三区| 夜夜嗨网站十八久久| 日本中文一区二区三区| 91麻豆精品国产91久久久| 色综合中文字幕国产 | 欧美一区亚洲| 亚洲视频每日更新| 色婷婷狠狠综合| 国产成人小视频| 精品99999| 一区免费视频| 日本成人在线看| 欧美一级淫片007| 欧美 亚欧 日韩视频在线| 亚洲精品少妇30p| 日本丰满少妇一区二区三区| 国产一区二区三区久久久| 久久亚洲一级片| 国产欧美大片| 狠狠v欧美v日韩v亚洲ⅴ| 国产亚洲一二三区| 亚洲精品在线二区| 精品一区二区影视| 国产亚洲欧美中文| 亚洲自拍另类| 国产激情91久久精品导航| 国产拍揄自揄精品视频麻豆| 国产一级一区二区| 国产在线精品一区二区| 国产精品婷婷午夜在线观看| 午夜一区二区三视频在线观看| 日本成人在线电影网| 精品国产乱子伦一区| 日韩午夜激情| 激情欧美一区二区三区在线观看| 国产午夜精品理论片a级大结局| 妖精视频成人观看www| 免费一级欧美片在线观看| 日韩一区二区三| av激情成人网| 亚洲综合在线五月| 欧美日韩久久一区| 欧美在线3区| 视频一区二区不卡| 精品久久久久99| 亚洲一区二区免费看| 国产美女在线观看一区| 亚洲欧美一区二区三区极速播放| 欧美日韩一区在线| 色综合欧美在线视频区| 香蕉成人啪国产精品视频综合网| 精品日产卡一卡二卡麻豆| 免费看的黄色欧美网站| 99re免费视频精品全部| 日韩av电影免费观看高清完整版 | 欧美日韩精品一区二区三区蜜桃| 午夜久久黄色| 日韩和欧美一区二区| 国产欧美一区在线| 色偷偷久久一区二区三区| 91丨porny丨在线| 欧美bbbbb| 中文字幕av一区 二区| 欧美日韩成人综合天天影院| 成人app软件下载大全免费| 午夜精品久久久久久久蜜桃app| 欧美日本韩国一区| aⅴ色国产欧美| gogogo免费视频观看亚洲一| 亚洲精品国产a| 精品欧美一区二区在线观看| 在线欧美一区二区| 亚洲大胆视频| 99久久国产综合精品女不卡| 日本视频中文字幕一区二区三区| 国产精品美日韩| 欧美va在线播放| 欧美性生活影院| 亚洲精品乱码久久久久久蜜桃麻豆| 国产91在线观看| 亚洲自拍偷拍麻豆| 国产午夜精品一区二区三区嫩草| 欧美天天综合网| 亚洲一区中文| 欧美日韩一区在线视频| 国产mv日韩mv欧美| 日韩电影在线免费观看| 亚洲免费av网站| 欧美一级片在线看| 免费在线一区二区| 97久久精品人人澡人人爽| 国产麻豆精品视频| 免费国产亚洲视频| 午夜伦理一区二区| 亚洲美女少妇撒尿| 国产精品66部| 天天免费综合色| 最新中文字幕一区二区三区| 欧美哺乳videos| 91久久精品国产91性色tv| 亚洲欧美日本国产专区一区| 欧美日韩综合网| 国产伦理精品不卡| 水蜜桃久久夜色精品一区的特点| 国产精品久久久久久久裸模| 精品剧情在线观看| 欧美女孩性生活视频| 色哟哟一区二区三区| 久久久国产精品一区二区三区| 国产精品免费在线| 国产精品久久| 色综合天天狠狠| 成人高清av在线| 国内外精品视频| 久久综合九色综合97_久久久| 9191精品国产综合久久久久久| 欧美亚洲国产一区二区三区| 亚洲精品久久| 国产精品v欧美精品v日韩 | 欧美人与z0zoxxxx视频| 日本国产一区二区| 国产成人精品三级| 激情久久五月天|