最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

為什么MySQL分頁用limit會越來越慢

 更新時間:2021年07月25日 10:36:25   作者:程序員阿牛  
在mysql中l(wèi)imit可以實現(xiàn)快速分頁,但是如果數(shù)據(jù)到了幾百萬時我們的limit必須優(yōu)化才能有效的合理的實現(xiàn)分頁了,否則可能卡死你的服務器

阿牛新入職了一家新公司,第一個任務是根據(jù)條件導出訂單表中的數(shù)據(jù)到文件中,阿牛心想:這也太簡單了,于是很快寫好了如下語句,并且告訴測試自己的代碼是免測產(chǎn)品。

語句如下:

select * from orders where name=‘lilei' and create_time>'2020-01-01 00:00:00' limit start,end

沒想到上線一段時間后,生產(chǎn)開始預警,顯示這條sql為慢SQL,執(zhí)行時間50多秒,嚴重影響到了業(yè)務。
阿牛趕緊請教大佬猿猿幫忙查找原因,猿猿很快就幫其解決了,并且給阿牛做了以下實驗:

一、測試實驗

mysql分頁直接用limit start, count分頁語句:

select * from product limit start, count

當起始頁較小時,查詢沒有性能問題,我們分別看下從10, 100, 1000, 10000開始分頁的執(zhí)行時間(每頁取20條),如下:

select * from product limit 10, 20 0.016秒
select * from product limit 100, 20 0.016秒
select * from product limit 1000, 20 0.047秒
select * from product limit 10000, 20 0.094秒

我們已經(jīng)看出隨著起始記錄的增加,時間也隨著增大, 這說明分頁語句limit跟起始頁碼是有很大關系的,
那么我們把起始記錄改為40w看下(也就是記錄的一半左右)

select * from product limit 400000, 20 3.229秒

再看我們獲取最后一頁記錄的時間

select * from product limit 866613, 20 37.44秒

像這種分頁最大的頁碼頁顯然這種時間是無法忍受的。
從中我們也能總結出兩件事情:
limit語句的查詢時間與起始記錄的位置成正比。
mysql的limit語句是很方便,但是對記錄很多的表并不適合直接使用。

二、 對limit分頁問題的性能優(yōu)化方法

2.1 利用表的覆蓋索引來加速分頁查詢

我們都知道,利用了索引查詢的語句中如果只包含了那個索引列(覆蓋索引),那么這種情況會查詢很快。
因為利用索引查找有優(yōu)化算法,且數(shù)據(jù)就在查詢索引上面,不用再去找相關的數(shù)據(jù)地址了,這樣節(jié)省了很多時間。
另外Mysql中也有相關的索引緩存,在并發(fā)高的時候利用緩存就效果更好了。
在我們的例子中,我們知道id字段是主鍵,自然就包含了默認的主鍵索引。現(xiàn)在讓我們看看利用覆蓋索引的查詢效果如何:
這次我們之間查詢最后一頁的數(shù)據(jù)(利用覆蓋索引,只包含id列),如下:

select id from product limit 866613, 20

查詢時間為0.2秒,相對于查詢了所有列的37.44秒,提升了大概100多倍的速度。
那么如果我們也要查詢所有列,有兩種方法,

2.2 利用 id>=的形式:

SELECT * FROM product 
WHERE ID > =(select id from product limit 866613, 1) limit 20

查詢時間為0.2秒,簡直是一個質(zhì)的飛躍啊。

2.3 利用join

SELECT * FROM product a 
JOIN (select id from product limit 866613, 20) b ON a.ID = b.id

總結:

是不是認為我沒說理由,原因就是使用select * 的情況下直接用limit 600000,10 掃描的是約60萬條數(shù)據(jù),并且是需要回表60W次,也就是說大部分性能都耗在隨機訪問上,到頭來只用到10條數(shù)據(jù),如果先查出來ID,再關聯(lián)去查詢記錄,就會快很多,因為索引查找符合條件的ID很快,然后再回表10次。就可以拿到我們想要的數(shù)據(jù)。

