我的mysql集群:Ver 5.6.30-76.3-56 for debian-linux-gnu on x86_64 (Percona XtraDB Cluster (GPL), Release rel76.3, Revision aa929cb, WSREP version 25.16, wsrep_25.16)
我有一个复杂的 sql 查询,它使用以下语法将大约 36k 行插入到表中:
INSERT INTO `sometable` (SELECT ...);
选择有点复杂但并不慢(0.0023 秒),但插入大约需要 40-50 秒。当我插入行时,该表未使用。
我的问题是:
- 我可以以某种方式加快速度吗?
- 缓慢的插入导致其他表上的锁定问题(因为选择)
- 这个工作流程是好还是坏的做法?有没有更好的?
谢谢
更新:
表架构:
CREATE TABLE `sometable` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(11) unsigned DEFAULT NULL,
`a` varchar(255) DEFAULT NULL,
`b` smallint(6) unsigned DEFAULT NULL,
`c` smallint(6) unsigned DEFAULT NULL,
`d` smallint(6) unsigned DEFAULT NULL,
`e` smallint(6) unsigned DEFAULT NULL,
`f` varchar(255) DEFAULT '',
`country_id` int(10) unsigned DEFAULT NULL,
`city_id` int(10) unsigned DEFAULT NULL,
`g` smallint(6) unsigned DEFAULT NULL,
`h` smallint(6) unsigned DEFAULT NULL,
`i` smallint(6) unsigned DEFAULT NULL,
`j` smallint(6) unsigned DEFAULT NULL,
`k` smallint(6) unsigned DEFAULT NULL,
`l` varchar(3) DEFAULT NULL,
`m` varchar(3) DEFAULT NULL,
`n` text,
`o` varchar(255) DEFAULT NULL,
`p` varchar(32) DEFAULT NULL,
`q` varchar(32) DEFAULT NULL,
`r` varchar(32) DEFAULT NULL,
`s` time DEFAULT NULL,
`t` time DEFAULT NULL,
`u` text,
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`),
KEY `country_id` (`country_id`),
KEY `city_id` (`city_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
更新2:
当我尝试运行查询时,在某些情况下会出现错误:
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
我的解决方案:
如果有人感兴趣,这是我的最终解决方案: gist
主要问题是,当我填写mytable
其他查询时,其他查询卡住了,并且集群出现了严重的性能问题。在这个解决方案中,我创建了一个临时表并在“脏读”模式下用数据填充它,然后我将这些数据复制到mytable
块中,这样会花费更多时间,但没有性能问题并且不会卡住查询。