我们有下表,其中包含大约 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/