原文:
自己的乙個**,由於單錶的資料記錄高達了一百萬條,造成資料訪問很慢,google分析的後台經常報告超時,尤其是頁碼大的頁面更是慢的不行。
先讓我們熟悉下基本的sql語句,來檢視下我們將要測試表的基本資訊
use infomation_schema查詢結果:select * from tables where table_schema = 『dbname』 and table_name = 『product』
從上圖中我們可以看到表的基本資訊:
錶行數:866633
平均每行的資料長度:5133位元組
單錶大小:4448700632位元組
關於行和表大小的單位都是位元組,我們經過計算可以知道
平均行長度:大約5k
單錶總大小:4.1g
表中字段各種型別都有varchar、datetime、text等,id欄位為主鍵
1. 直接用limit start, count分頁語句, 也是我程式中用的方法:
select * from product limit start, count
當起始頁較小時,查詢沒有效能問題,我們分別看下從10, 100, 1000, 10000開始分頁的執行時間(每頁取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秒
我們已經看出隨著起始記錄的增加,時間也隨著增大, 這說明分頁語句limit跟起始頁碼是有很大關係的,那麼我們把起始記錄改為40w看下(也就是記錄的一般左右) select * from product limit 400000, 20 3.229秒
再看我們取最後一頁記錄的時間
select * from product limit 866613, 20 37.44秒
難怪搜尋引擎抓取我們頁面的時候經常會報超時,像這種分頁最大的頁碼頁顯然這種時
間是無法忍受的。
從中我們也能總結出兩件事情:
1)limit語句的查詢時間與起始記錄的位置成正比
2)mysql的limit語句是很方便,但是對記錄很多的表並不適合直接使用。
2. 對limit分頁問題的效能優化方法
利用表的覆蓋索引來加速分頁查詢
我們都知道,利用了索引查詢的語句中如果只包含了那個索引列(覆蓋索引),那麼這種情況會查詢很快。
因為利用索引查詢有優化演算法,且資料就在查詢索引上面,不用再去找相關的資料位址了,這樣節省了很多時間。另外mysql中也有相關的索引快取,在併發高的時候利用快取就效果更好了。
在我們的例子中,我們知道id欄位是主鍵,自然就包含了預設的主鍵索引。現在讓我們看看利用覆蓋索引的查詢效果如何:
這次我們之間查詢最後一頁的資料(利用覆蓋索引,只包含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秒,簡直是乙個質的飛躍啊,哈哈
另一種寫法
select * from product a join (select id from product limit 866613, 20) b on a.id = b.id
查詢時間也很短,贊!
其實兩者用的都是乙個原理嘛,所以效果也差不多
MySQL單錶百萬資料記錄分頁效能優化
自己的乙個 由於單錶的資料記錄高達了一百萬條,造成資料訪問很慢,google分析的後台經常報告超時,尤其是頁碼大的頁面更是慢的不行。先讓我們熟悉下基本的sql語句,來檢視下我們將要測試表的基本資訊 use infomation schema select from tables where tabl...
MySQL單錶百萬資料記錄分頁效能優化
先讓我們熟悉下基本的sql語句,來檢視下我們將要測試表的基本資訊 use infomation schema select from tables where table schema dbname and table name product 查詢結果 從上圖中我們可以看到表的基本資訊 錶行數 8...
MySQL單錶百萬資料記錄分頁效能優化
自己的乙個 由於單錶的資料記錄高達了一百萬條,造成資料訪問很慢,google分析的後台經常報告超時,尤其是頁碼大的頁面更是慢的不行。先讓我們熟悉下基本的sql語句,來檢視下我們將要測試表的基本資訊 use infomation schema select from tables where tabl...