【问题标题】:Error "1038 Out of sort memory, consider increasing sort buffer size错误“1038 排序内存不足,请考虑增加排序缓冲区大小
【发布时间】:2015-06-17 00:32:46
【问题描述】:

在 symfony2 中,我有一个触发错误的查询:

Error "1038 Out of sort memory, consider increasing server sort buffer size

查询:

$queryBuilder = $this
    ->createQueryBuilder('object')
    ->leftJoin('object.objectCategory', 'c')
    ->leftJoin('object.medias', 'm')
    ->leftJoin('object.recipients', 'r')
    ->leftJoin('object.answers', 'a')
    ->leftJoin('object.tags', 't')
    ->leftJoin('object.user', 'u')
    ->leftJoin('object.votes', 'v')
    ->leftJoin('object.comments', 'comments')
    ->leftJoin('v.user', 'vuser')
    ->addSelect('c, t, v, u')
    ->groupBy('object, c, t, v, u')
    ->where('object.isVisible = :isVisible')
    ->orderBy('object.createdAt', 'DESC')
    ->setParameter('isVisible', true)
    ->addSelect('SUM(v.value) AS HIDDEN vote_value')
    ->orderBy('vote_value', 'DESC')
    ;

如果我省略 group by,它运行得很好。 如果我添加 select 和 group by less 元素,它也运行良好,但是我在我的 twig 模板中启动了更多子查询。

如何优化此查询以使其不出现错误或通过分配更多内存(理想情况下仅用于此查询)来消除错误?

【问题讨论】:

  • 好吧,我通过从 addselect 中删除用户来解决这个问题。它没有影响查询的数量。下面的答案也应该没问题。

标签: mysql sql symfony doctrine-orm


【解决方案1】:

您可能需要在/etc/mysql/my.cnf 中增加mysql 的缓冲区大小,例如:

[mysqld]
sort_buffer_size=256k

【讨论】:

【解决方案2】:

在我的情况下,在不增加排序缓冲区大小的情况下真正有帮助的是为我正在订购的字段创建索引。我不确定它在加入表格时是否有效,但在尝试订购一个非常大的单个表格时它会有效。

【讨论】:

  • 可能有助于索引用于连接的字段。在 MsSQL 中,我会查看解释计划。
【解决方案3】:

只需运行 mysql 查询

SET GLOBAL sort_buffer_size = 256000000 // It'll reset after server restart

设置为永久

编辑下面的文件并添加

sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

sort_buffer_size = 256000000

sudo service mysql restart

【讨论】:

  • [mysqld] sort_buffer_size = 256000000 用于 MySQL 8 标准配置
  • 感谢 Diego de la Riva。我之前在 Ubuntu 上安装了一个 pre-mysql 8 版本,所以 /etc/mysql//etc/mysql/mysql.conf.d//etc/mysql/conf.d/ 中的配置文件中的标头都有标头 [mysql] 所以它必须更改为 [mysqld] sort_buffer_size = 256000000
【解决方案4】:

如果您使用的是 docker mysql 容器,请在 docker-compose.yml 中添加以下设置:

db:
    image: mysql:8
    command: --sort_buffer_size=512K

【讨论】:

    【解决方案5】:

    有一个突出的issue with MySQL 在尝试对具有 json 列的表进行排序时导致此错误。看起来它会影响 MySQL >= 8.0.18。截至我在这里的回复,团队仍在考虑这是否是一个错误。如果您受到此影响,请提供有关该主题的反馈。

    虽然增加缓冲区大小可以在这里是一种解决方案,但 IMO 确实没有必要这样做,因为即使在具有 json 列的表上按数字主键排序也会导致此问题。

    根据我的经验,调整缓冲区大小并不是很可靠,因为缓冲区大小与 json 列中内容的长度相关,因此虽然它可以解决直接问题,但如果您的数据集增长它会需要重新调整。

    【讨论】:

      【解决方案6】:

      所以答案几乎从不增加缓冲区大小(并且通常避免触及 MySQL 中的默认设置),而是检查查询的质量和/或为您的列添加索引正在对 !!! 进行频繁的查询

      语法:

      CREATE INDEX [index name] ON [table name]([column name]);
      

      文档: https://dev.mysql.com/doc/refman/8.0/en/create-index.html

      【讨论】:

      • 所以基本上你想要做的是使用ORDER BY在你正在排序的列上创建一个索引。
      【解决方案7】:

      看起来选择包含大量 json 数据的列可能会导致此错误。我有一个带有 html 页面的 json 列,并通过从 select 语句中删除它来修复错误。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-25
        • 1970-01-01
        • 2023-03-29
        • 1970-01-01
        • 1970-01-01
        • 2019-08-06
        • 2012-06-16
        • 1970-01-01
        相关资源
        最近更新 更多