国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

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

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數(shù)據(jù)庫技術|

服務器之家 - 數(shù)據(jù)庫 - Mysql - MYSQL分頁limit速度太慢的優(yōu)化方法

MYSQL分頁limit速度太慢的優(yōu)化方法

2020-06-10 15:51OurMySQL Mysql

這篇文章主要介紹了MYSQL分頁limit速度太慢的優(yōu)化方法,需要的朋友可以參考下

在mysql中l(wèi)imit可以實現(xiàn)快速分頁,但是如果數(shù)據(jù)到了幾百萬時我們的limit必須優(yōu)化才能有效的合理的實現(xiàn)分頁了,否則可能卡死你的服務器哦。

   當一個表數(shù)據(jù)有幾百萬的數(shù)據(jù)的時候成了問題!

   如 * from table limit 0,10 這個沒有問題 當 limit 200000,10 的時候數(shù)據(jù)讀取就很慢,可以按照一下方法解決
    第一頁會很快
   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行。
   總數(shù)據(jù)有500萬左右
   以下例子 當時候 select * from wl_tagindex where byname='f' order by id limit 300000,10 執(zhí)行時間是 3.21s
   優(yōu)化后:

?
1
2
3
4
5
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

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

   總結

   當一個數(shù)據(jù)庫表過于龐大,LIMIT offset, length中的offset值過大,則SQL查詢語句會非常緩慢,你需增加order by,并且order by字段需要建立索引。
   如果使用子查詢?nèi)?yōu)化LIMIT的話,則子查詢必須是連續(xù)的,某種意義來講,子查詢不應該有where條件,where會過濾數(shù)據(jù),使數(shù)據(jù)失去連續(xù)性。
   如果你查詢的記錄比較大,并且數(shù)據(jù)傳輸量比較大,比如包含了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最大的,超過了可以另行處理,一般連續(xù)翻頁過大,用戶體驗很差,則應該提供更優(yōu)的用戶體驗給用戶。

   limit 分頁優(yōu)化方法

   1.子查詢優(yōu)化法
   先找出第一條數(shù)據(jù),然后大于等于這條數(shù)據(jù)的id就是要獲取的數(shù)據(jù)
   缺點:數(shù)據(jù)必須是連續(xù)的,可以說不能有where條件,where條件會篩選數(shù)據(jù),導致數(shù)據(jù)失去連續(xù)性
   實驗下
    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.倒排表優(yōu)化法
   倒排表法類似建立索引,用一張表來維護頁數(shù),然后通過高效的連接得到數(shù)據(jù)
   缺點:只適合數(shù)據(jù)數(shù)固定的情況,數(shù)據(jù)不能刪除,維護頁表困難
   3.反向查找優(yōu)化法
   當偏移超過一半記錄數(shù)的時候,先用排序,這樣偏移就反轉了
   缺點:order by優(yōu)化比較麻煩,要增加索引,索引影響數(shù)據(jù)的修改效率,并且要知道總記錄數(shù)
   ,偏移大于數(shù)據(jù)的一半
   引用
   limit偏移算法:
   正向查找: (當前頁 – 1) * 頁長度
   反向查找: 總記錄 – 當前頁 * 頁長度
   做下實驗,看看性能如何
   總記錄數(shù):1,628,775
   每頁記錄數(shù): 40
   總頁數(shù):1,628,775 / 40 = 40720
   中間頁數(shù):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是記錄的插入時間,也可以用主鍵聯(lián)合索引,但是不方便。
   4.limit限制優(yōu)化法
   把limit偏移量限制低于某個數(shù)。。超過這個數(shù)等于沒數(shù)據(jù),我記得alibaba的dba說過他們是這樣做的
   5.只查索引法

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 亚洲综合社区 | 成人二区| 国产日韩成人 | 亚洲精品国产剧情久久9191 | 亚洲一区二区三区在线播放 | 欧美日韩免费在线 | 在线成人免费电影 | 成人国产 | 999久久久国产999久久久 | 一区二区不卡视频 | 久久免费精品 | 视频一区 日韩 | 午夜精品久久久久久久男人的天堂 | jdav视频在线观看免费 | 成年人免费观看在线视频 | 免播放器看av | 日韩成人 | 精品视频久久 | 久久国产综合 | 99国产视频 | 成人免费xxxxx在线视频软件 | 中文视频一区 | 国产精品久久 | 中文字幕精品一区 | 在线成人免费电影 | 精品国产一级 | 免费午夜电影 | 日本精品久久久 | 国产v日产∨综合v精品视频 | 久久99精品久久久久久园产越南 | 精品视频一区在线观看 | 色偷偷噜噜噜亚洲男人 | 亚洲免费在线播放 | 午夜精品久久久久久 | 在线观看一区三区 | 成人精品福利视频 | 国产黄色小视频在线观看 | 天天亚洲综合 | 久久精品国产99国产精品 | 久久先锋| 中文字幕高清免费日韩视频在线 |