首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mysql慢插入

Mysql慢插入
EN

Stack Overflow用户
提问于 2011-01-30 00:15:50
回答 6查看 15.8K关注 0票数 13

我有以下InnoDB表:

代码语言:javascript
复制
+-----------+-----------+------+-----+-------------------+----------------+
| 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 |                |
+-----------+-----------+------+-----+-------------------+----------------+

使用这些密钥:

代码语言:javascript
复制
+--------------+------------+-----------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| 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 I有时会在此表上执行一个INSERT查询,耗时超过1秒

代码语言:javascript
复制
INSERT INTO `staff_online` (`doc_id`, `staff`, `timestamp`) VALUES ('150b60a0ab8c5888bdbbb80bd8b7f8a2', 'asia', '2011-01-29 16:52:54')

我真的不明白为什么花了这么长时间。我怎么才能加快速度呢?

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

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-02-13 16:57:05

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

另一个重要因素是数据库的整体性能:my.cnf文件是如何调优的,服务器本身是如何调优的,服务器上还运行着什么,当然还有服务器正在运行什么硬件。

linux工具mytop和查询SHOW ENGINE INNODB STATUS\G对查看可能的故障点很有帮助。一般的linux性能工具也可以显示你的磁盘有多忙等等。

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

进一步阅读:

  • http://dev.mysql.com/doc/refman/5.1/en/innodb-tuning.html
  • http://dev.mysql.com/doc/refman/5.1/en/memory-storage-engine.html
  • http://redis.io/commands#sorted_set
票数 11
EN

Stack Overflow用户

发布于 2011-02-13 06:46:03

有277259行,只有某些插入很慢(很少见)

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

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

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

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

票数 13
EN

Stack Overflow用户

发布于 2011-01-30 01:09:20

如果您是以大而密集的突发插入到表中,则可能需要花费一些时间进行内务管理,例如为表和索引分配更多的空间。

如果不想让你的应用程序等待,试着使用INSERT DELAYED,尽管它有它的缺点。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4837903

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档