gpt4 book ai didi

mysql - 为什么 MySQL 'insert into ... select ...' 比单独选择慢这么多?

转载 作者:IT王子 更新时间:2023-10-28 23:44:30 28 4
gpt4 key购买 nike

我正在尝试将查询结果存储在临时表中以供进一步处理。

create temporary table tmpTest
(
a FLOAT,
b FLOAT,
c FLOAT
)
engine = memory;

insert into tmpTest
(
select a,b,c from someTable
where ...
);

但由于某种原因,插入需要一分钟,而单独的子选择只需要几秒钟。为什么将数据写入临时表而不是将其打印到我的 SQL 管理工具的输出中需要更长的时间???

更新我的设置:MySQL 7.3.2 集群与8 个 Debian Linux ndb 数据节点1 个 SQL 节点(Windows Server 2012)

我正在运行选择的表是 ndb 表。

我试图找出在使用“插入..”时执行计划是否会有所不同,但它们看起来是一样的:(抱歉格式化,stackoverflow 没有表格)

id  select_type     table       type    possible_keys   key     key_len ref                 rows        Extra1   PRIMARY         <subquery3> ALL     \N              \N      \N      \N                  \N          \N1   PRIMARY         foo         ref     PRIMARY         PRIMARY 3       <subquery3>.fooId   9747434     Using where2   SUBQUERY        someTable   range   PRIMARY         PRIMARY 3       \N                  136933000   Using where with pushed condition; Using MRR; Using temporary; Using filesort3   MATERIALIZED    tmpBar      ALL     \N              \N      \N      \N                  1000        \N

CREATE TABLE ... SELECT 也很慢。 47 秒与没有表插入/创建的 5 秒。

最佳答案

我在上面写了一条评论,然后偶然发现了这个作为解决方法。

这将完成您想要做的事情。

SELECT * FROM aTable INTO OUTFILE '/tmp/atable.txt';
LOAD DATA INFILE '/tmp/atable.txt' INTO TABLE anotherTable;

请注意,这样做意味着以某种方式管理/tmp 表。如果您尝试将数据 SELECT 到一个已经存在的 OUTFILE 中,则会出现错误。所以你需要生成唯一的临时文件名。然后运行某种 cron 作业来清理它们。

我想 INFILE 和 OUTFILE 的行为不同。如果有人能阐明这里发生的事情以解释 mysql 行为,我将不胜感激。

D

这里有一个比使用 INFILE/OUTFILE 更好的方法。

设置事务隔离级别已提交读; 插入表 选择 ... 来自 ...

这是一篇相关的文章:

How to improve INSERT INTO ... SELECT locking behavior

关于mysql - 为什么 MySQL 'insert into ... select ...' 比单独选择慢这么多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19269122/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com