2

私は単純なユーザーテーブルを持っています:

userID | credits | name | etc | etc1 | etc2

簡単なクエリを実行します。

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

このテーブルには 2000 行あります。このクエリに 0.16 秒かかるのはなぜですか? どうすれば高速化できますか?

userid は主キーであるため、すでにインデックスがあります。したがって、なぜこのクエリが遅くなる可能性があるのか​​ 考えられません。特に、16 GB の 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です。

次に、users テーブルの作成のエクスポートを示します。

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

データベースエンジンはテーブルロックまたは行レベルロックを提供しますこれにより速度が変化し、ストアドプロシージャの作成とパラメーターのみの受け渡しがおそらく速くなる可能性があります。既存の横に別の文字列インデックスを追加してみてください

于 2013-04-09T21:50:08.343 に答える