到此這篇關于為什么MySQL分頁用limit會越來越慢的文章就介紹到這了,更多相關MySQL分頁limit慢內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • mysql中between的用法及說明

    mysql中between的用法及說明

    這篇文章主要介紹了mysql中between的用法及說明,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Mysql字符串截取函數(shù)SUBSTRING的用法說明

    Mysql字符串截取函數(shù)SUBSTRING的用法說明

    今天建視圖時,用到了MySQL中的字符串截取,很是方便。
    2011-06-06
  • Mysql inner join on的用法實例(必看)

    Mysql inner join on的用法實例(必看)

    下面小編就為大家?guī)硪黄狹ysql inner join on的用法實例(必看)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-03-03
  • MySQL中TEXT與BLOB字段類型的區(qū)別

    MySQL中TEXT與BLOB字段類型的區(qū)別

    這篇文章主要介紹了MySQL中TEXT與BLOB字段類型的區(qū)別,本文總結了6大區(qū)別,需要的朋友可以參考下
    2014-08-08
  • Linux下Mysql5.7.19卸載方法

    Linux下Mysql5.7.19卸載方法

    在卸載mysql之前需要先查找下以前是否安裝過mysql,具體查找命令在本文有介紹,本文重點給大家介紹Linux下Mysql5.7.19卸載方法,需要的朋友參考下吧
    2017-08-08
  • 干涉MySQL優(yōu)化器使用hash?join的方法

    干涉MySQL優(yōu)化器使用hash?join的方法

    這篇文章主要介紹了如何干涉MySQL優(yōu)化器使用hash?join,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-09-09
  • 一文弄懂MySQL自增主鍵

    一文弄懂MySQL自增主鍵

    這篇文章主要介紹了MySQL自增主鍵,MySQL的自增主鍵并不一定是連續(xù)的,自增值的保存位置和修改機制決定了一種自增值不連續(xù)的場景,下面就來具體介紹一下,感興趣的可以了解一下
    2025-01-01
  • MySQL性能優(yōu)化的一些技巧幫助你的數(shù)據(jù)庫

    MySQL性能優(yōu)化的一些技巧幫助你的數(shù)據(jù)庫

    你完成了你的品牌新的應用程序,一切工作就像一個魅力;突然間,一個大爆發(fā)的用戶你的MySQL服務器,您的網(wǎng)站已關閉,是什么問題導致的呢?以下是MySQL性能優(yōu)化的一些技巧,將幫助你,幫助你的數(shù)據(jù)庫
    2013-01-01
  • 深入解析MySQL的窗口函數(shù)

    深入解析MySQL的窗口函數(shù)

    這篇文章主要介紹了深入解析MySQL的窗口函數(shù),窗口可以理解為記錄集合,窗口函數(shù)就是在滿足某種條件的記錄集合上執(zhí)行的特殊函數(shù),即:應用在窗口內(nèi)的函數(shù),需要的朋友可以參考下
    2023-07-07
  • Navicat工具中設置MySQL允許外部訪問

    Navicat工具中設置MySQL允許外部訪問

    默認情況下MySQL只允許本地登錄,即只能在安裝MySQL環(huán)境所在的主機下訪問,這篇文章主要給大家介紹了關于Navicat工具中設置MySQL允許外部訪問的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2024-04-04

最新評論

宁南县| 南溪县| 兴文县| 淮安市| 盐城市| 潼南县| 韶关市| 余江县| 长治县| 平利县| 无极县| 塔城市| 涞源县| 珲春市| 津南区| 芜湖市| 黄冈市| 儋州市| 宁明县| 清河县| 昌黎县| 大方县| 清水县| 霸州市| 佛教| 东兰县| 应城市| 仁寿县| 客服| 同德县| 察哈| 界首市| 青岛市| 金溪县| 绵阳市| 通化市| 六枝特区| 安阳县| 东源县| 尉氏县| 长沙市|