在大數(shù)據(jù)情況下MySQL的一種簡(jiǎn)單分頁(yè)優(yōu)化方法
通常應(yīng)用需要對(duì)表中的數(shù)據(jù)進(jìn)行翻頁(yè),如果數(shù)據(jù)量很大,往往會(huì)帶來(lái)性能上的問(wèn)題:
root@sns 07:16:25>select count(*) from reply_0004 where thread_id = 5616385 and deleted = 0; +———-+ | count(*) | +———-+ | 1236795 | +———-+ 1 row in set (0.44 sec) root@sns 07:16:30>select id from reply_0004 where thread_id = 5616385 and deleted = 0 order by id asc limit 1236785, 10 ; +———–+ | id | +———–+ | 162436798 | | 162438180 | | 162440102 | | 162442044 | | 162479222 | | 162479598 | | 162514705 | | 162832588 | | 162863394 | | 162899685 | +———–+ 10 rows in set (1.32 sec)
索引:threa_id+deleted+id(gmt_Create)
10 rows in set (1.32 sec)
這兩條sql是為查詢最后一頁(yè)的翻頁(yè)sql查詢用的。由于一次翻頁(yè)往往只需要查詢較小的數(shù)據(jù),如10條,但需要向后掃描大量的數(shù)據(jù),也就是越往后的翻頁(yè)查詢,掃描的數(shù)據(jù)量會(huì)越多,查詢的速度也就越來(lái)越慢。
由于查詢的數(shù)據(jù)量大小是固定的,如果查詢速度不受翻頁(yè)的頁(yè)數(shù)影響,或者影響最低,那么這樣是最佳的效果了(查詢最后最幾頁(yè)的速度和開(kāi)始幾頁(yè)的速度一致)。
在翻頁(yè)的時(shí)候,往往需要對(duì)其中的某個(gè)字段做排序(這個(gè)字段在索引中),升序排序。那么可不可以利用索引的有序性來(lái)解決上面遇到的問(wèn)題喃,答案是肯定的。比如有10000條數(shù)據(jù)需要做分頁(yè),那么前5000條做asc排序,后5000條desc排序,在limit startnum,pagesize參數(shù)中作出相應(yīng)的調(diào)整。
但是這無(wú)疑給應(yīng)用程序帶來(lái)復(fù)雜,這條sql是用于論壇回復(fù)帖子的sql,往往用戶在看帖子的時(shí)候,一般都是查看前幾頁(yè)和最后幾頁(yè),那么在翻頁(yè)的時(shí)候最后幾頁(yè)的翻頁(yè)查詢采用desc的方式來(lái)實(shí)現(xiàn)翻頁(yè),這樣就可以較好的提高性能:
root@snsgroup 07:16:49>select * from (select id -> from group_thread_reply_0004 where thread_id = 5616385 and deleted = 0 -> order by id desc limit 0, 10)t order by t.id asc; +———–+ | id | +———–+ | 162436798 | | 162438180 | | 162440102 | | 162442044 | | 162479222 | | 162479598 | | 162514705 | | 162832588 | | 162863394 | | 162899685 | +———–+ 10 rows in set (0.87 sec)
可以看到性能提升了50%以上。
相關(guān)文章
mysql運(yùn)行net start mysql報(bào)服務(wù)名無(wú)效的解決辦法
這篇文章主要為大家詳細(xì)介紹了mysql運(yùn)行net start mysql報(bào)服務(wù)名無(wú)效的解決辦法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01MySQL定時(shí)備份方案(利用Linux crontab)
這篇文章主要給大家介紹了關(guān)于MySQL定時(shí)備份方案的相關(guān)資料,文中通過(guò)示例代碼以及圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07Eclipse與MySQL數(shù)據(jù)庫(kù)的連接教程(已實(shí)操)
用eclipse編寫的好的代碼,我們?cè)趺床拍苓B接到數(shù)據(jù)庫(kù)呢?下面這篇文章主要給大家介紹了關(guān)于Eclipse與MySQL數(shù)據(jù)庫(kù)連接的相關(guān)資料,下面的操作是經(jīng)本人驗(yàn)證,確實(shí)可行,需要的朋友可以參考下2023-05-05MySQL表的CURD操作(數(shù)據(jù)的增刪改查)
數(shù)據(jù)庫(kù)本質(zhì)上是一個(gè)文件系統(tǒng),通過(guò)標(biāo)準(zhǔn)的SQL語(yǔ)句對(duì)數(shù)據(jù)進(jìn)行CURD操作,下面這篇文章主要給大家介紹了關(guān)于MySQL表的CURD操作的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-02-02MySQL中USING 和 HAVING 用法實(shí)例簡(jiǎn)析
這篇文章主要介紹了MySQL中USING 和 HAVING 用法,結(jié)合實(shí)例形式簡(jiǎn)單分析了mysql中USING 和 HAVING的功能、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2019-08-08MySQL數(shù)據(jù)庫(kù)操作DQL正則表達(dá)式
這篇文章主要介紹了MySQL數(shù)據(jù)庫(kù)操作DQL正則表達(dá)式,正則表達(dá)式描述了一種字符串匹配的規(guī)則,正則表達(dá)式本身就是一個(gè)字符串,使用這個(gè)字符串來(lái)描述、用來(lái)定義匹配規(guī)則,匹配一系列符合某個(gè)句法規(guī)則的字符串2022-07-07Windows 8下MySQL Community Server 5.6安裝配置方法圖文教程
這篇文章主要為大家詳細(xì)介紹了Windows 8下MySQL Community Server 5.6安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-09-09MySQL 重裝MySQL后, mysql服務(wù)無(wú)法啟動(dòng)
把mysql程序卸載后, 重裝, 結(jié)果mysql服務(wù)啟動(dòng)不了,碰到這個(gè)問(wèn)題的朋友可以參考下。2011-08-08