[英]How can I improve my simple mysql query speed
我有一個非常簡單的查詢,並不斷出現在我的慢查詢日志中。 當它出現時,通常會說查詢大約需要3到6秒。 這是查詢:
UPDATE company_users
SET isonline=1, last_logon='2011-12-05 19:37:11', last_message=-1,
last_signal=-1, location=-1
WHERE userid='3546600442XXXXX';
我必須使用userid比較,因為這是我在更新時所擁有的信息。
數據庫結構為:
Field Type Null Key Default Extra
id int(11) NO PRI \N auto_increment
userid varchar(20) NO MUL
version varchar(3) YES 37
owneruserid int(11) NO MUL 0
simcard_phonenumber varchar(20) YES \N
registration_date date YES \N
labelname varchar(20) YES \N
isonline smallint(6) YES 0
last_logon datetime YES \N
last_message int(11) YES 0
last_voltage int(11) YES 0
last_reboot datetime YES \N
connect_mode int(11) YES 1
scheduleid int(11) YES MUL -1
location int(11) YES MUL -1
img varchar(50) YES
我有以下索引:
company_users 0主用戶1 id A 197 \\ N \\ N BTREE
company_users 1 indx_userid 1用戶ID A 197 \\ N \\ N BTREE
company_users 1 indx_location 1位置A 12 \\ N \\ N是BTREE
company_users 1 indx_scheduleid 1 scheduleid A 49 \\ N \\ N是BTREE
company_users 1 indx_owneruserid 1 owneruserid A 197 \\ N \\ N BTREE
該表中約有300行。 該數據庫與我的網站位於同一服務器上。 這些查詢使用PHP腳本運行。
希望這是足夠的信息,以使我了解我可能做錯了什么,或者可以在哪里調整我的配置。
更新:根據丹尼斯的建議,我再次查看了緩慢的查詢日志,並注意到在一個時間范圍內記錄了三個語句。 這是其中兩個的信息,它們與上面確定的更新語句類型相同:
查詢時間:5鎖定時間:0發送的行數:0已檢查的行數:0
查詢時間:5鎖定時間:0發送的行數:0已檢查的行數:0
查詢時間:4鎖定時間:0發送的行數:1已檢查的行數:1
最后一個是在同一張桌子上選擇的。 我對select語句進行了分析(因為我不知道如何在Update上執行該操作),結果顯示:
id select_type表的類型possible_keys鍵key_len ref行Extra1 SIMPLE company_users const indx_imei indx_imei 22 const 1
擁有大量索引可以加快選擇語句的速度,但會減慢插入,更新和刪除的速度。 我的第一個建議是刪除索引並重新執行查詢,以查看時間是否有所改善。
我建議問題問題(在300條記錄的平面表上更新一條記錄)與索引無關。 聽起來您的插入語句正在被另一個語句阻塞。 是總是慢速還是僅在某些條件下慢速,這將進一步使阻塞似乎是可能的候選者。 您確實需要更多信息。 我將調查該表上可能存在的阻塞選擇,以查看它們是否是罪魁禍首,並在查看諸如事務隔離級別和自動提交配置之類的東西之前,先查看這些查詢是否可以優化。
如果問題是選擇查詢鎖定,則可以通過運行選擇查詢而不鎖定來驗證(並可能解決您的問題)。 這可以通過
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED ;
SELECT * FROM TABLE_NAME ; -- Place your select query here
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ ;
但是,此方法具有一些與之相關的健康警告。 更好的做法是獲取更多有關錯誤的信息,並通過使查詢盡可能接近最佳而不是使用這種方法來解決問題。
我記得這個Coding Horror博客具有一些有用的見解。
我同意AlexC的說法,很可能是另一條語句阻止了您的UPDATE語句。 如果要確保未阻止UPDATE,則可以使用兩個數據庫。 在主數據庫上,執行UPDATES和INSERTS,第二個是從第一個復制的,它是所有SELECTING發生的地方。
另外,您當然可以弄清楚哪些語句實際上阻止了您的查詢,然后嘗試對其進行優化。 在大量選擇的數據庫上,這可能不容易實現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.