sql - Mysql慢速插入

标签 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      |         |
+--------------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+

我刚刚注意到 在 mysql-slow.log 中,我有时会对该表进行 INSERT 查询,这需要超过 1 秒

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

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

顺便说一句:每天大约有 80 次像这样的缓慢插入和 40 次缓慢更新。

最佳答案

There are 277259 rows and only some inserts are slow (rare)

每当 B-Tree 页面已满时,就需要对其进行拆分,这需要一些时间。索引越多,插入性能也会越慢,因为每次插入都会更新所有索引。 9000 已经正确声明您的 (timestamp,staff) 索引在 95% 的情况下涵盖 (timestamp) 索引,在极少数情况下需要单列 (timestamp) 索引更好的性能。

还有一些周期性的后台任务有时会在一天中减慢一两次插入速度。

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

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

关于sql - Mysql慢速插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4837903/

相关文章:

php - 如何一次更改所有学生的年级

java - 除了互斥锁或垃圾收集之外还有哪些机制可以减慢我的多线程 Java 程序的速度?

wpf - WPF是否可以在没有DirectX的情况下运行?

sql - 子查询返回多个值,但我使用 "IN"作为我的运算符

sql - 从 case when 语句返回多行作为逗号分隔值

python - 排除自引用关系 SQLAlchemy 中的软删除项

linux - 为什么这个 "hello world"golang http 示例在 osx 上变慢

sql - 在 Postgres Psycopg2 SQL 查询中输入未指定数量的变量

mysql - 子查询算作一个查询吗?

mysql - 另一个数据库中的 Django 外键