MySQL單表百萬數(shù)據(jù)記錄分頁性能優(yōu)化技巧
測試環(huán)境:
先讓我們熟悉下基本的sql語句,來查看下我們將要測試表的基本信息
use infomation_schema SELECT * FROM TABLES WHERE TABLE_SCHEMA = ‘dbname' AND TABLE_NAME = ‘product'
查詢結(jié)果:

從上圖中我們可以看到表的基本信息:
表行數(shù):866633
平均每行的數(shù)據(jù)長度:5133字節(jié)
單表大小:4448700632字節(jié)
關(guān)于行和表大小的單位都是字節(jié),我們經(jīng)過計算可以知道
平均行長度:大約5k
單表總大?。?.1g
表中字段各種類型都有varchar、datetime、text等,id字段為主鍵
測試實驗
1. 直接用limit start, count分頁語句, 也是我程序中用的方法:
select * from product limit start, count
當起始頁較小時,查詢沒有性能問題,我們分別看下從10, 100, 1000, 10000開始分頁的執(zhí)行時間(每頁取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)看出隨著起始記錄的增加,時間也隨著增大, 這說明分頁語句limit跟起始頁碼是有很大關(guān)系的,那么我們把起始記錄改為40w看下(也就是記錄的一般左右) select * from product limit 400000, 20 3.229秒
再看我們?nèi)∽詈笠豁撚涗浀臅r間
select * from product limit 866613, 20 37.44秒
難怪搜索引擎抓取我們頁面的時候經(jīng)常會報超時,像這種分頁最大的頁碼頁顯然這種時
間是無法忍受的。
從中我們也能總結(jié)出兩件事情:
1)limit語句的查詢時間與起始記錄的位置成正比
2)mysql的limit語句是很方便,但是對記錄很多的表并不適合直接使用。
2. 對limit分頁問題的性能優(yōu)化方法
利用表的覆蓋索引來加速分頁查詢
我們都知道,利用了索引查詢的語句中如果只包含了那個索引列(覆蓋索引),那么這種情況會查詢很快。
因為利用索引查找有優(yōu)化算法,且數(shù)據(jù)就在查詢索引上面,不用再去找相關(guān)的數(shù)據(jù)地址了,這樣節(jié)省了很多時間。另外Mysql中也有相關(guān)的索引緩存,在并發(fā)高的時候利用緩存就效果更好了。
在我們的例子中,我們知道id字段是主鍵,自然就包含了默認的主鍵索引?,F(xiàn)在讓我們看看利用覆蓋索引的查詢效果如何:
這次我們之間查詢最后一頁的數(shù)據(jù)(利用覆蓋索引,只包含id列),如下:
select id from product limit 866613, 20 0.2秒
相對于查詢了所有列的37.44秒,提升了大概100多倍的速度
那么如果我們也要查詢所有列,有兩種方法,一種是id>=的形式,另一種就是利用join,看下實際情況:
SELECT * FROM product WHERE ID > =(select id from product limit 866613, 1) limit 20
查詢時間為0.2秒,簡直是一個質(zhì)的飛躍啊,哈哈
另一種寫法
SELECT * FROM product a JOIN (select id from product limit 866613, 20) b ON a.ID = b.id
查詢時間也很短,贊!
其實兩者用的都是一個原理嘛,所以效果也差不多
- 一步步教你利用Mysql存儲過程造百萬級數(shù)據(jù)
- MySQL數(shù)據(jù)庫10秒內(nèi)插入百萬條數(shù)據(jù)的實現(xiàn)
- MySQL 百萬級數(shù)據(jù)的4種查詢優(yōu)化方式
- MySQL百萬級數(shù)據(jù)量分頁查詢方法及其優(yōu)化建議
- MySQL百萬級數(shù)據(jù)分頁查詢優(yōu)化方案
- java中JDBC實現(xiàn)往MySQL插入百萬級數(shù)據(jù)的實例代碼
- MySQL使用MyFlash快速恢復(fù)誤刪除和修改的數(shù)據(jù)
- MySQL數(shù)據(jù)庫刪除數(shù)據(jù)后自增ID不連續(xù)的問題及解決
- MySQL BinLog如何恢復(fù)誤更新刪除數(shù)據(jù)
- 使用 SQL 快速刪除數(shù)百萬行數(shù)據(jù)的實踐記錄
相關(guān)文章
解決Mysql建表時報錯invalid?ON?UPDATE?clause?for?'create_d
這篇文章主要介紹了解決Mysql建表時報錯invalid?ON?UPDATE?clause?for?'create_date'?column問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2023-12-12
Mysql錯誤Cannot find or open table x/x from the internal問題解決方法
這篇文章主要介紹了Mysql錯誤Cannot find or open table x/x from the internal問題解決方法,需要的朋友可以參考下2014-06-06
淺談Mysql時間的存儲?datetime還是時間戳timestamp
本文主要介紹了淺談Mysql時間的存儲?datetime還是時間戳timestamp,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
MySQL性能優(yōu)化之max_connections配置參數(shù)淺析
這篇文章主要介紹了MySQL性能優(yōu)化之max_connections配置參數(shù)淺析,本文著重講解了3種配置max_connections參數(shù)的方法,需要的朋友可以參考下2014-07-07
MySQL日期函數(shù)與日期轉(zhuǎn)換格式化函數(shù)大全
Mysql作為一款開元的免費關(guān)系型數(shù)據(jù)庫,用戶基礎(chǔ)非常龐大,本文列出了MYSQL常用日期函數(shù)與日期轉(zhuǎn)換格式化函數(shù)2018-03-03
mysql報錯:MySQL server version for the right syntax to use nea
這篇文章主要介紹了mysql報錯:MySQL server version for the right syntax to use near type=InnoDB的解決方法,涉及MySQL語句的使用技巧,需要的朋友可以參考下2016-01-01

