在大數(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是為查詢(xún)最后一頁(yè)的翻頁(yè)sql查詢(xún)用的。由于一次翻頁(yè)往往只需要查詢(xún)較小的數(shù)據(jù),如10條,但需要向后掃描大量的數(shù)據(jù),也就是越往后的翻頁(yè)查詢(xún),掃描的數(shù)據(jù)量會(huì)越多,查詢(xún)的速度也就越來(lái)越慢。
由于查詢(xún)的數(shù)據(jù)量大小是固定的,如果查詢(xún)速度不受翻頁(yè)的頁(yè)數(shù)影響,或者影響最低,那么這樣是最佳的效果了(查詢(xún)最后最幾頁(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,往往用戶(hù)在看帖子的時(shí)候,一般都是查看前幾頁(yè)和最后幾頁(yè),那么在翻頁(yè)的時(shí)候最后幾頁(yè)的翻頁(yè)查詢(xún)采用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 數(shù)據(jù)庫(kù)命名與設(shè)計(jì)規(guī)范
對(duì)于MYSQL 數(shù)據(jù)庫(kù)的命名與設(shè)計(jì),需要一定的規(guī)范,所以我們要了解和快速的掌握mysql有很多的幫助。2008-12-12
linux二進(jìn)制通用包安裝mysql5.6.20教程
這篇文章主要為大家詳細(xì)介紹了linux二進(jìn)制通用包安裝mysql5.6.20的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01
為什么MySQL分頁(yè)用limit會(huì)越來(lái)越慢
在mysql中l(wèi)imit可以實(shí)現(xiàn)快速分頁(yè),但是如果數(shù)據(jù)到了幾百萬(wàn)時(shí)我們的limit必須優(yōu)化才能有效的合理的實(shí)現(xiàn)分頁(yè)了,否則可能卡死你的服務(wù)器2021-07-07
MySQL悲觀(guān)鎖與樂(lè)觀(guān)鎖的實(shí)現(xiàn)方案
我們知道Mysql并發(fā)事務(wù)會(huì)引起更新丟失問(wèn)題,解決辦法是鎖,所以本文將對(duì)鎖(樂(lè)觀(guān)鎖、悲觀(guān)鎖)進(jìn)行分析,這篇文章主要給大家介紹了關(guān)于MySQL悲觀(guān)鎖與樂(lè)觀(guān)鎖方案的相關(guān)資料,需要的朋友可以參考下2021-11-11
MySQL 存儲(chǔ)過(guò)程中執(zhí)行動(dòng)態(tài)SQL語(yǔ)句的方法
這篇文章主要介紹了MySQL 存儲(chǔ)過(guò)程中執(zhí)行動(dòng)態(tài)SQL語(yǔ)句的方法,需要的朋友可以參考下2014-08-08
mysql使用教程之分區(qū)表的使用方法(刪除分區(qū)表)
mysql分區(qū)表使用方法,新增分區(qū)、刪除分區(qū)、分區(qū)的合并、分區(qū)的拆分等使用方法2013-12-12
MySQL?驅(qū)動(dòng)中虛引用?GC?耗時(shí)優(yōu)化與源碼分析
這篇文章主要為大家介紹了MySQL?驅(qū)動(dòng)中虛引用?GC?耗時(shí)優(yōu)化與源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05

