2013-04-09 81 views
1

我有一個簡單的用戶表:MYSQL:使更新查詢更快?

userID | credits | name | etc | etc1 | etc2 

我做一個簡單的查詢:

UPDATE users set credits = (credits - 10) where userid = 9 

此表有2000行。爲什麼這個查詢需要0.16秒,我怎樣才能讓它更快?

userid是主鍵,因此已經有一個索引。所以我想不出爲什麼這個查詢可能會很慢。特別是看到它是隻有在16GB RAM和殺手級處理器的服務器上執行的唯一查詢。事實上,服務器上沒有其他任何東西可以佔用任何資源。

任何想法?

編輯

這是我的計時:

private function slowQueryEvaluator($startTime, $endTime, $identifier) { 

    $MAX_TIME = 0.1; 

    $IP = Controller::getRealIpAddress(); 
    $userID = -1; 
    if (isset(YII::app()->user->id)) { 
     $userID = YII::app()->user->id; 
    } 
    $seconds = $endTime - $startTime; 
    if ($seconds > $MAX_TIME) { 
     YII::log($IP.' - '.$userID.' - '.$seconds.' seconds - '.$identifier); 
    } 

    } 

學分是INT。

這裏是用戶表的創建導出:

CREATE TABLE IF NOT EXISTS `users` (
    `userid` int(11) NOT NULL AUTO_INCREMENT, 
    `cell_nr` varchar(12) NOT NULL, 
    `status` varchar(20) NOT NULL DEFAULT 'INACTIVE', 
    `full_name` varchar(255) NOT NULL, 
    `public_name` varchar(20) NOT NULL, 
    `credits` int(11) NOT NULL DEFAULT '0', 
    `national_id` varchar(20) NOT NULL, 
    `email_address` varchar(255) NOT NULL, 
    `OTP` int(5) NOT NULL, 
    `OTP_count` int(11) NOT NULL DEFAULT '0', 
    `password` char(32) NOT NULL, 
    `created` int(11) NOT NULL, 
    PRIMARY KEY (`userid`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ; 
+0

什麼數據類型是「credits」? – Barmar 2013-04-09 21:40:03

+1

沒有辦法需要那麼久。您是否直接從控制檯計時命令? – panupan 2013-04-09 21:41:26

+1

報告您的表格的引擎並創建語句。或者聯繫你最喜歡的算命先生。 – 2013-04-09 21:41:29

回答

0

數據庫引擎提供表鎖或行級鎖這可能會改變速度和創建存儲過程,也許更快,我沒有隻傳遞參數嘗試另一方面,你可以嘗試批量crud.for例如20 sql執行是一個commit.and你可能會嘗試添加另一個字符串索引旁邊你的存在