Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL创建临时表时包含哪些数据?_Mysql_Select_Varchar_Temp Tables - Fatal编程技术网

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

MySQL创建临时表时包含哪些数据?,mysql,select,varchar,temp-tables,Mysql,Select,Varchar,Temp Tables,我一直在阅读关于每当MySQL生成临时表时,VARCHAR字段就会转换为CHAR字段的内容 如果我有下表 超过10万行 设置为实际长度的十几个VARCHAR列(例如,电话号码为10) 5个VARCHAR列设置为15K(长度可短至20,但在更糟的情况下可高达15K) 假设我有这个问题 返回多个列,包括varchar 与六个其他表联接(不在VARCHAR列上) 按日期和数字id对行进行排序(即,不在VARCHAR列上) 具有不包含VARCHAR字段的WHERE子句 限制为12行 当MySQL

我一直在阅读关于每当MySQL生成临时表时,VARCHAR字段就会转换为CHAR字段的内容

如果我有下表

  • 超过10万行
  • 设置为实际长度的十几个VARCHAR列(例如,电话号码为10)
  • 5个VARCHAR列设置为15K(长度可短至20,但在更糟的情况下可高达15K)
假设我有这个问题

  • 返回多个列,包括varchar
  • 与六个其他表联接(不在VARCHAR列上)
  • 按日期和数字id对行进行排序(即,不在VARCHAR列上)
  • 具有不包含VARCHAR字段的WHERE子句
  • 限制为12行
当MySQL创建临时表时,为了排序和偶尔分组(在某些情况下),临时表中会出现什么结果


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

如果临时表适合,则使用创建临时表。所有限制均适用。如果它长得太大,服务器将其转换为磁盘上的临时表。

我也遇到过类似的情况,当时我试图确定,当MySQL必须创建临时表时,是否需要在表中添加
文本或
BLOB
,或者是否也基于该列是否在查询中,强制使用基于磁盘的临时表(
选择
WHERE
子句)

这就是查询(
posts.body
的类型为
TEXT

有趣的是,计数器没有增加

某些情况会阻止使用内存中的临时表,在这种情况下,服务器会使用磁盘上的表:

表中是否存在BLOB或文本列


您是否使用此语句生成临时表?
创建临时表temp_table(count int);
@Matteo:不,我没有显式创建临时表。据我所知(或误解)它会在我的查询排序或分组时隐式创建一个临时表。你能通过文档证明这一点吗?@FractalizeR:你能用更基本的术语解释一下吗?基本上,我想知道当这些VARCHAR列不是WHERE、ORDER BY或FORDER的基础时,VARCHAR字段的存在或长度是否会影响性能或内存GROUP BY子句。在我过于简单的逻辑中,在确定行(例如,在我的例子中,LIMIT语句指定的12行)之前,不需要包含不影响行选择的数据。我(同样简单地)想象我想要返回的数据(包括VARCHAR列的内容)然后将只读取这12行。@LeeB。好吧,基本上,这意味着,当mysql在内存中构建临时表时,该表包含VARCHAR(X1)、VARCHAR(X2)…列,该表的每个数据行将占用大约X1+X2+…+Xn字节。临时表中VARCHAR列的内存与CHAR列的内存相同(固定大小)。
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
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