【问题标题】:Can querying a TEXT column lead to creation of a temp table?查询 TEXT 列会导致创建临时表吗?
【发布时间】:2017-02-08 16:39:26
【问题描述】:

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

我今天接到 DBA 的电话,说我的应用程序创建的临时表数量激增。

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

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

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

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

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

show GLOBAL status like 'created_tmp_disk_tables'

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

【问题讨论】:

    标签: mysql temp-tables


    【解决方案1】:

    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 查询或使用索引来帮助查询获得相同的结果,而无需使用临时表。这取决于特定的查询和您的表定义。查询优化是一个必须根据具体情况进行的过程。

    【讨论】:

      【解决方案2】:

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

      来自documentation

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

      • 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 字节。)

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

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

      【讨论】:

        猜你喜欢
        • 2014-03-23
        • 1970-01-01
        • 2022-11-22
        • 2013-07-01
        • 2013-07-10
        • 2014-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多