響應慢也有可能是SQL惹的禍:Limit可能會惹禍上身
MySQL中的Limit
相信很多人都知道limit,無論是RD還是TEST,為了後續比較容易描述,我們先介紹一下limit。
很多需求在開發的時候都有返回前幾條記錄或者返回中間某幾行記錄的需求,在MYSQL資料庫中很多人都會使用Limit來完成。
SELECT*FROM tableLIMIT[offset,]rows
Limit可以顯示select的返回結果,有上面的語法結構我們可以看出,limit可以接受一個引數或者兩個引數。其中要求offset、rows都必須是整數常量,其中第一個引數offset所指的是第一個返回記錄的相對於初試記錄行的偏移量,初試記錄行號是0;第二個引數rows是返回記錄的最大數量。
SELECT * FROM TABLE LIMIT 10,10; //這表示返回記錄11-30之間的記錄 SELECT * FROM TABLE LIMIT 2; //這表示返回前兩條記錄 SELECT * FROM 10,-1; //這表示返回11行到記錄最後的資料
Limit的常規使用和可能的效能問題
在很多分頁的功能實現過程中,Limit比較的被使用的。例如如下SQL語句:
SELECT*FROM user WHERE sex='male' and age>20ORDER BY id Limit 2000,10
為了能夠加快查詢速度,我們會在name,sex和id上加上組合索引。在小資料規模的時候,這種查詢效率沒有任何影響,但是隨著資料規模的逐漸增大,就算加上了組合索引也會嚴重影響效能。
這是因為Limit 2000是從第一行記錄開始數到第2000,然後開始返回第2001條資料及其後的記錄,因此為了避免這類問題出現,將上述的SQL作如下修改:
SELECT*FROM user WHERE sex='male' and age>20 and id>2000ORDER BY id Limit 10
這樣就會完美的避免上述問題,但是還是建議組合索引還是有必要建立的。