繁体   English   中英

查询TEXT列可以导致创建临时表吗?

[英]Can querying a TEXT column lead to creation of a temp table?

我不是很了解mysql。 因此,如果这是一个愚蠢的问题,请原谅。

我今天从数据库管理员那里接到一个电话,说我的应用程序创建的临时表数量激增。

除了我没有明确创建任何临时表。

在进行故障排除时,我们发现每次在子查询中使用TEXT列时,都会创建一个临时表。

作为开发人员,我发现使用子查询和TEXT列创建了一个临时表感到困惑。

我的问题是,作为开发人员,我如何才能理解QUERY何时会创建临时表(在后台)。

我做了一些谷歌搜索,发现我可以做类似的事情

show GLOBAL status like 'created_tmp_disk_tables'

但是它告诉我什么? 我怎么知道我的查询是否导致了临时表。

要确定语句是否需要临时表,请使用EXPLAIN并检查Extra列以查看其是否显示“使用临时表”。

文档中

服务器在以下条件下创建临时表:

  • 评估UNION语句,但稍后会有一些例外。

  • 评估某些视图,例如使用TEMPTABLE算法,UNION或聚合的视图。

  • 派生表的评估(FROM子句中的子查询)。

  • 为子查询或半联接实现创建的表(请参见第9.2.1.18节“子查询优化”)。

  • 评估包含ORDER BY子句和另一个GROUP BY子句的语句,或者对于ORDER BY或GROUP BY包含联接队列中第一个表以外的表中的列的语句,进行评估。

  • 结合ORDER BY对DISTINCT进行评估可能需要一个临时表。

  • 对于使用SQL_SMALL_RESULT选项的查询,MySQL使用内存中临时表,除非查询还包含需要磁盘存储的元素(稍后描述)。

  • 评估多表UPDATE语句。

  • 计算GROUP_CONCAT()或COUNT(DISTINCT)表达式。

同样,某些查询条件会阻止使用内存中的临时表,在这种情况下,服务器将使用磁盘上的表来代替:

  • 表中是否存在BLOB或TEXT列

  • GROUP BY或DISTINCT子句中存在任何字符串列,对于二进制字符串,大于512个字节,对于非二进制字符串,大于512个字符。 (这仅在MySQL 5.7.5之前适用。此外,在MySQL 5.7.3之前,无论字符串类型如何,该限制均为512字节。)

  • 如果使用UNION或UNION ALL,则SELECT列表中存在任何最大长度大于512(字符串为二进制字符串,非二进制为字符)的字符串列

  • SHOW COLUMNS和DESCRIBE语句使用BLOB作为某些列的类型,因此用于结果的临时表是磁盘上的表。

MySQL在很多不同类型的查询中使用临时表,而无需您查询它们。 经常(但并非总是)创建临时表的几种情况:

  • 子查询
  • GROUP BY
  • UNION
  • 通过VIEW查询
  • 常用表表达式( WITH ...语法)

在文档中可以找到关于MySQL使用“内部”临时表的更完整指南: https : //dev.mysql.com/doc/refman/5.7/en/internal-temporary-tables.html

基本上,当执行查询需要保存部分结果中的行,然后继续将部分结果细化为最终结果时,将使用临时表。

临时表对于使用MYSQL Server而言相当昂贵,因此我们希望尽可能避免使用它们。 当临时表写入文件系统而不是保留在内存中时,尤其昂贵。 当临时表涉及TEXTBLOB列,或者它需要存储的行超出tmp_table_size配置选项所限制的内存量时,就会发生这种情况。

您可以(大部分)通过使用EXPLAIN分析查询来确定查询何时将使用临时表。 参见https://dev.mysql.com/doc/refman/5.7/en/explain.html

有时内部临时表是不可避免的,因为没有其他方法可以获取所需的查询结果。 但是有时您可以重写SQL查询或使用索引来帮助查询获得相同的结果,而无需使用临时表。 它取决于特定的查询和您的表定义。 查询优化是必须根据具体情况进行的过程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM