每当MySQL生成临时表时,我一直在阅读有关VARCHAR字段转换为CHAR字段的信息。
如果我有下表...
而且,我们说我有这个问题......
当MySQL创建临时表时,为了排序并偶尔分组(在某些情况下),最终会在临时表中出现什么?
例如,表中是否只包含选择要返回哪些行所必需的列(即WHERE和ORDER BY子句中指定的行),然后是数据库引擎确定LIMIT中的12行,然后读取只有那12行的数据?或者,临时表中是否包含更大的数据块(例如,所有可能的行包括冗长的VARCHAR列)?
答案 0 :(得分:1)
如果临时表适合memory restrictions,则使用HEAP (Memory engine)创建。所有限制均适用。如果它变得太大,服务器会将其转换为磁盘上的MyISAM临时表。
答案 1 :(得分:0)
当我试图找出是否只需要在表中使用TEXT
或BLOB
来强制基于磁盘的临时表时,我有类似的情况当MySQL必须创建临时表时或者它也取决于该列是否在查询中(SELECT
或WHERE
子句)。
这是查询(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列
...