Mysql百萬資料掃表優化

2021-10-10 19:16:17 字數 3379 閱讀 6170

1、直接使用資料庫提供的sql語句

語句樣式: mysql中,可用如下方法: select * from 表名稱 limit m,n

適應場景: 適用於資料量較少的情況(元組百/千級)

原因/缺點: 全表掃瞄,速度會很慢,且有的資料庫結果集返回不穩定(如某次返回1,2,3,另外的一次返回2,1,3),limit限制的是從結果集的m位置處取出n條輸出,其餘拋棄。

//是用limit函式

//取前5條資料

select * from table_name limit 0,5

//或者

select * from table_name limit 5

//查詢第11到第15條資料

select * from table_name limit 10,5

limit關鍵字的用法:limit [offset,] rows

offset指定要返回的第一行的偏移量,rows第二個指定返回行的最大數目。初始行的偏移量是0(不是1)

2、建立主鍵或唯一索引, 利用索引(假設每頁10條)

語句樣式:可用如下方法:select * from 表名稱 where id_pk > (pagenum*10) limit m

適應場景:適用於資料量多的情況(元組數上萬)

原因:索引掃瞄,速度會很快。有朋友提出:因為資料查詢出來並不是按照pk_id排序的,所以會有漏掉資料的情況,只能方法3

3、基於索引再排序

語句樣式:可用如下方法: select * from 表名稱 where id_pk > (pagenum*10) order by id_pk asc limit m

適應場景: 適用於資料量多的情況(元組數上萬),最好order by後的列物件是主鍵或唯一索引,使得order by操作能利用索引被消除但結果集是穩定的

原因:索引掃瞄,速度會很快。

4、基於索引使用prepare(第乙個問號表示pagenum,第二個?表示每頁元組數)

語句樣式:mysql中,可用如下方法: prepare stmt_name from select * from 表名稱 where id_pk > (?* ?) order by id_pk asc limit m

適應場景:大資料量

原因:索引掃瞄,速度會很快。prepare語句又比一般的查詢語句快一點。

5、利用mysql支援order操作可以利用索引快速定位部分元組,避免全表掃瞄

比如: 讀第1000到1019行元組(pk是主鍵/唯一鍵).

select * from your_table where pk>=1000 order by pk asc limit 0,20

6、利用"子查詢/連線+索引"快速定位元組的位置,然後再讀取元組。

道理同方法5。如(id是主鍵/唯一鍵,$page、$pagesize是變數):

利用子查詢示例:

select * from your_table where id <= 

(select id from your_table order by id desc limit ($page-1)*$pagesize order by id desc limit $pagesize

利用連線示例:

select * from your_table as t1 

join (select id from your_table order by id desc limit ($page-1)*$pagesize as t2 

where t1.id <= t2.id order by t1.id desc limit $pagesize;

mysql大資料量使用limit分頁,隨著頁碼的增大,查詢效率越低下。

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語句是很方便,但是對記錄很多的表並不適合直接使用。

利用表的覆蓋索引來加速分頁查詢:我們都知道,利用了索引查詢的語句中如果只包含了那個索引列(覆蓋索引),那麼這種情況會查詢很快。

在我們的例子中,我們知道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...