MySQL创建临时表时包含哪些数据?

时间:2011-11-28 08:41:41

标签: mysql select varchar temp-tables

每当MySQL生成临时表时,我一直在阅读有关VARCHAR字段转换为CHAR字段的信息。

如果我有下表...

  • 超过100K行
  • 设置为实际长度的十几个VARCHAR列(例如,电话号码为10)
  • 5个VARCHAR列设置为15K(长度可能短至20但最多可达15K)

而且,我们说我有这个问题......

  • 返回多个列,包括VARCHAR
  • 加入其他六个表( 在VARCHAR列上)
  • 按日期和数字ID对行进行排序(即,VARCHAR列上的
  • 具有的WHERE子句包含VARCHAR字段
  • 限制为12行

当MySQL创建临时表时,为了排序并偶尔分组(在某些情况下),最终会在临时表中出现什么?

例如,表中是否只包含选择要返回哪些行所必需的列(即WHERE和ORDER BY子句中指定的行),然后是数据库引擎确定LIMIT中的12行,然后读取只有那12行的数据?或者,临时表中是否包含更大的数据块(例如,所有可能的行包括冗长的VARCHAR列)?

2 个答案:

答案 0 :(得分:1)

如果临时表适合memory restrictions,则使用HEAP (Memory engine)创建。所有限制均适用。如果它变得太大,服务器会将其转换为磁盘上的MyISAM临时表。

答案 1 :(得分: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列

     

...