亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > MySQL > 正文

MYSQL分頁limit速度太慢的優化方法

2024-07-24 13:09:36
字體:
來源:轉載
供稿:網友

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

   當一個表數據有幾百萬的數據的時候成了問題!

   如 * from table limit 0,10 這個沒有問題 當 limit 200000,10 的時候數據讀取就很慢,可以按照一下方法解決
    第一頁會很快
   PERCONA PERFORMANCE CONFERENCE 2009上,來自雅虎的幾位工程師帶來了一篇”EfficientPagination Using MySQL”的報告
   limit10000,20的意思掃描滿足條件的10020行,扔掉前面的10000行,返回最后的20行,問題就在這里。
   LIMIT 451350 , 30 掃描了45萬多行,怪不得慢的都堵死了。
   但是
   limit 30 這樣的語句僅僅掃描30行。

   那么如果我們之前記錄了最大ID,就可以在這里做文章

   舉個例子

   日常分頁SQL語句
   select id,name,content from users order by id asc limit 100000,20
   掃描100020行
   如果記錄了上次的最大ID
   select id,name,content from users where id>100073 order by id asc limit 20
   掃描20行。
   總數據有500萬左右
   以下例子 當時候 select * from wl_tagindex where byname='f' order by id limit 300000,10 執行時間是 3.21s
   優化后:

 select * from (    select id from wl_tagindex    where byname='f' order by id limit 300000,10 ) a left join wl_tagindex b on a.id=b.id

   執行時間為 0.11s 速度明顯提升
   這里需要說明的是 我這里用到的字段是 byname ,id 需要把這兩個字段做復合索引,否則的話效果提升不明顯

   總結

   當一個數據庫表過于龐大,LIMIT offset, length中的offset值過大,則SQL查詢語句會非常緩慢,你需增加order by,并且order by字段需要建立索引。
   如果使用子查詢去優化LIMIT的話,則子查詢必須是連續的,某種意義來講,子查詢不應該有where條件,where會過濾數據,使數據失去連續性。
   如果你查詢的記錄比較大,并且數據傳輸量比較大,比如包含了text類型的field,則可以通過建立子查詢。

   SELECT id,title,content FROM items WHERE id IN (SELECT id FROM items ORDER BY id limit 900000, 10);

   如果limit語句的offset較大,你可以通過傳遞pk鍵值來減小offset = 0,這個主鍵最好是int類型并且auto_increment

   SELECT * FROM users WHERE uid > 456891 ORDER BY uid LIMIT 0, 10;

   這條語句,大意如下:

   SELECT * FROM users WHERE uid >=  (SELECT uid FROM users ORDER BY uid limit 895682, 1) limit 0, 10;
   如果limit的offset值過大,用戶也會翻頁疲勞,你可以設置一個offset最大的,超過了可以另行處理,一般連續翻頁過大,用戶體驗很差,則應該提供更優的用戶體驗給用戶。

   limit 分頁優化方法

   1.子查詢優化法
   先找出第一條數據,然后大于等于這條數據的id就是要獲取的數據
   缺點:數據必須是連續的,可以說不能有where條件,where條件會篩選數據,導致數據失去連續性
   實驗下
    mysql> set profi=1;
   Query OK, 0 rows affected (0.00 sec)
   mysql> select count(*) from Member;
   +———-+
   | count(*) |
   +———-+
   |   169566 |
   +———-+
   1 row in set (0.00 sec)
   mysql> pager grep !~-
   PAGER set to ‘grep !~-‘
   mysql> select * from Member limit 10, 100;
   100 rows in set (0.00 sec)
   mysql> select * from Member where MemberID >= (select MemberID from Member limit 10,1) limit 100;
   100 rows in set (0.00 sec)
   mysql> select * from Member limit 1000, 100;
   100 rows in set (0.01 sec)
   mysql> select * from Member where MemberID >= (select MemberID from Member limit 1000,1) limit 100;
   100 rows in set (0.00 sec)
   mysql> select * from Member limit 100000, 100;
   100 rows in set (0.10 sec)
   mysql> select * from Member where MemberID >= (select MemberID from Member limit 100000,1) limit 100;
   100 rows in set (0.02 sec)
   mysql> nopager
   PAGER set to stdout
   mysql> show profilesG
   *************************** 1. row ***************************
   Query_ID: 1
   Duration: 0.00003300
      Query: select count(*) from Member
   *************************** 2. row ***************************
   Query_ID: 2
   Duration: 0.00167000
      Query: select * from Member limit 10, 100
   *************************** 3. row ***************************
   Query_ID: 3
   Duration: 0.00112400
      Query: select * from Member where MemberID >= (select MemberID from Member limit 10,1) limit 100
   *************************** 4. row ***************************
   Query_ID: 4
   Duration: 0.00263200
      Query: select * from Member limit 1000, 100
   *************************** 5. row ***************************
   Query_ID: 5
   Duration: 0.00134000
      Query: select * from Member where MemberID >= (select MemberID from Member limit 1000,1) limit 100
   *************************** 6. row ***************************
   Query_ID: 6
   Duration: 0.09956700
      Query: select * from Member limit 100000, 100
   *************************** 7. row ***************************
   Query_ID: 7
   Duration: 0.02447700
      Query: select * from Member where MemberID >= (select MemberID from Member limit 100000,1) limit 100
    從結果中可以得知,當偏移1000以上使用子查詢法可以有效的提高性能。
   2.倒排表優化法
   倒排表法類似建立索引,用一張表來維護頁數,然后通過高效的連接得到數據
   缺點:只適合數據數固定的情況,數據不能刪除,維護頁表困難
   3.反向查找優化法
   當偏移超過一半記錄數的時候,先用排序,這樣偏移就反轉了
   缺點:order by優化比較麻煩,要增加索引,索引影響數據的修改效率,并且要知道總記錄數
   ,偏移大于數據的一半
   引用
   limit偏移算法:
   正向查找: (當前頁 – 1) * 頁長度
   反向查找: 總記錄 – 當前頁 * 頁長度
   做下實驗,看看性能如何
   總記錄數:1,628,775
   每頁記錄數: 40
   總頁數:1,628,775 / 40 = 40720
   中間頁數:40720 / 2 = 20360
   第21000頁
   正向查找SQL:
   Sql代碼
   SELECT * FROM `abc` WHERE `BatchID` = 123 LIMIT 839960, 40
   時間:1.8696 秒
   反向查找sql:
   Sql代碼
   SELECT * FROM `abc` WHERE `BatchID` = 123 ORDER BY InputDate DESC LIMIT 788775, 40
   時間:1.8336 秒
   第30000頁
   正向查找SQL:
   Sql代碼
   1.SELECT * FROM `abc` WHERE `BatchID` = 123 LIMIT 1199960, 40
   SELECT * FROM `abc` WHERE `BatchID` = 123 LIMIT 1199960, 40
   時間:2.6493 秒
   反向查找sql:
   Sql代碼
   1.SELECT * FROM `abc` WHERE `BatchID` = 123 ORDER BY InputDate DESC LIMIT 428775, 40
   SELECT * FROM `abc` WHERE `BatchID` = 123 ORDER BY InputDate DESC LIMIT 428775, 40
    時間:1.0035 秒
   注意,反向查找的結果是是降序desc的,并且InputDate是記錄的插入時間,也可以用主鍵聯合索引,但是不方便。
   4.limit限制優化法
   把limit偏移量限制低于某個數。。超過這個數等于沒數據,我記得alibaba的dba說過他們是這樣做的
   5.只查索引法


