【问题标题】:Aurora MySQL - Slow CREATE TABLE statement in Stored ProcAurora MySQL - 存储过程中的慢速 CREATE TABLE 语句
【发布时间】:2020-04-29 12:41:03
【问题描述】:

我们一直在努力解决运行缓慢(从未完成)的存储过程。我们一直专注于特定的 CREATE TABLE ... SELECT ... from table 与一些连接。

当我们单独运行此查询时,它会在大约 14 秒内始终如一地完成。当它作为存储过程的一部分运行时,即使在几个小时后也不会完成。

我们发现如果我们将存储过程中的所有代码作为普通 SQL 脚本运行,那么它也很慢。在存储过程中,表是从基础数据创建的,并准备由存储过程使用。

我们正在运行 5.7.mysql_aurora.2.07.2 并在 5.7.mysql_aurora.2.07.1 上进行了测试。我怀疑我们需要调整一些数据库设置,但我缺乏 InnoDB 和 Aurora 的经验。

我们从 MyISAM 迁移到 Aurora,现在我们在其中使用 InnoDB,任何有关可能导致此问题的原因的任何指导都将不胜感激。

编辑: 我确实尝试将语句从CREATE TABLE ... SELECT ... from table 更改为CREATE TABLE,然后是INSERT INTO,这没有任何区别。

似乎有效的方法是使用 create table A (PRIMARY KEY (name)) select ... 用于创建的所有表,而不是首先创建表并使用ALTER 语句添加键。

我很困惑为什么这种模式会起作用???

【问题讨论】:

    标签: mysql amazon-aurora


    【解决方案1】:

    这听起来像是一个表锁定问题。通常

    CREATE TABLE AS SELECT ... FROM table_name ...
    

    导致源表 (table_name) 需要锁定。 尝试拆分 CREATE 和 SELECT,即

    CREATE TABLE table_name ...;
    INSERT INTO table_name SELECT ...;
    

    【讨论】:

    • 这没有任何区别。服务器上没有其他任何东西在运行,它仍然没有完成查询。然而,让它运行得更快的是在 proc 中的所有表上使用 create table A (PRIMARY KEY (key_name)) select ... 方法,而不是先创建表并稍后添加主键。为什么呢???
    • 很棒的发现,它对 Aurora 引擎的内部工作原理有了更多的了解。底层存储是分片和智能的(可以将搜索条件下推到存储级别,以加快某些类型的查询)。我想这可能意味着没有 PK 就很难做到这一点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-16
    • 1970-01-01
    • 2012-07-08
    • 2015-07-16
    • 2011-08-19
    • 1970-01-01
    相关资源
    最近更新 更多