我正在尝试构建的系统的性能,但它确实很慢,我不知道为什么或应该这么慢。我正在测试的是我可以对数据库执行多少次单个INSERT,并且每秒可以达到22个左右。这听起来真的很慢,并且当我尝试用一​​个大型的SQL查询进行插入时,我可以在大约0.5秒内插入30000条记录。在现实生活中,插入是由系统中的不同用户完成的,因此连接,发送查询,解析查询等开销总是存在的。到目前为止我尝试过的是:


mysqli用尽可能少的代码。 =每秒22次插入
PDO代码越少越好。 =每秒22次插入
将连接主机从localhost更改为127.0.0.1 =每秒22 INSERT
没有语句对象的mysqli并检查SQL注入= 22 INSERT每秒


因此,这里有些错误。

系统规格:


英特尔i5
16 gig ram
7200 rpm磁盘驱动器


软件:


Windows 10
XAMPP,对于MariaDB来说还很新
数据库引擎innoDB。


我用来进行测试的代码:

$amountToInsert = 1000;
//$fakeData is an array with randomly generated emails
$fakeData = getFakeData($amountToInsert);
$db = new DatabaseHandler();
for ($i = 0; $i < $amountToInsert; $i++) {
    $db->insertUser($fakeUsers[$i]);
}
$db->closeConnection();


调用数据库的类:

class DatabaseHandler {
    private $DBHOST = 'localhost';
    private $DBUSERNAME = 'username';
    private $DBPASSWORD = 'password';
    private $DBNAME = 'dbname';
    private $DBPORT = 3306;

    private $mDb;

    private $isConnected = false;

    public function __construct() {
        $this->mDb = new mysqli($this->DBHOST, $this->DBUSERNAME
                              , $this->DBPASSWORD, $this->DBNAME
                              , $this->DBPORT);
        $this->isConnected = true;
    }

    public function closeConnection() {
        if ($this->isConnected) {
            $threadId = $this->mDb->thread_id;
            $this->mDb->kill($threadId);
            $this->mDb->close();
            $this->isConnected = false;
        }
    }

    public function insertUser($user) {
        $this->mDb->autocommit(true);
        $queryString = 'INSERT INTO `users`(`email`, `company_id`) '
                        .'VALUES (?, 1)';
        $stmt = $this->mDb->prepare($queryString);
        $stmt->bind_param('s', $user);
        if ($stmt->execute()) {
            $stmt->close();
            return 1;
        } else {
            $stmt->close();
            return 0;
        }
    }
}


“用户”表具有4列,其结构如下:


id INT无符号主键
电邮VARCHAR(60)
company_id INT无符号INDEX
引导文本


我在这里茫然,不知道下一步去哪里。在正确方向上的任何帮助将不胜感激。

最佳答案

就像评论中解释的那样,应该归咎于InnoDB。默认情况下,此引擎过于谨慎,并且在返回成功消息之前不会使用磁盘高速缓存来确保数据确实已写入磁盘。因此,您基本上有两个选择。


大多数时候,您只是不在乎已确认的写入。因此,您可以通过将此mysql选项设置为零来配置mysql:

innodb_flush_log_at_trx_commit = 0


只要以此方式设置,您的InnoDB写入速度将几乎与MyISAM一样快。
另一种选择是将所有写操作包装在一个事务中。由于仅需要所有写入的一次确认,因此速度也将是合理的。


当然,只有多次插入才准备一次查询是理智的,但是与上面的问题相比,速度的增长是微不足道的。因此,它既不作为解释也不作为对此类问题的补救措施。

关于php - 性能缓慢的MySql,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42145734/

10-15 21:11