Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql慢速插入_Sql_Mysql_Performance_Insert - Fatal编程技术网

Mysql慢速插入

Mysql慢速插入,sql,mysql,performance,insert,Sql,Mysql,Performance,Insert,我有以下InnoDB表: +-----------+-----------+------+-----+-------------------+----------------+ | Field | Type | Null | Key | Default | Extra | +-----------+-----------+------+-----+-------------------+----------------+ | id

我有以下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次缓慢更新。

因为我的经验是InnoDB性能低于MyISAM。
您尝试过使用MyISAM吗?
或者,您可能需要调整InnoDB配置:

希望对您有所帮助。

如果您要以大密度突发方式插入到表中,可能需要一些时间进行整理,例如为表和索引分配更多空间

如果你不想让你的应用程序等待,尽管它确实有缺点,但试着使用它


共有277259行,只有部分插入速度较慢(罕见)

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

还有一些周期性的背景任务,有时会使一天中的一两次插入变慢

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


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

如果在集群环境中运行,自动增量列可能会减慢插入速度。尝试调整ndb_autoincrement_prefetch_sz(请参阅)

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

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

linux工具
mytop
和查询
SHOW ENGINE INNODB STATUS\G
有助于查看可能的故障点。通用linux性能工具还可以显示磁盘的繁忙程度等

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

进一步阅读:



如果您恰好在MySQL安装中处于后台,我们在使用4.1版时会注意到很多这样的速度慢。

表中有多少行,您确定所有插入都慢吗?有277259行,只有一些插入慢(很少)。您似乎有两个索引,一个是通过
timestamp
另一个是通过
timestamp,staff
。后者足以按时间戳搜索,您可以删除前者。非常感谢。但这并不是导致插入查询速度慢的原因?通过cronjobINSERT DELAYED使您没有运行任何复杂的连接似乎是解决此问题的一个不错的解决方案,但它在InnoDB上不起作用:(它在5.6.6中也被弃用,在5.7中被删除。@kalkin-这是上面提到的一个因素,但不是唯一的一个因素。单独删除它不会使缓慢的插入消失,但这肯定是一个好主意。像InnoDB这样的存储引擎有后台任务,可以周期性地减慢一两次插入。其他因素,如自动备份(MySQL),完整映像快照(服务器备份)、页面分割等也会造成罕见的延迟。插入延迟最多的是在“高峰时间”流量很大时在页面上。@kalkin-考虑到你的高峰时间场景,我更新了答案,并给出了另外两个可能的原因。谢谢。AFAIK它不是没有资源的。也许它只是简单的数据库活动,我必须重新考虑我存储在线状态的方式。今晚我将监控数据库,并将有更多的报告。数据库现在运行正常,我有o再插入问题我在我的mysql配置中添加了以下内容,这应该会提高我的性能。我们会看到的。innodb_flush_log_at_trx_commit=0 innodb_support_xa=0 innodb_buffer_pool_size=536870912Btw我不能使用内存引擎,因为我需要以某种持久的方式拥有在线数据,以便以后分析。@Kalkin:那是听起来像是一个借口——“业务需求需要它。”有时,面对技术障碍,过于宽泛的业务需求需要重新评估。我建议根据您实际需要了解的内容重新思考您的需求。但总的来说,我的帖子是关于:不要只看这一个查询,看看您的数据库正在做的一切。我们不知道这是什么,所以我们只能帮助这么多人谢谢你对innodb优化的提示。自从我启用了它们,我再也没有慢插入了。