2011-11-28 43 views
4

我一直在閱讀有關每當MySQL生成一個臨時表時將轉換爲CHAR字段的VARCHAR字段的信息。當MySQL創建臨時表時,包含哪些數據?

如果我有以下表...

  • 的100K行
  • 十幾VARCHAR列設置爲實際長度(例如,10爲電話號碼)
  • 5個VARCHAR列設置爲過剩15K(帶長度,可以短至20,但高達15K最壞情況)

而且,讓我們說我有這個疑問...

  • 返回多列,包括VARCHAR處理
  • JOIN'd有半打其他表(VARCHAR列上不
  • 對行排序按日期和數字ID(即不上 VARCHAR列)
  • 有不包括VARCHAR領域
  • 有12行
一LIMIT WHERE子句

當MySQL創建一個臨時表時,爲了排序和偶爾分組(在某些情況下),臨時表中的結果是什麼?

例如,該表只包含選擇要返回哪些行(即那些在WHERE和ORDER BY子句中指定的行)所需的列,然後是數據庫引擎確定LIMIT中的12行,然後閱讀只有這12行的數據?或者,包含在臨時表中的數據塊是否更大(例如,包括冗長VARCHAR列的所有潛在行)?

+1

你生成這個聲明的臨時表? CREATE TEMPORARY TABLE temp_table(count int);' – Matteo

+0

@Matteo:不,我沒有明確地創建臨時表。據我瞭解(或誤解)它,每當我的查詢排序或組時,隱式創建一個臨時表。 –

回答

1

如果臨時表適合memory restrictions,它使用HEAP (Memory engine)創建。所有限制均適用。如果它變得太大,服務器會將它轉換爲磁盤上臨時表的MyISAM

+0

你能通過文檔證明這一點嗎? – gbn

+1

@gbn http://dev.mysql.com/doc/refman/5.1/en/internal-temporary-tables.html –

+0

@FractalizeR:你能用更基本的術語解釋一下嗎?基本上,我想知道當VARCHAR字段不是WHERE,ORDER BY或GROUP BY子句的基礎時,VARCHAR字段的存在或長度是否會影響性能或內存。在我簡單化的邏輯中,不需要包含那些不影響行選擇的數據,直到這些行被確定(例如,在我的情況中,由LIMIT語句指定的12行)。我想(再次簡單地說)我所需要返回的數據(包括VARCHAR列的內容)只能讀取那12行。 –

0

我有類似的情況,當我試圖找出是否需要在表中有一個TEXTBLOB強制一個基於磁盤的臨時表,當MySQL必須做一個臨時表或它也是基於該列是否在查詢中(SELECTWHERE子句)。

這是查詢(posts.body是類型TEXT的)

SELECT * FROM posts p LEFT JOIN user u ON p.user_id = u.id LEFT JOIN setting s ON u.id = s.user_id WHERE (p.title LIKE '%search%' AND (p.status = 'PUBLISH' AND p.date <= 1368441957)) GROUP BY u.id LIMIT 5 

我看到運行此遞增Created_tmp_disk_tables變量。所以我改變了查詢

SELECT p.id FROM posts p LEFT JOIN user u ON p.user_id = u.id LEFT JOIN setting s ON u.id = s.user_id WHERE (p.title LIKE '%search%' AND (p.status = 'PUBLISH' AND p.date <= 1368441957)) GROUP BY u.id LIMIT 5 

有趣的是,櫃檯並沒有增加。然而,MySQL的文檔中提到這是我的推斷不同

有些條件阻止使用內存中的臨時表,在這種情況下,服務器使用的磁盤上的表,而不是以下:

在表

一個BLOB或TEXT列的存在......