【问题标题】:Very slow mysql table非常慢的mysql表
【发布时间】: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;维修表usersEXPLAIN 在查询前面可以显示一些有用的东西
  • 表总是只有80行吗?如果删除很多,删除并重新创建索引会有所帮助

标签: php mysql performance


【解决方案1】:

您可以检查两件事,如果您正在从客户端计算机运行查询,请检查您到服务器的网络速度。如果查询在服务器上运行缓慢,您可以查看 Mysql 服务器上的慢查询日志。其次,您尝试在表上重新创建索引。尝试在 MySql 上检查表、修复表命令。

【讨论】:

    猜你喜欢
    • 2010-10-24
    • 2021-05-29
    • 2014-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-20
    • 2015-07-12
    • 1970-01-01
    相关资源
    最近更新 更多