這裏是我的情況:MySQL的臨時表的性能
我的建築內,可以由用戶自由添加大量的搜索條件的產品目錄系統,通過直接請求或用戶的權限,位置或其他元數據。
有一個主要的查詢正在做繁重的工作,它比較大,並且包含了可變數量的子查詢以使魔法發生。查詢返回9列,其中沒有包含太多數據,其中一些通常只是空值。
我需要在隨後的幾個其他查詢(例如,排序結果數據,應用第二層過濾器,分頁,選擇備用過濾器選項)中訪問此查詢的結果數據。
在PHP方面,我只需要25個項目的分頁結果,所以我想保留我的數據庫數據在數據庫中。
我正在使用的解決方案是創建一個臨時表,並向其中插入/選擇數據。
CREATE TEMPORARY TABLE `tmp_table`
(
`col1` bigint(20) NOT NULL,
`col2` int(11) NOT NULL,
`col3` varchar(16) NOT NULL,
`col4` decimal(10,2) NULL,
`col5` decimal(10,2) NULL,
`col6` decimal(10,2) NULL,
`col7` decimal(10,2) NULL,
`col8` decimal(10,2) NULL,
`col9` tinyint(1) NULL,
`col10` int(11) NULL,
`col11` int(11) NULL
) ENGINE=MEMORY;
INSERT INTO `tmp_table` (col1, col2, etc.)
SELECT [...large query]
問題:通過自身的大型查詢執行< 0.3秒,但是增加臨時表的插入推動執行了3.5秒之間〜5.0S
我已經試過MEMORY,InnoDB的,和MyISAM作爲表引擎,都有類似的結果。
我已經嘗試過在臨時表上使用和沒有索引,這似乎也沒有影響執行時間。
的執行時間幾乎是一個結果集的50或500
我的問題是一樣的:這是不合適的做法?是否有任何MySQL配置變量可以提高性能?有沒有更好的解決方案,我忽略了?
您是否將InnoDB配置爲使用比默認8MB的內存更多的內存? –
是的,innodb_buffer_pool_size是20GB。 – Inkuisi