人妖在线一区,国产日韩欧美一区二区综合在线,国产啪精品视频网站免费,欧美内射深插日本少妇

新聞動(dòng)態(tài)

為什么MySQL分頁(yè)用limit會(huì)越來(lái)越慢

發(fā)布日期:2022-02-09 14:28 | 文章來(lái)源:源碼中國(guó)

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

語(yǔ)句如下:

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

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

一、測(cè)試實(shí)驗(yàn)

mysql分頁(yè)直接用limit start, count分頁(yè)語(yǔ)句:

select * from product limit start, count

當(dāng)起始頁(yè)較小時(shí),查詢沒(méi)有性能問(wèn)題,我們分別看下從10, 100, 1000, 10000開(kāi)始分頁(yè)的執(zhí)行時(shí)間(每頁(yè)取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)看出隨著起始記錄的增加,時(shí)間也隨著增大, 這說(shuō)明分頁(yè)語(yǔ)句limit跟起始頁(yè)碼是有很大關(guān)系的,
那么我們把起始記錄改為40w看下(也就是記錄的一半左右)

select * from product limit 400000, 20 3.229秒

再看我們獲取最后一頁(yè)記錄的時(shí)間

select * from product limit 866613, 20 37.44秒

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

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

2.1 利用表的覆蓋索引來(lái)加速分頁(yè)查詢

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

select id from product limit 866613, 20

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

2.2 利用 id>=的形式:

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

查詢時(shí)間為0.2秒,簡(jiǎn)直是一個(gè)質(zhì)的飛躍啊。

2.3 利用join

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

總結(jié):

是不是認(rèn)為我沒(méi)說(shuō)理由,原因就是使用select * 的情況下直接用limit 600000,10 掃描的是約60萬(wàn)條數(shù)據(jù),并且是需要回表60W次,也就是說(shuō)大部分性能都耗在隨機(jī)訪問(wèn)上,到頭來(lái)只用到10條數(shù)據(jù),如果先查出來(lái)ID,再關(guān)聯(lián)去查詢記錄,就會(huì)快很多,因?yàn)樗饕檎曳蠗l件的ID很快,然后再回表10次。就可以拿到我們想要的數(shù)據(jù)。

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

海外服務(wù)器租用

版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。

相關(guān)文章

實(shí)時(shí)開(kāi)通

自選配置、實(shí)時(shí)開(kāi)通

免備案

全球線路精選!

全天候客戶服務(wù)

7x24全年不間斷在線

專屬顧問(wèn)服務(wù)

1對(duì)1客戶咨詢顧問(wèn)

在線
客服

在線客服:7*24小時(shí)在線

客服
熱線

400-630-3752
7*24小時(shí)客服服務(wù)熱線

關(guān)注
微信

關(guān)注官方微信
頂部