2017-04-11 38 views
1

我有一個關於Mysql查詢的問題。限制查詢無法生效

我有一些緩慢的查詢。以下是其中之一:

SELECT 
    xxx_accounts.id 
    , xxx_accounts.name 
    , xxx_accounts.account_name 
    , xxx_accounts.address_postalcode 
    , xxx_accounts.address_city 
    , xxx_accounts.address_state 
    , xxx_accounts.date_modified 
    , xxx_accounts.assigned_user_id 
FROM 
    xxx_accounts 
WHERE 
    xxx_accounts.deleted = 0 
ORDER BY 
    xxx_accounts.date_entered DESC 
LIMIT 4434950, 11; 

即使使用限制查詢,也需要將近2分鐘。

解釋是在這裏:

+----+-------------+--------------+------+--------------------------------------------------------------------------------+-------------------------+---------+-------+---------+-------------+      
| id | select_type | table  | type | possible_keys                 | key      | key_len | ref | rows | Extra  | 
+----+-------------+--------------+------+--------------------------------------------------------------------------------+-------------------------+---------+-------+---------+-------------+ 
| 1 | SIMPLE  | xxx_accounts | ref | idx_deleted_datemodified,idx_deleted_addresspostalcode,idx_deleted_dateentered | idx_deleted_dateentered | 2  | const | 1861322 | Using where | 
+----+-------------+--------------+------+--------------------------------------------------------------------------------+-------------------------+---------+-------+---------+-------------+ 

解釋這表示,行是總數。

但是,這個SQL更改限制「」查詢,限制1,11「」,它需要幾秒鐘(如1或2秒)。

這些SQL的不同之處在於LIMIT 4434950,11和​​之間。

這個問題可以解決嗎?

+0

你怎麼知道,當按日期排序你不感興趣的第一4434950行? – Strawberry

+0

對不起。我無法理解你的問題。請解釋更多細節。 –

回答

2

瞭解兩個極限之間的區別:

"LIMIT 1,11":意味着你只取1,從11偏移開始記錄。

"LIMIT 4434950,11":表示您從11偏移量開始獲取4434950個記錄。在這個查詢表中掃描數千行以獲得4434950條記錄,然後停止,肯定會花費更多的時間和資源,因爲結果集也需要很多行。

由於查詢需要計數第一個OFFSET + LIMIT記錄(並且只取其中的極限),因此較高的偏移減慢查詢速度是正常的。該值越高,查詢運行的時間越長。

查詢不能進入OFFSET,因爲首先,記錄的長度可能不同,其次,可能與已刪除的記錄有間隔。它需要檢查並統計每條記錄。

一些技巧,使這個查詢速度快:

MySQL不能直接到第10000記錄(或爲你的暗示第八萬字節),因爲它不能假設它的包裝/有序那樣(或者說,它在1到10000之間具有連續的值)。儘管實際上可能是這樣,但MySQL不能認爲沒有漏洞/間隙/已刪除的ID。

所以,

SELECT * FROM large ORDER BY id LIMIT 10000, 30 

將是緩慢(ER),

SELECT * FROM large WHERE id > 10000 ORDER BY id LIMIT 30 

會快(ER),並且將返回相同的結果,只要沒有丟失IDS(即空白)。

Very good explanation here

+0

謝謝,我明白了。 –

+0

這意味着,大約還有1分鐘是不可避免的嗎? –

+1

通過查詢優化的一些手段是可能的。檢查此鏈接:http://stackoverflow.com/questions/4481388/why-does-mysql-higher-limit-offset-slow-the-query-down –