【问题标题】:Slow select when inserting large amounts of data (MYSQL)插入大量数据时选择慢(MYSQL)
【发布时间】:2010-03-15 00:23:41
【问题描述】:

我有一个使用一次插入 500 行的插入来导入大量数据(950k 行)的过程。该过程通常需要大约 12 小时,这还不错。通常在表上进行查询非常快(不到 1 秒),因为我已经放置了(我认为是)正确的索引。我遇到的问题是在导入过程运行时尝试运行查询。它使查询需要将近 2 分钟!我该怎么做才能使这两件事不竞争资源(或其他)?我查看了“插入延迟”,但不确定是否要将表更改为 MyISAM。

感谢您的帮助!

【问题讨论】:

  • 给出更多细节:表模式 + 选择查询
  • ps:与常规 INSERT 相比,LOAD DATA INFILE 可能是更好的选择
  • pps:可能是 SHOW ENGINE INNODB STATUS 也能显示一些有趣的东西?

标签: mysql select import insert performance


【解决方案1】:

您是否尝试过使用优先级提示?

SELECT HIGH_PRIORITY ...INSERT LOW_PRIORITY ...

【讨论】:

  • 我打赌他最大的问题不是正确的索引,而不是优先级。
  • 他说有正确的索引并且性能问题只在执行批量插入时出现。
  • 我会优先考虑,看看会发生什么。
  • 我可以使用“insert low_priority”(这并没有解决问题),但是“select high_priority”只是为我的 MYSQL 版本 5.1.39 抛出了一个错误。
【解决方案2】:

插入 950k 行需要 12 个小时,这是相当繁重的任务。这些行有多大?它们上有什么样的索引?即使实际数据插入进行得很快,索引的持续更新肯定会导致当时使用这些表的任何东西的性能下降。

您是使用批量 INSERT 语法(插入到选项卡 (x) 值 (a)、(b)、(c) 等...)还是每行一个 INSERT 进行这些导入?与单行相比,执行批量插入需要更长的索引更新周期(因为它必须为 500 行生成索引数据)。毫无疑问,当数据更新时,索引上会存在某种内部锁定,在这种情况下,您至少需要处理 950k/500 = 1,900 个锁定会话。

我发现在我的一些批量插入脚本(用于一些自定义数据挖掘的 http 日志分析器)中,DISABLE 相关表上的索引更快,然后在之后重新启用/重建它们数据转储完成。如果我没记错的话,在启用键的情况下插入 200,000 行命中数据大约需要 37 分钟,而在没有索引的情况下大约需要 3 分钟。

【讨论】:

    【解决方案3】:

    所以我终于在导入数据的过程中发现搜索速度变慢了。我有一个这样的查询:

    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 运算符对你的数据真的很贪心。
    【解决方案4】:

    您可以尝试将数据导入某个辅助表,然后将其合并到主表中。您不会在主表中失去性能,而且我认为您的数据库可以比多次插入更快地管理合并。

    【讨论】:

    • 我最终这样做了,它有助于加快导入速度,但导入期间搜索的问题仍然存在。感谢您的帮助!
    • 尝试找出真正的瓶颈。我认为它是硬盘 - 所以只有创建一个 RAID 方案或类似的东西来解决它。导入时检查 SO 和 DBMS 中的系统状态(CPU-内存-磁盘活动)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-24
    • 1970-01-01
    • 2018-06-12
    • 2012-11-01
    • 2017-06-03
    相关资源
    最近更新 更多