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