我試圖將查詢結果存儲在臨時表中作進一步處理。爲什麼MySQL'insert into ... select ...'比單獨選擇慢得多?
create temporary table tmpTest
(
a FLOAT,
b FLOAT,
c FLOAT
)
engine = memory;
insert into tmpTest
(
select a,b,c from someTable
where ...
);
但由於某些原因插入需要長達一分鐘,而再選擇單獨只需要幾秒鐘。爲什麼要將數據寫入臨時表而不是將其打印到SQL管理工具的輸出需要更長的時間?
UPDATE 我的設置: 的MySQL 7.3.2集羣與 8的Debian Linux的NDB數據節點 1 SQL節點(Windows Server 2012中)
我跑了選擇上的表是一個NDB表。
我試圖找出來,如果使用時的執行計劃會有所不同「插入..」,但他們看起來是一樣的: (抱歉格式,計算器沒有表)
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
CREATE TABLE ... SELECT也很慢。 47秒對比5秒沒有表插入/創建。
你應該更具體一些,並提供一些你正在寫的數據。另外'INSERT .. SELECT'語法是不同的。您的示例將導致錯誤。 –
很好的問題。我真的不知道MySQL如何爲自己保留「內存」。根據系統的狀態,如果它通過操作系統api,它可能會*詢問*內存,然後將其作爲* ram *或* harddrive *空間。查看窗口的虛擬字節管理。 – Sebas
您是否嘗試過使用CREATE TABLE ... SELECT類型的查詢進行比較? http://dev.mysql.com/doc/refman/5.0/en/create-table-select.html – xiankai