本篇內(nèi)容介紹了“MySQL千萬數(shù)據(jù)表Limit分頁查詢?nèi)绾蝺?yōu)化”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
成都創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:網(wǎng)站制作、做網(wǎng)站、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的薩嘎網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
在各類系統(tǒng)的表格類信息展示的功能中,經(jīng)常會(huì)用到“翻頁”這個(gè)操作,在頁面上每次只展示有限的數(shù)據(jù),需要看其他數(shù)據(jù)的時(shí)候則像翻書一樣翻到后面的“頁”。在 MySQL 支持的 SQL 語法中對(duì)此有特殊的支持,開發(fā)人員在實(shí)現(xiàn)這類功能的時(shí)候很方便:
select*fromxxx limit M,N
select*fromxxx limit N offset M
這兩類語法代表的意思是一樣的:返回從第 M 開始(不包括這一行)之后的 N 行數(shù)據(jù)。雖然使用起來很方便,但是這類語句存在查詢性能上的陷阱,需要特別注意一下。
在解釋原理之前,先看一下實(shí)際的效果,看看這個(gè)“性能的陷阱”是什么。
兩個(gè)語句的內(nèi)容都非常簡單,差別只在 limit 的部分,第一個(gè)語句跳過的行數(shù)很少,第二個(gè)語句跳過的行數(shù)很多,結(jié)果是兩個(gè)語句的執(zhí)行時(shí)間差了至少 200 倍。PS:limit 配合 order by 使用是一個(gè)好習(xí)慣,確保結(jié)果數(shù)據(jù)是穩(wěn)定的。
可以看到跳過的行數(shù)大幅度增長時(shí),SQL 語句的執(zhí)行時(shí)間也會(huì)快速增長,原因其實(shí)比較簡單:在處理 limit M,N 的時(shí)候,MySQL 會(huì)先拿到 M+N 行結(jié)果數(shù)據(jù),然后再丟棄 M 行數(shù)據(jù),展示之后剩下的 N 行數(shù)據(jù)。所以上圖的第二個(gè)語句實(shí)際上掃描了 800 多萬行數(shù)據(jù),然后丟棄了 800 萬行數(shù)據(jù),只展示之后的 1 行結(jié)果。
利用[慢查詢分析三部曲][Link 1]的方法嘗試排查一下,explain 和 optimizer_trace 都看不出來差別,但是 profile 里面能看出來兩者的差距:
雖然都只輸出一行結(jié)果,但是在 Sending data 階段花費(fèi)的時(shí)間差別很大,其實(shí)就是花在掃描 800 萬行數(shù)據(jù)上去了。
針對(duì)這個(gè)問題,其實(shí)有一個(gè)比較通用的優(yōu)化思路:利用 join,先根據(jù)主鍵搜索到需要的數(shù)據(jù),再通過主鍵關(guān)聯(lián)到原來的表輸出結(jié)果。SQL 可以改寫一下:
SQL 改寫的效果
可以看到查詢時(shí)間降到了 1.5s 左右,提升了約 37%,看起來還可以,那么還有其他的辦法么?
顯然還是有的,不過這會(huì)要求表有自增主鍵。在分頁查詢的時(shí)候,記錄上一次查詢結(jié)果中的主鍵,然后在 where 條件中添加主鍵的范圍約束。以上面的查詢?yōu)槔?,上次分頁查詢時(shí)的主鍵是 8000001,那么下次分頁的時(shí)候,where 條件中添加一個(gè)主鍵約束:id>8000001
,再來看看查詢效果:
添加條件之后的效果
可以發(fā)現(xiàn)利用主鍵來篩選掉上一次分頁前的所有數(shù)據(jù)后再用 limit,查詢基本是馬上返回結(jié)果的。不過要特別注意,這種方法是根據(jù)主鍵的順序先做了一次篩選,不一定會(huì)適用于所有的業(yè)務(wù)場景,理論上 UUID 類的主鍵也可以用,但是改造 SQL 前務(wù)必確保查詢結(jié)果是符合預(yù)期的。
“mysql千萬數(shù)據(jù)表Limit分頁查詢?nèi)绾蝺?yōu)化”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
標(biāo)題名稱:mysql千萬數(shù)據(jù)表Limit分頁查詢?nèi)绾蝺?yōu)化
本文鏈接:http://aaarwkj.com/article40/jegpeo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、微信公眾號(hào)、搜索引擎優(yōu)化、App開發(fā)、電子商務(wù)、網(wǎng)頁設(shè)計(jì)公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)