【发布时间】:2014-04-15 11:08:15
【问题描述】:
我有一个非常简单的 MySQL 表,运行速度非常慢,我不知道为什么。
结构是:
id int(11) (Primary Key)
username varchar(64) (Index)
password varchar(64)
pws varchar(16)
default_password varchar(32)
session_id varchar(64)
license_number int(10) (Index)
contact_name varchar(64)
phone varchar(16)
first_login_date datetime
last_login_date datetime
status tinyint(4)
test_mode tinyint(4)
email varchar(64)
email_verified tinyint(4)
表中只有 80 行,但以下查询耗时 67 秒!!
SELECT * FROM `users` ORDER BY `username` ASC
该表上的几乎所有操作都非常缓慢。我做错了什么,或者我应该从哪里开始挖掘?
另一方面,我有另一个更复杂的表,有 20,000 行,运行速度非常快。
**UPDATE...修复数据库和优化有助于选择。似乎更新非常慢,然后减慢选择速度......
$this->db->update( "UPDATE users SET session_id='' WHERE id=:userid", array( ":userid" => $this->getUserId() ) );
这是我正在使用的 PHP 数据库代码:
class Database extends PDO
{
public function __construct($DB_TYPE, $DB_HOST, $DB_NAME, $DB_USER, $DB_PASS)
{
$this->handleDB = new PDO($DB_TYPE.':host='.$DB_HOST.';dbname='.$DB_NAME, $DB_USER, $DB_PASS);
$this->handleDB->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
public function update($sql, $array = array())
{
$sth = $this->handleDB->prepare($sql);
foreach ($array as $key => $value) {
if(is_int($value)){
$sth->bindValue("$key", $value, PDO::PARAM_INT);
}else{
$sth->bindValue("$key", $value, PDO::PARAM_STR);
}
}
$sth->execute();
return $sth->rowCount();
}
}
}
谢谢!
【问题讨论】:
-
尝试运行
check table users;以查看表是否存在任何问题。 dev.mysql.com/doc/refman/5.0/en/check-table.html -
我猜有另一个进程锁定了该表,您的手动查询可能正在等待轮到他们。这是在什么样的应用程序中?
-
以上和或分析表
users;维修表users。EXPLAIN在查询前面可以显示一些有用的东西 -
还有
optimize table users;。 dev.mysql.com/doc/refman/5.1/en/optimize-table.html -
表总是只有80行吗?如果删除很多,删除并重新创建索引会有所帮助
标签: php mysql performance