我有一个简单的用户表:
userID | credits | name | etc | etc1 | etc2
我做了一个简单的查询:
UPDATE users set credits = (credits - 10) where userid = 9
此表有2000行。为什么这个查询需要0.16秒,如何让它更快?
userid是主键,因此已经有一个索引。所以我想不出为什么这个查询可能会很慢。特别是在具有16GB RAM和杀手级处理器的服务器上看到它是ONLY查询正在执行的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 ;
答案 0 :(得分:0)
您的数据库引擎提供表锁定或行级锁定这可能会改变速度并创建存储过程并且只传递参数可能更快我没有尝试另一方面您可以尝试批处理crud.for示例20 sql执行是一次提交。并且您可以尝试在现有的
旁边添加另一个字符串索引