错误"1038超出排序内存,请考虑增加排序缓冲区大小

Séb*_*ien 8 mysql sql symfony doctrine-orm

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

Error "1038 Out of sort memory, consider increasing server sort buffer size
Run Code Online (Sandbox Code Playgroud)

查询:

$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')
    ;
Run Code Online (Sandbox Code Playgroud)

如果我省略了分组,它运行得很好.如果我用较少的元素添加select和group,它也运行正常但是我在我的twig模板中启动了更多的子查询.

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

Roh*_*rte 26

只需运行 mysql 查询

SET GLOBAL sort_buffer_size = 256000000 // It'll reset after server restart
Run Code Online (Sandbox Code Playgroud)

设置永久

编辑下面的文件并添加

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

sort_buffer_size = 256000000

sudo service mysql restart
Run Code Online (Sandbox Code Playgroud)

  • `[mysqld]` `sort_buffer_size = 256000000` 对于 MySQL 8 标准配置 (2认同)

Web*_*net 15

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

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

根据我的经验,调整缓冲区大小不是很可靠,因为缓冲区大小与 json 列中内容的长度有关,因此虽然它可以解决当前的问题,但如果您的数据集增长,则需要再次调整。

  • MySQL 8.0.28 中已修复 (8认同)
  • MySQL 8.0.29 中仍然存在 Bug (3认同)
  • 我在主键列上有一个“ORDER BY”。通过 8.0.28 中的修复,如果选择中仅包含几列,则可以正常工作。但如果我选择所有列,问题仍然会发生。 (2认同)

Dmi*_*try 9

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

db:
    image: mysql:8
    command: --sort_buffer_size=512K
Run Code Online (Sandbox Code Playgroud)


And*_*kiy 8

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


Rah*_*thi 6

您可能需要在/etc/mysql/my.cnfset中增加mysql的缓冲区大小

sort_buffer_size to 256K
Run Code Online (Sandbox Code Playgroud)

  • 顺便提一下,请访问http://www.xaprb.com/blog/2010/05/09/how-to-tune-mysqls-sort_buffer_size/ ...:我也是初学者;) (2认同)
  • 根据 mysql 文档,尽量避免更改此配置值。我可以解决这个问题,将旧表从 myISAM 转换为 InnoDB。 (2认同)

apo*_*fos 6

在我的情况下,在不增加排序缓冲区大小的情况下实际上有帮助的是为我正在订购的字段创建索引。我不确定它在连接表时是否有效,但在尝试订购非常大的单个表时它会起作用。


小智 6

所以答案几乎从不增加缓冲区大小(并避免一般地接触 MySQL 中的默认设置),而是检查查询的质量和/或向您经常运行的列添加索引反问!!!

句法:

CREATE INDEX [index name] ON [table name]([column name]);
Run Code Online (Sandbox Code Playgroud)

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