mysql - 200m 表上的缓慢 INSERT 查询

标签 mysql insert

我们有下表,其中包含大约 2 亿条记录:

CREATE TABLE IF NOT EXISTS `history` (
  `airline` char(2) NOT NULL,
  `org` char(3) NOT NULL,
  `dst` char(3) NOT NULL,
  `departat` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `arriveat` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
  `validon` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `price` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8
/*!50500 PARTITION BY RANGE  COLUMNS(org)
(PARTITION p0 VALUES LESS THAN ('AHI') ENGINE = MyISAM,
 PARTITION p1 VALUES LESS THAN ('ARO') ENGINE = MyISAM,
 ...
 PARTITION p39 VALUES LESS THAN ('WMA') ENGINE = MyISAM,
 PARTITION p40 VALUES LESS THAN (MAXVALUE) ENGINE = MyISAM) */;

--
-- Indexes for table `history`
--
ALTER TABLE `history`
 ADD KEY `tail` (`org`,`dst`,`departat`);

我们经常批量插入一些 VALUES,通常在简单的 INSERT 查询中最多插入 1000 条记录,没有任何修饰,例如 ON DUPLICATE KEY(无论如何索引都不是唯一的)。

有时,当我在 phpMyAdmin 中查看服务器状态时,会看到一堆 INSERT 语句相互等待,有时长达 300-400 秒。在特定时间服务器上似乎没有其他事情发生。我们获得了 32 GB 和其他出色的性能。

如何解决这个问题?感谢您的帮助。

最佳答案

可能第一步是使用 profiling 进行几次测试。上。

通常你会做这样的事情:

SET LOCAL PROFILING=ON;
-- run your INSERT, like:
INSERT INTO yourtable (id) VALUES (1),(2),(3);

SHOW PROFILES;
+----------+------------+------------------------------------------------+
| Query_ID | Duration   | Query                                          |
+----------+------------+------------------------------------------------+
|     1012 | 6.25220000 | INSERT INTO yourtable (id) VALUES (1),(2),(3); |
+----------+------------+------------------------------------------------+

这会告诉您非常基本的信息,例如查询的持续时间(在本例中为 6.25 秒)。要获取实际详细信息,您需要提取所述查询的配置文件:

SHOW PROFILE FOR QUERY 1025; 
+------------------------------+----------+
| Status                       | Duration |
+------------------------------+----------+
| starting                     | 0.004356 |
| checking permissions         | 0.000015 |
| Opening tables               | 6.202999 |
| System lock                  | 0.000017 |
| init                         | 0.000342 |
| update                       | 0.023951 |
| Waiting for query cache lock | 0.000008 |
| update                       | 0.000007 |
| end                          | 0.000011 |
| query end                    | 0.019984 |
| closing tables               | 0.000019 |
| freeing items                | 0.000304 |
| logging slow query           | 0.000006 |
| cleaning up                  | 0.000181 |
+------------------------------+----------+

您可能会注意到,“打开表格” 花费了很长时间。在此示例中,通过另一个进程锁定表 (LOCK TABLES) 来延迟执行,从而延迟了查询执行。有关各州的更多信息,请参阅 manual .

关于mysql - 200m 表上的缓慢 INSERT 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31743741/

相关文章:

python - Django 创建和更改 mysql 数据库以供学习之用

mysql - 如何在 sql 转储中获取完整语法?

c - 根指针移动到指向二叉搜索树中插入的单词

sql-server - SQL : a condition (IF-ELSE) in INSERT INTO

tsql - 如果行不存在,则sql条件插入

mysql - 如果值未更改,则 SQL 触发器更新记录而不是插入

python - 二叉搜索树的插入算法不起作用

mysql - 多个连接出现问题

mysql - 未定义方法 `+@' 为 nil :NilClass rails after moving to mysql

mysql - 在 Mac OS X 上使用 R 访问 MySQL 数据库