2011-11-28 76 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列的存在......