mysql 错误“1038排序内存不足,请考虑增加排序缓冲区大小

dw1jzc5e  于 2023-01-25  发布在  Mysql
关注(0)|答案(8)|浏览(227)

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

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更少的元素,它也运行得很好,但是我在我的小枝模板中启动了更多的子查询。
我如何优化这个查询以避免错误,或者通过分配更多的内存(理想情况下只为这个查询分配内存)来消 debugging 误?

mfuanj7w

mfuanj7w1#

只需运行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
yk9xbfzb

yk9xbfzb2#

有一个未解决的issue with MySQL问题,它在尝试对一个包含json列的表进行排序时导致了这个错误。看起来它影响了MySQL〉= 8.0.18。截至我在这里的回复,团队仍在考虑这是否是一个bug。如果你受到了这个问题的影响,请提供反馈。
虽然增加缓冲区大小 * 可以 * 是这里的一个解决方案,但我认为这真的不应该是必要的,因为即使是在具有json列的表上按数字主键排序也会导致这个问题。
根据我的经验,调整缓冲区大小并不可靠,因为缓冲区大小与json列中内容的长度有关,所以虽然它可以解决当前的问题,但如果数据集增长,它需要再次调整。

ffvjumwh

ffvjumwh3#

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

[mysqld]
sort_buffer_size=256k
2vuwiymt

2vuwiymt4#

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

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

vql8enpb5#

因此,答案几乎是永远不要增加缓冲区大小(并且通常要避免触及MySQL中的默认设置),而是要检查查询的质量和/或向您正在对其运行频繁查询的列添加索引!!!
语法:

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

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

qlzsbp2j

qlzsbp2j6#

在我的例子中,在不增加排序缓冲区大小的情况下,实际上有帮助的是为我排序的字段创建索引。我不确定在连接表时是否有效,但在尝试对非常大的单个表排序时有效。

kmb7vmvb

kmb7vmvb7#

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

p5cysglq

p5cysglq8#

我的laravel应用程序也遇到了同样的问题,mysql正在docker中运行。
我已创建文件夹
mkdir/主页/用户/mysql
mkdir/主页/用户/mysql/配置
mkdir/主页/用户/mysql/mysql-data
用户名/用户名/mysql/配置/我的配置文件

[mysqld]
lower_case_table_names = 1
default-authentication-plugin=mysql_native_password 
bind-address=0.0.0.0
sort_buffer_size = 256000000

首页/用户名/mysql/docker-compose.yml

version: '3.9'
services:
mysql:
    image: mysql:latest
    volumes:
    - ./config/my.cnf:/etc/mysql/my.cnf
    - ./mysql-data:/var/lib/mysql
    environment:
    - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
    - MYSQL_USER=${MYSQL_USER}
    - MYSQL_PASSWORD=${MYSQL_PASSWORD}
    ports:
    - "3334:3306"
    restart: always

nano/主页/用户名/mysql/. env

MYSQL_ROOT_PASSWORD=12345
MYSQL_USER=admin
MYSQL_PASSWORD=12345

cd/home/用户名/mysql
对接合成
问题已经解决了

相关问题