在我们的生产数据库中,我们每小时运行以下伪代码SQL批处理查询:

INSERT INTO TemporaryTable
    (SELECT FROM HighlyContentiousTableInInnoDb
     WHERE allKindsOfComplexConditions are true)

现在这个查询本身不需要很快,但我注意到它锁定了HighlyContentiousTableInInnoDb,尽管它只是从中读取.这使得其他一些非常简单的查询需要大约25秒(这就是其他查询需要的时间).

然后我发现在这种情况下,InnoDB表实际上是被SELECT锁定的!https://www.percona.com/blog/2006/07/12/insert-into-select-performance-with-innodb-tables/

但我真的不喜欢文章中 Select 外部文件的解决方案,它似乎是一种黑客行为(文件系统上的临时文件似乎很糟糕).还有其他 idea 吗?有没有一种方法可以制作InnoDB表的完整副本,而不必在复制过程中以这种方式锁定它.然后我可以把HighlyContentiousTable复制到另一个表中,在那里进行查询.

推荐答案

这个问题的答案现在简单多了:

你经历的锁定消失了.

更长的解释:http://harrison-fisk.blogspot.com/2009/02/my-favorite-new-feature-of-mysql-51.html

Mysql相关问答推荐

拒绝非超级用户访问停靠的MariaDB(超级用户工作)

可以在MySQL表名中使用表情包吗?

根据当前表列的值,从SQL中的另一个表中获取数据

在MySQL中使用FIRST_VALUE()

警告:MYSQL_OPT_RECONNECT 已弃用

使用 presto 或 mysql 添加每个组中的缺失值

Mysql根据文本语言或行数将列拆分为多列

MySQL - 如何查询涉及前面计算值的表结果

如何使用 DBD::mysql 判断 MySQL 服务是否正在运行

如何计算每行的剩余金额?

相关查询 - 在派生表中,我可以有多个嵌套级别吗?

如何替换 SELECT 查询中重复记录的列?

MySQL过滤食谱上的多对多 - 成分表

用两个新列制作表格,按偶数或奇数对另一列进行分类,并将一个类别中的所有偶数和奇数相加

在 MySQL 中为多列创建索引以进行查询优化

如何存储百分比值?

MySQL触发器在某些条件下防止INSERT

如何使用 SQL 数据库中的经纬度查找最近的位置?

如何从两个不同的日期获得年份差异?

在 MySQL 中存储 IPv6 地址