Mysql慢插入

时间:2011-01-29 16:15:50

标签: sql mysql performance insert

我有以下InnoDB表:

+-----------+-----------+------+-----+-------------------+----------------+
| Field     | Type      | Null | Key | Default           | Extra          |
+-----------+-----------+------+-----+-------------------+----------------+
| id        | int(11)   | NO   | PRI | NULL              | auto_increment |
| doc_id    | char(32)  | NO   |     | NULL              |                |
| staff     | char(18)  | NO   |     | NULL              |                |
| timestamp | timestamp | NO   | MUL | CURRENT_TIMESTAMP |                |
+-----------+-----------+------+-----+-------------------+----------------+

使用这些键:

+--------------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table        | Non_unique | Key_name        | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+--------------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| staff_online |          0 | PRIMARY         |            1 | id          | A         |      277350 |     NULL | NULL   |      | BTREE      |         |
| staff_online |          1 | timestamp       |            1 | timestamp   | A         |      277350 |     NULL | NULL   |      | BTREE      |         |
| staff_online |          1 | staff_timestamp |            1 | timestamp   | A         |      277350 |     NULL | NULL   |      | BTREE      |         |
| staff_online |          1 | staff_timestamp |            2 | staff       | A         |      277350 |     NULL | NULL   |      | BTREE      |         |
+--------------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+

我刚注意到in mysql-slow.log我有时在这个表上有一个INSERT查询,这需要1秒多的时间

INSERT INTO `staff_online` (`doc_id`, `staff`, `timestamp`) VALUES ('150b60a0ab8c5888bdbbb80bd8b7f8a2', 'asia', '2011-01-29 16:52:54')

我真的很困惑为什么需要这么长时间。我怎样才能加快速度?

BTW:每天都有大约80个缓慢的INSERTS和40个缓慢的更新。

6 个答案:

答案 0 :(得分:12)

  

有277259行,只有一些插入缓慢(罕见)

每当B-Tree页面已满时,需要拆分,这需要一些时间。由于每个插入更新所有索引,因此插入性能在您拥有的索引越多时也越慢。 9000已经正确地说明了您的(时间戳,员工)索引涵盖了95%的情况下的(时间戳)索引,在极少数情况下需要单列(时间戳)索引才能获得更好的性能。

还有一些定期的后台任务,偶尔可以在一天内减慢一两个插件。

此外,延迟的另一个原因是数据库活动。如果您具有锁定页面的事务,插件需要更新(或页面拆分),则插入必须等到默认写入锁定。这些其他活动甚至不需要实际启动事务,它们甚至不必是读 - 读的争用;你也可能有写 - 写争用或由重度活动构建的队列。

最后一个可能的原因 - 您的数据库服务器资源不足,无论是内存还是CPU或网络i / o。服务器只能做很多事情,所以它必须等到它有足够的资源。

答案 1 :(得分:10)

有时候查询本身并不会导致速度减慢 - 对表进行操作的另一个查询很容易导致插入因事务隔离和锁定而变慢。您的慢查询可能只是在等待另一个事务完成。这在繁忙的表上很常见,或者如果您的服务器正在执行长/复杂的事务。

另一个重要因素将是数据库的整体性能:您的my.cnf文件的调整方式,服务器本身的调整方式,服务器上运行的其他内容,当然还有服务器的硬件正在运行。

linux工具mytop和查询SHOW ENGINE INNODB STATUS\G可以帮助您查看可能的问题点。一般的Linux性能工具还可以显示磁盘的繁忙程度等。

鉴于此表的性质,您是否考虑过另一种方法来跟踪谁在线?在MySQL中,我过去曾使用MEMORY表用于此类目的。 NoSQL数据存储也可能适用于此类信息。 Redis可以将其存储为排序集,并取得很大成功(得分==时间戳)。

进一步阅读:

答案 2 :(得分:4)

如果您在大型密集阵阵中插入桌子,可能需要一些时间进行内务管理,例如:为表和索引分配更多空间。

如果您不希望自己的应用等待,请尝试使用INSERT DELAYED,但确实有其缺点。

答案 3 :(得分:1)

如果您在群集环境中运行,则自动增加列可能会降低插入速度。尝试调整ndb_autoincrement_prefetch_sz(参见http://dev.mysql.com/doc/refman/5.1/en/mysql-cluster-system-variables.html#sysvar_ndb_autoincrement_prefetch_sz

答案 4 :(得分:1)

如果您碰巧在MySQL安装上处于后台,我们在使用4.1版时发现了很多这种缓慢的情况。

答案 5 :(得分:-3)

根据我的经验,InnoDB的性能低于MyISAM 您是否尝试使用MyISAM? 或者您可能需要调整InnoDB配置: http://dev.mysql.com/doc/refman/5.0/en/innodb-configuration.html
希望有所帮助。