2

我有一个简单的用户表:

userID | credits | name | etc | etc1 | etc2

我做了一个简单的查询:

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

该表有 2000 行。为什么这个查询需要 0.16 秒,我怎样才能让它更快?

userid 是主键,因此上面已经有一个索引。所以我想不出为什么这个查询可能很慢。尤其是在具有 16GB RAM 和杀手级处理器的服务器上执行的唯一查询 ONCE。服务器上几乎没有其他东西可以占用任何资源。

有任何想法吗?

编辑

我是这样计时的:

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 ;
4

1 回答 1

0

您的数据库引擎提供表锁定或行级锁定这可能会改变速度并创建存储过程并仅传递参数可能更快我没有尝试另一方面您可以尝试批处理 crud。例如 20 次 sql 执行是一个提交。您可能尝试在您现有的旁边添加另一个字符串索引

于 2013-04-09T21:50:08.343 回答