最近在研究一個(gè)SQL的時(shí)候,發(fā)現(xiàn)一個(gè)有意思的問題。Sql代碼如下:
sql代碼挺長的,我們直接看它的執(zhí)行計(jì)劃,把它的執(zhí)行計(jì)劃在https://explain.depesz.com/格式化顯示。
通過STATS可以發(fā)現(xiàn),SQL總共執(zhí)行3.2秒,Limit這個(gè)操作占用了近1.1秒的時(shí)間。這里首先我們對(duì)數(shù)據(jù)進(jìn)行全部排序,排序完后選擇整個(gè)記錄的第一行。按道理來說慢應(yīng)該在排序這個(gè)地方,而不應(yīng)該在limit 1這里。
為了研究這個(gè)問題,搜索了一下,發(fā)現(xiàn)stackoverflow中有人提過這類問題。
我按照這個(gè)思路,把這個(gè)SQL進(jìn)行了改寫,使用了row_number() OVER()的方式。改寫后代碼如下:
經(jīng)過改寫后的執(zhí)行計(jì)劃如下:
查看統(tǒng)計(jì)值
幾乎沒有特別高消耗。執(zhí)行時(shí)間從3.2秒下降到1.4秒。
當(dāng)然此類問題還有很多,都是limit 1引起的。我在stackexchange上也發(fā)現(xiàn)了這樣的一個(gè)案例。
我們觀察它改寫之前和改寫之后的SQL,整個(gè)改寫就是把它變成了子查詢就正常了。這是因?yàn)榍懊娴腟QL沒有使用上索引,改成子查詢后就使用上了索引。
知乎上也有作者遇到這個(gè)問題,并按照這個(gè)方式解決了。
https://zhuanlan.zhihu.com/p/45748671
所以說order by Limit n這種寫法是有坑的。如果你發(fā)現(xiàn)它有一些慢,建議進(jìn)行改寫。
更多精彩干貨分享
點(diǎn)擊下方名片關(guān)注
IT那活兒
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/129792.html
摘要:基本環(huán)境操作系統(tǒng)安裝安裝和安裝時(shí)序數(shù)據(jù)庫插件部署實(shí)踐時(shí)空數(shù)據(jù)庫德哥官網(wǎng)安裝文檔設(shè)置實(shí)驗(yàn)下載測(cè)試數(shù)據(jù)創(chuàng)建數(shù)據(jù)庫解壓下載文件創(chuàng)建表結(jié)構(gòu)導(dǎo)入數(shù)據(jù)查詢測(cè)試注釋數(shù)據(jù)庫啟動(dòng)連接數(shù)據(jù)庫創(chuàng) 基本環(huán)境 操作系統(tǒng): centOS 7 postGreSQL : 10 timescaleDB : 1.0 + postGreSQL安裝 Centos7 安裝Postgresql10.5和PostGIS times...
摘要:使用數(shù)據(jù)庫會(huì)自動(dòng)的根據(jù)從某幾個(gè)片中讀取數(shù)據(jù)。更加詳細(xì)的請(qǐng)參考德哥文章 官方地址:https://github.com/postgrespr...關(guān)于pathman的原理和優(yōu)化問題,請(qǐng)移步至https://yq.aliyun.com/article... 檢查環(huán)境變量如果直接執(zhí)行psql命令提示command not found則執(zhí)行下面的命令設(shè)置環(huán)境變量 root@host# PA...
摘要:場(chǎng)景有這樣一張表,分頁查詢時(shí),第一頁的記錄又出現(xiàn)下第二頁中,總之每一頁會(huì)出現(xiàn)之前出現(xiàn)的內(nèi)容。原因是值重復(fù)分析在數(shù)據(jù)庫中使用查詢語句第一頁第二頁第三頁查詢結(jié)果在第一頁和第二頁出現(xiàn)了重復(fù)的記錄。原因的值重復(fù)了解決方法用來的字段要保證唯一性。 場(chǎng)景 有這樣一張表,分頁查詢時(shí),第一頁的記錄又出現(xiàn)下第二頁中,總之每一頁會(huì)出現(xiàn)之前出現(xiàn)的內(nèi)容。原因是sort值重復(fù) showImg(https://s...
摘要:?jiǎn)栴}對(duì)于小的偏移量,直接使用來查詢沒有什么問題,但隨著數(shù)據(jù)量的增大,越往后分頁,語句的偏移量就會(huì)越大,速度也會(huì)明顯變慢。優(yōu)化思想避免數(shù)據(jù)量大時(shí)掃描過多的記錄解決子查詢的分頁方式或者分頁方式。MySQL的分頁查詢通常通過limit來實(shí)現(xiàn)。 MySQL的limit基本用法很簡(jiǎn)單。limit接收1或2個(gè)整數(shù)型參數(shù),如果是2個(gè)參數(shù),第一個(gè)是指定第一個(gè)返回記錄行的偏移量,第二個(gè)是返回記錄行的最大數(shù)目。...
閱讀 1353·2023-01-11 13:20
閱讀 1699·2023-01-11 13:20
閱讀 1211·2023-01-11 13:20
閱讀 1904·2023-01-11 13:20
閱讀 4161·2023-01-11 13:20
閱讀 2751·2023-01-11 13:20
閱讀 1397·2023-01-11 13:20
閱讀 3664·2023-01-11 13:20