2013-04-09 86 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你可能会尝试添加另一个字符串索引旁边你的存在