在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')
;
如果我省略了分组,它运行得很好。 如果我用较少的元素添加select和group,它也运行正常但是我在我的twig模板中启动了更多的子查询。
如何优化此查询以避免错误或通过分配更多内存(理想情况下仅用于此查询)来消除错误?
答案 0 :(得分:9)
当尝试对具有 json 列的表进行排序时,有一个未完成的 issue with MySQL 会导致此错误。看起来它影响 MySQL >= 8.0.18。截至我在这里回复时,团队仍在考虑这是否是一个错误。如果您受到此影响,请提供对该线程的反馈。
虽然增加缓冲区大小可以在这里是一个解决方案,但 IMO 确实没有必要这样做,因为即使按具有 json 列的表上的数字主键进行排序也会导致此问题。< /p>
根据我的经验,调整缓冲区大小不是很可靠,因为缓冲区大小是相对于 json 列中内容的长度而言的,因此虽然它可以解决眼前的问题,但如果您的数据集增长,它会需要再次调整。
答案 1 :(得分:6)
您可能需要在/etc/mysql/my.cnf
中设置
sort_buffer_size to 256K
答案 2 :(得分:4)
只需运行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
答案 3 :(得分:4)
所以答案几乎从不增加缓冲区大小(并避免一般情况下触及 MySQL 中的默认设置),而是检查查询的质量和/或向您的列添加索引正在针对 !!!
运行频繁的查询语法:
CREATE INDEX [index name] ON [table name]([column name]);
文档: https://dev.mysql.com/doc/refman/8.0/en/create-index.html
答案 4 :(得分:2)
对于我来说,在不增加排序缓冲区大小的情况下真正有用的方法是为要订购的字段创建索引。我不确定在连接表时是否可以使用,但是在尝试订购非常大的单个表时是否可以使用。
答案 5 :(得分:1)
如果您使用的是docker mysql容器,请在docker-compose.yml中添加以下设置:
db:
image: mysql:8
command: --sort_buffer_size=512K