在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 误?
8条答案
按热度按时间mfuanj7w1#
只需运行mysql查询
设置为永久
编辑以下文件并添加
yk9xbfzb2#
有一个未解决的issue with MySQL问题,它在尝试对一个包含json列的表进行排序时导致了这个错误。看起来它影响了MySQL〉= 8.0.18。截至我在这里的回复,团队仍在考虑这是否是一个bug。如果你受到了这个问题的影响,请提供反馈。
虽然增加缓冲区大小 * 可以 * 是这里的一个解决方案,但我认为这真的不应该是必要的,因为即使是在具有json列的表上按数字主键排序也会导致这个问题。
根据我的经验,调整缓冲区大小并不可靠,因为缓冲区大小与json列中内容的长度有关,所以虽然它可以解决当前的问题,但如果数据集增长,它需要再次调整。
ffvjumwh3#
您可能需要在
/etc/mysql/my.cnf
中增加mysql的缓冲区大小,类似于:2vuwiymt4#
如果您使用的是docker mysql容器,请在docker-compose.yml中添加以下设置:
vql8enpb5#
因此,答案几乎是永远不要增加缓冲区大小(并且通常要避免触及MySQL中的默认设置),而是要检查查询的质量和/或向您正在对其运行频繁查询的列添加索引!!!
语法:
文件:https://dev.mysql.com/doc/refman/8.0/en/create-index.html
qlzsbp2j6#
在我的例子中,在不增加排序缓冲区大小的情况下,实际上有帮助的是为我排序的字段创建索引。我不确定在连接表时是否有效,但在尝试对非常大的单个表排序时有效。
kmb7vmvb7#
看起来选择包含大量json数据的列可能会导致此错误。我有一个包含html页面的json列,并通过从select语句中删除它来修复此错误。
p5cysglq8#
我的laravel应用程序也遇到了同样的问题,mysql正在docker中运行。
我已创建文件夹
mkdir/主页/用户/mysql
mkdir/主页/用户/mysql/配置
mkdir/主页/用户/mysql/mysql-data
用户名/用户名/mysql/配置/我的配置文件
首页/用户名/mysql/docker-compose.yml
nano/主页/用户名/mysql/. env
cd/home/用户名/mysql
对接合成
问题已经解决了