Mysql慢插入

kal*_*kin 12 mysql sql 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 |                |
+-----------+-----------+------+-----+-------------------+----------------+
Run Code Online (Sandbox Code Playgroud)

使用这些键:

+--------------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| 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      |         |
+--------------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
Run Code Online (Sandbox Code Playgroud)

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

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

我真的很困惑为什么需要这么久.我怎样才能加快速度?

顺便说一句:每天都有大约80个缓慢的INSERTS和40个缓慢的更新.

Ric*_*iwi 12

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

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

还有一些定期的后台任务,有时可能会在一天内减慢一两个插件的速度.

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

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


wup*_*tah 10

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

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

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

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

进一步阅读:


900*_*000 5

如果您以大量密集的突发方式插入表,则可能需要一些时间进行内务处理,例如为表和索引分配更多空间。

如果不希望您的应用程序等待,请尝试使用INSERT DELAYED它,尽管它确实有其缺点。

  • INSERT DELAYED 似乎是该问题的一个不错的解决方案,但它不适用于 InnoDB :( (4认同)