本文介紹了為什么MySQL';插入…選擇……比單獨選擇慢得多嗎?的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我正在嘗試將查詢結果存儲在臨時表中以供進一步處理。
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)
我正在運行SELECT的表是NDB表。
我試著找出,使用‘INSERT INTO..’時執行計劃是否會不同,但它們看起來是一樣的:
(很抱歉格式錯誤,Stackoverflow沒有表格)
id select_type table type possible_keys key key_len ref rows Extra 1 PRIMARY <subquery3> ALL N N N N N N 1 PRIMARY foo ref PRIMARY PRIMARY 3 <subquery3>.fooId 9747434 Using where 2 SUBQUERY someTable range PRIMARY PRIMARY 3 N 136933000 Using where with pushed condition; Using MRR; Using temporary; Using filesort 3 MATERIALIZED tmpBar ALL N N N N 1000 N
創建表格…SELECT速度也很慢。47秒,而不插入/創建表時為5秒。
推薦答案
我在上面寫了一條評論,然后偶然發現這是一種解決辦法。
這將完成您想要做的事情。
SELECT * FROM aTable INTO OUTFILE '/tmp/atable.txt';
LOAD DATA INFILE '/tmp/atable.txt' INTO TABLE anotherTable;
注意,這樣做意味著要以某種方式管理/tmp表。如果嘗試將數據選擇到已存在的OUTFILE中,則會出現錯誤。因此,您需要生成唯一的臨時文件名。然后運行某種cron作業來清理它們。
我猜INFILE和OUTFILE的行為不同。如果有人能解釋一下MySQL的行為是怎么回事,我將不勝感激。
D
這里有一種比使用INFILE/OUTFILE更好的方法。
設置事務隔離級別讀已提交;
插入到表格中
選擇…發件人…
這里有一篇相關的帖子可供閱讀:
How to improve INSERT INTO … SELECT locking behavior
這篇關于為什么MySQL';插入…選擇……比單獨選擇慢得多嗎?的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,