MySQL效能優化 利用limit分頁

2021-09-02 16:02:47 字數 1433 閱讀 3022

部落格已轉至:[url]

mysql 資料庫的limit支援如下形式的選擇:  limit n,m

表示從第n條記錄開始選擇m條記錄。而大多數開發人員喜歡使用這類語句來解決web中經典的分頁問題。對於小規模的資料,這並不會有太大的問題。對於論壇這類可能具有非常大規模資料的應用來說,limit n,m 的效率是十分低的。因為每次都需要對資料進行選取。如果只是選取前5條記錄,則非常輕鬆和容易;但是對100萬條記錄,選取從80萬行記錄開始的5條記錄,則還需要掃瞄記錄到這個位置。—《mysql技術內幕》

[i][b]從上文可知,limit 10000,20意味著掃瞄滿足條件的10020行,扔掉前面的10000行,返回最後的20行;問題就在這裡,如果是limit 100000,100,需要掃瞄100100行,在乙個高併發的應用裡,每次查詢需要掃瞄超過10w行,效能肯定大打折扣。 [/b][/i]

測試: 表t_test_data 存130萬條資料

1. select * from t_test_data limit 0,10

[img]

2. select * from t_test_data limit 100000,10

[img]

3. select * from t_test_data limit 1000000,10

[img]

上述測試資料可見,10萬條資料耗時約2.8秒,而百萬條資料耗時達到18秒!

explain select * from t_test_data limit 1000000,10 type 值為all 全表掃瞄,影響效能。

如何優化???

[i][b]優化的關鍵是要做到讓mysql每次只掃瞄10條記錄,我們可以使用limit n,這樣效能就沒有問題,因為mysql只掃瞄n行。我們可以通過子查詢先獲取起始記錄的id,然後利用 select * from t_test_data where id > x limit 10 來實現。[/b][/i]

step1 : 獲取起始id,假設起始記錄是1000000

select id from t_test_data limit 1000000, 1

[img]

耗時近27秒! 給id加索引之後,再測試,耗時02~0.3秒【ps:100多萬資料,建立index耗時約37秒】

step2 : limit 查詢

select * from t_test_data where id >= (select id from t_test_data limit 1000000, 1) limit 10

[img]

參考:

mysql效能優化 mysql效能優化

優化方式 1.空間換時間 冗餘 2.時間換空間 字段優先使用型別 int date char varchar text 索引型別 btree索引 hash索引 索引的葉子下,存放乙個資訊指向所在行的資料位址。btree有利於範圍查詢,hash有利於精確查詢。btree用的更多一些。btree索引的常...

mysql的效能優化 mysql效能優化

檢視安裝指令碼 select version 非互動式超時時間,如jdbc show global variables like wait timeout 互動式超時時間,如資料庫工具 show global variables like interactive timeout show sessi...

mysql 效能優化 命令 mysql效能優化

發現問題 當發現程式執行比較慢的時候,首先排除物力資源問題之後,就將注意力轉向mysq資料庫 1 首先確定執行慢的sql語句 mysql show full processlist 2 確認低效的查詢 多次執行第一步發現time耗費大的sql語句。檢視耗費的時間。3 分析效能 為sql生成乙個執行計...