云数据库 GAUSSDB(FOR MYSQL)-内存使用率高怎么处理:原因二:存在大量消耗内存的查询语句

时间:2024-05-16 15:05:29

原因二:存在大量消耗内存的查询语句

一些涉及到排序或者分组的语句会使用到临时表,当并发量过大、查询中间结果过多时,会导致临时表占用过多内存,出现实例OOM风险。

针对上述原因,您可采取以下处理措施:

  • 可以使用EXPLAIN命令检查Extra列是否显示Using Temporary,确定语句是否会用到临时表,对于使用临时表的SQL语句进一步分析查询计划和重写查询语句,尽量减少临时表的使用。表2列举了部分需要使用临时表的SQL语句。
    表2 需要使用临时表的场景

    序号

    场景

    1

    UNION查询。

    2

    用到TEMPTABLE算法或者是UNION查询中的视图。

    3

    ORDER BY和GROUP BY的子句不一样时。

    4

    表连接中,ORDER BY的列不是驱动表中的。

    5

    DISTINCT查询并且加上ORDER BY时。

    6

    SQL中用到SQL_SMALL_RESULT修饰符的查询。

    7

    FROM中的子查询(派生表)。

    8

    子查询或者SEMI-JOIN时创建的表。

    9

    评估多表UPDATE语句。

    10

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

  • 创建合适的索引,减小查询结果的数量,来控制临时表使用的内存。
  • 使用LIMIT子句限制查询结果的数量,避免一次性返回大量数据。
  • 对于需要大量使用内存的SQL语句,减小并发度,避免内存突增导致实例OOM。
  • 结合业务情况扩大实例规格。
support.huaweicloud.com/trouble-gaussdbformysql/gaussdbformysql_trouble_0512.html