当前位置: 首页 > 面试题库 >

Mysql慢速插入

邹玄裳
2023-03-14
问题内容

我有以下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')

我真的很困惑,为什么要花这么长时间。我如何加快速度?

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


问题答案:

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

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

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

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

进一步阅读:

  • 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


 类似资料:
  • 问题内容: (重要)编辑3: 单独运行testajax2.php而 _不是_Ajax。持续时间大致相同,为1.02-1.03秒。所以我想这意味着问题出在PHP- MySQL或XAMPP中? 当我通过phpMyAdmin查询运行它时,结果如下:显示第0-29行(总计约50行。查询用时 0.0015秒 )。看来问题根本不在于Ajax,而可能在于PHP。我怎样才能解决这个问题?(我也刚刚编辑了问题标题。

  • `public class Main{private static Connection connect=null;private static Statement PreparedStatement=null;private static ResultSet ResultSet=null;

  • 问题内容: 我正在使用较大的随机数作为密钥(来自另一个系统)。在相当小的表(如几百万行)上进行插入和更新所花费的时间比我认为合理的长得多。 我已经提炼了一个非常简单的测试来说明。在测试表中,我尝试使其尽可能简单。我的真实代码没有如此简单的布局,并具有关系和附加索引等。但是,更简单的设置将显示等效的性能。 结果如下: 在MyISAM中插入1M行需要6秒钟;进入InnoDB需要 3433秒 ! 我究竟

  • 问题内容: 我已经开发了一个用户批量上传模块。有两种情况,当数据库有零条记录时,我批量上传了20000条记录。大约需要5个小时。但是,当数据库已经有大约30 000条记录时,上传速度将非常缓慢。上载2万条记录大约需要11个小时。我只是通过fgetcsv方法读取CSV文件。 下面是运行的查询。(我正在使用Yii框架) 如果存在,请更新用户: 如果用户不存在,请插入新记录。 表引擎类型为MYISAM。

  • 问题内容: 我面临一个非常奇怪的问题,我在这里问过有关加快MYSql插入速度的问题尤其是有关插入多个GB大小的巨大SQL文件的问题。他们建议我使用MyISAM引擎。我做了以下事情: 使用。 (仅限MyISAM)设置为500M。 (仅限MyISAM)设置。没有检查。 它将过程加快到5分钟,之前花费了2个小时,给我留下了深刻的印象。但是现在当我在其他表上尝试相同的操作时,则无法加快速度,并且 又要花费

  • 问题内容: 我正在尝试通过使用JAP和HIBERNATE向SQL Server 2008 R2插入一些数据。一切都“正常”,除了它非常慢。要插入20000行,大约需要45秒,而C#脚本大约需要不到1秒。 这个领域的任何资深人士都可以提供帮助吗?我会很感激。 更新:从下面的答案中得到了一些很好的建议,但仍然无法按预期工作。速度是一样的。 这是更新的persistence.xml: 这是更新的代码部分