我有一个进程,使用一次插入500行的插入来导入大量数据(950k行)。这个过程一般需要12个小时,这也不算太糟糕。通常在表上进行查询非常快(不到1秒),因为我已经(我认为是)正确的索引。我遇到的问题是在导入进程运行时尝试运行查询。它使查询花了将近2分钟!我能做些什么来使这两件事不争夺资源(或其他)?我查看了“插入延迟”但不确定我是否要将表更改为MyISAM。
感谢您的帮助!
答案 0 :(得分:1)
您是否尝试过使用优先提示?
SELECT HIGH_PRIORITY ...
和INSERT LOW_PRIORITY ...
答案 1 :(得分:1)
插入950k行12小时是非常重要的。这些行有多大?什么样的索引在他们身上?即使实际数据插入速度很快,索引的持续更新肯定会导致当时使用这些表的任何内容的性能下降。
您是使用批量INSERT语法进行这些导入(插入tab(x)值(a),(b),(c)等...)还是每行一次INSERT?执行批量插入将需要更长的索引更新周期(因为它必须生成500行的索引数据),而不是单行执行。毫无疑问,当数据更新时,会对索引进行某种内部锁定,在这种情况下,您至少会与950k / 500 = 1,900次锁定会话竞争。
我发现在我的一些批量插入脚本(用于某些自定义数据挖掘的http日志分析器)上,相关表上的 DISABLE 索引更快,然后在重新启用/重建它们之后数据转储已完成。如果我没记错的话,在启用密钥的情况下插入200,000行命中数据大约需要37分钟,在没有编制索引的情况下大约需要3分钟。
答案 2 :(得分:1)
所以我最终在导入数据时搜索速度减慢了。我有一个这样的查询:
SELECT * FROM `properties` WHERE (state like 'Florida%') and (county like 'Hillsborough%') ORDER BY created_at desc LIMIT 0, 50
当我在它上面运行一个EXPLAIN时,我发现它扫描了大约215,000行(即使有适当的州和县的索引)。然后我对以下查询运行了一个EXPLAIN:
SELECT * FROM `properties` WHERE (state = 'Florida') and (county = 'Hillsborough') ORDER BY created_at desc LIMIT 0, 50
并且看到它只需要扫描500行。考虑到实际结果集大约是350,我认为我发现了减速。
我已经在我的查询中切换到不使用“like”,并对快速结果感到非常满意。
感谢大家的帮助和建议。非常感谢他们!
答案 3 :(得分:0)
您可以尝试将数据导入某个辅助表,然后将其合并到主表中。您不会在主表中失去性能,我认为您的数据库可以比多次插入更快地管理合并。