注:相關教程知識閱讀請移步到MYSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人一区二| 美女撒尿一区二区三区| 亚洲电影成人av99爱色| 正在播放欧美一区| 亚洲成人黄色在线| 精品视频在线播放色网色视频| 一二美女精品欧洲| 日韩美女视频免费看| 2018国产精品视频| 亚洲女人天堂av| 欧美精品999| 亚洲人成免费电影| 亚洲中国色老太| 欧美激情综合亚洲一二区| 91久久在线视频| 色香阁99久久精品久久久| 欧美性高跟鞋xxxxhd| 国产精品偷伦一区二区| 亚洲综合小说区| 欧美二区乱c黑人| 97精品欧美一区二区三区| 中文日韩在线观看| 久久久久久久久久久免费| 亚洲bt欧美bt日本bt| 精品丝袜一区二区三区| 欧美在线免费视频| 日韩一区二区欧美| 精品久久久免费| 亚洲无限乱码一二三四麻| 日韩国产激情在线| 日本sm极度另类视频| 国产精品直播网红| 欧美性jizz18性欧美| 国产亚洲精品va在线观看| 国产精品一区二区性色av| 欧美精品18videos性欧| 日韩中文在线不卡| 精品久久久久久久久中文字幕| 国产精品丝袜白浆摸在线| 91精品一区二区| 国产丝袜高跟一区| 国产精品96久久久久久又黄又硬| 成人精品视频99在线观看免费| 在线播放日韩av| 午夜精品久久久久久99热| 亚洲一区二区三区成人在线视频精品| 亚洲男子天堂网| 成人精品一区二区三区电影免费| 国产丝袜一区二区三区免费视频| 欧美性色19p| 欧美日韩亚洲一区二区三区| 91久久精品国产91久久| 日韩成人av在线播放| 日本一区二区三区在线播放| 国产精品69久久| 精品magnet| 成人欧美一区二区三区黑人| 日本不卡视频在线播放| 亚洲国产精品久久久久| 国产成人精品在线观看| 国产精品第一视频| 亚洲国产日韩欧美在线99| 欧美一级片在线播放| 欧洲美女7788成人免费视频| 91免费人成网站在线观看18| 久久91亚洲精品中文字幕奶水| 富二代精品短视频| 91午夜理伦私人影院| 久久久久久亚洲精品| 日韩在线观看成人| 亚洲成人激情图| 亚洲国产天堂久久综合| 中文字幕日本欧美| 久久精品人人爽| 国产精品99蜜臀久久不卡二区| 日韩黄色高清视频| 国产日韩欧美视频| 美女av一区二区三区| 亚洲va久久久噜噜噜| 狠狠躁夜夜躁人人爽超碰91| 国产丝袜一区二区三区免费视频| 国产精品免费小视频| 色偷偷88888欧美精品久久久| 国产精品专区一| 久久久久久com| 午夜精品久久久久久久男人的天堂| 黑人狂躁日本妞一区二区三区| 亚洲国内高清视频| 成人激情视频小说免费下载| 欧美大成色www永久网站婷| 成人国产精品免费视频| 国产日产欧美a一级在线| 成人在线激情视频| 亚洲第一视频在线观看| 丝袜美腿亚洲一区二区| 久久久久久久久久久免费精品| 亚洲视频在线观看免费| 国产精品高精视频免费| 中文字幕在线国产精品| 久久精品久久久久久| 欧美精品aaa| 青青草99啪国产免费| 欧美成年人视频| 最近的2019中文字幕免费一页| 亚洲欧美日韩精品久久| 亚洲最大的av网站| 欧美极品少妇xxxxⅹ裸体艺术| 国内精品久久久| 中文字幕精品视频| 91中文在线观看| 日韩av电影在线播放| 国产精品久久久久久久一区探花| 色哟哟网站入口亚洲精品| 国产精品美女久久久免费| 日韩视频永久免费观看| 日韩在线观看免费网站| 欧美一级免费看| 亚洲男人天堂手机在线| 欧美日韩在线视频一区| 国产精品高潮呻吟久久av黑人| 亚洲成人在线视频播放| 国产精品福利片| 成人av在线天堂| 久久久久一本一区二区青青蜜月| 久久久999国产| 中文字幕欧美日韩va免费视频| 在线观看国产欧美| 黄色成人在线播放| 亚洲欧洲在线观看| 久久五月天色综合| 国产情人节一区| 亚洲情综合五月天| 亚洲精品白浆高清久久久久久| 欧美日韩中文字幕在线视频| 亚洲国产精彩中文乱码av在线播放| 精品国产31久久久久久| 亚洲精品黄网在线观看| 亚洲精品成人久久电影| 午夜精品在线视频| 久久久噜久噜久久综合| 久久久国产精品亚洲一区| 色婷婷av一区二区三区久久| 久久99青青精品免费观看| 91亚洲一区精品| 成人黄色在线免费| 国产91精品视频在线观看| 超碰91人人草人人干| 亚洲片国产一区一级在线观看| 国产精品69久久久久| 亚洲国产成人爱av在线播放| 国产一区二区在线免费视频| 69av在线视频| 亚洲国语精品自产拍在线观看| 久久久噜噜噜久久| 久久色在线播放| 91av在线不卡| 91成人免费观看网站| 欧美黑人一级爽快片淫片高清| 亚洲第一二三四五区| 欧美日韩激情美女| 日韩精品亚洲元码| 最近中文字幕日韩精品| 欧美激情欧美激情在线五月| 欧美亚洲视频一区二区|