簡體   English   中英

如何提高簡單的mysql查詢速度

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM