微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

MariaDB 在使用大 WHERE IN 时崩溃

如何解决MariaDB 在使用大 WHERE IN 时崩溃

我有一个旧项目,我正在尝试将其升级到较新版本的 sql。它目前正在运行 MysqL 5.5 并且运行良好。我已将一些测试数据迁移到 MariaDB 10.5.9,但是当我尝试运行查询(在 MysqL 5.5 上运行良好)时,MariaDB 崩溃了。

查询相当大,并且广泛使用 WHERE IN。目前我无法重构查询,所以我试图找出导致崩溃的原因。

它有 3 个 WHERE IN。第一个是 24 个项目,第二个是 696 个,第三个是 2 个。如果我只从第一个或第二个 WHERE IN 中删除一个项目,它会立即返回数据。 answers 表是 MyISAM

我遇到的错误

sql Error [08S01]: Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.

查询

SELECT
    deFinition_id,answer AS value
FROM
    answers
WHERE
    deFinition_id IN (...)
    AND respondent_id in (...)
    AND context IN (1,0)
LIMIT 50

我已经尝试将 max_allowed_packet 更改为更高的内容(在 5.5 中为 16MB),但遗憾的是它没有任何改变。

EXPLAIN sql_NO_CACHE 的结果(如果我删除了 WHERE IN 中的大量数据以避免崩溃)

id 选择类型 类型 possible_keys key_len 参考 额外
1 主要 全部 824 使用临时;使用文件排序
2 衍生 s1 范围 deFinition_respondent_context,respondent_id deFinition_respondent_context 12 824 使用索引条件;使用临时;使用文件排序
2 衍生 s2 eq_ref deFinition_respondent_context,respondent_id deFinition_respondent_context 12 const,database_name.s1.respondent_id,const 1

编辑:我设法通过在定义表上使用连接来使其工作

SELECT
    a.deFinition_id,a.answer AS value
FROM
    answers AS a
JOIN deFinitions AS d ON a.deFinition_id = d.id
WHERE
    d.id IN (...)
    AND a.respondent_id in (...)
    AND a.context IN (1,0)
LIMIT 50

解决方法

解决您的问题的一种方法是更改​​您的设计/方法,使您没有包含 500-1000 项的 WHERE IN (...) 子句。一方面,您是否会让某个应用程序将如此多的参数传递回您的数据库实例是值得怀疑的。因此,假设这些数据不是来自外部,那么应该可以将其保存在单独的表中。假设您有两个表,那么您的查询可能会变成:

SELECT a.definition_id,a.answer AS value
FROM answers a
INNER JOIN definitions d
    ON d.id = a.definition_id
INNER JOIN respondents r
    ON r.id = a.respondent_id
WHERE
    context IN (1,0)
-- ORDER BY <something>
LIMIT 50;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?