當前位置:編程學習大全網 - 遊戲軟體 - 如何提高MySQL Limit查詢的性能

如何提高MySQL Limit查詢的性能

如何提高MySQL Limit查詢的性能?

在MySQL數據庫操作中,我們在做壹些查詢的時候總希望能避免數據庫引擎做全表掃描,因為全表掃描時間長,而且其中大部分掃描對客戶端而言是沒有意義的。其實我們可以使用Limit關鍵字來避免全表掃描的情況,從而提高效率。

有個幾千萬條記錄的表 on MySQL 5.0.x,現在要讀出其中幾十萬萬條左右的記錄。常用方法,依次循環:

select * from mytable where index_col = xxx limit offset, limit;

經驗:如果沒有blob/text字段,單行記錄比較小,可以把 limit 設大點,會加快速度。

問題:頭幾萬條讀取很快,但是速度呈線性下降,同時 mysql server cpu 99% ,速度不可接受。

調用 explain select * from mytable where index_col = xxx limit offset, limit;

顯示 type = ALL

在 MySQL optimization 的文檔寫到"All"的解釋

A full table scan is done for each combination of rows from the previous tables. This is normally not good if the table is the first table not marked const, and usually very bad in all other cases. Normally, you can avoid ALL by adding indexes that allow row retrieval from the table based on constant values or column values from earlier tables.

看樣子對於 all, mysql 就使用比較笨的方法,那就改用 range 方式? 因為 id 是遞增的,也很好修改 sql 。

select * from mytable where id > offset and id < offset + limit and index_col = xxx

explain 顯示 type = range,結果速度非常理想,返回結果快了幾十倍。

Limit語法:

SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset

LIMIT子句可以被用於強制 SELECT 語句返回指定的記錄數。LIMIT接受壹個或兩個數字參數。參數必須是壹個整數常量。

如果給定兩個參數,第壹個參數指定第壹個返回記錄行的偏移量,第二個參數指定返回記錄行的最大數目。初始記錄行的偏移量是 0(而不是 1)。

為了與 PostgreSQL 兼容,MySQL 也支持句法:LIMIT # OFFSET #。

mysql> SELECT * FROM table LIMIT 5,10; //檢索記錄行6-15

//為了檢索從某壹個偏移量到記錄集的結束所有的記錄行,可以指定第二個參數為-1

mysql> SELECT * FROM table LIMIT 95,-1; //檢索記錄行96-last

//如果只給定壹個參數,它表示返回最大的記錄行數目,換句話說,LIMIT n 等價於 LIMIT 0,n

mysql> SELECT * FROM table LIMIT 5; //檢索前5個記錄行

MySQL的limit給分頁帶來了極大的方便,但數據量壹大的時候,limit的性能就急劇下降。同樣是取10條數據,下面兩句就不是壹個數量級別的。

select * from table limit 10000,10

select * from table limit 0,10

文中不是直接使用limit,而是首先獲取到offset的id然後直接使用limit size來獲取數據。根據他的數據,明顯要好於直接使用limit。

這裏我具體使用數據分兩種情況進行測試。

1、offset比較小的時候:

select * from table limit 10,10

//多次運行,時間保持在0.0004-0.0005之間

Select * From table Where vid >=(Select vid From table Order By vid limit 10,1) limit 10

//多次運行,時間保持在0.0005-0.0006之間,主要是0.0006

結論:偏移offset較小的時候,直接使用limit較優。這個顯然是子查詢的原因。

2、offset大的時候:

select * from table limit 10000,10

//多次運行,時間保持在0.0187左右

Select * From table Where vid >=(Select vid From table Order By vid limit 10000,1) limit 10

//多次運行,時間保持在0.0061左右,只有前者的1/3。可以預計offset越大,後者越優。

  • 上一篇:十大網絡小說 十大網絡小說有哪些
  • 下一篇:經紀人問張小斐是不是胖了,對此張小斐是如何回應的?
  • copyright 2024編程學習大全網