gpt4 book ai didi

带有 IN 子句的 SQL 查询的 MYSQL 查询优化

转载 作者:行者123 更新时间:2023-11-30 22:20:09 25 4
gpt4 key购买 nike

我有以下 SQL 查询,我正在根据用户输入动态构建这些查询。只要 IN 参数小于 50,查询就会执行得相当好。但是,一旦 IN 列表增长,查询响应时间就会显着降低。

我曾尝试将查询拆分为多个具有小输入的查询并并行触发所有查询。这无疑为我提供了更好的性能

但是我想避免拆分查询,想知道是否有任何其他(更好的)方法可以进一步优化此查询(我在想是否可以通过创建临时表来使用连接)

[请注意 col1 和 col2 已经是一个索引]

SELECT a.col3, b.col5, b.col4, ...
FROM A a
JOIN B b ON a.apk = b.afk AND a.bfk = b.bpk
WHERE a.col1 IN (1, 2, 3, ...)
AND a.col2 IN ('abc', 'pqr', ...)
AND a.flag = 1

最佳答案

MySQL 在处理带有常量的 IN 查询方面做得很好。与许多其他数据库不同,它实际上对输入进行排序并使用二叉​​树进行搜索。所以,我的猜测是数据量是问题而不是 IN 本身。并行线程工作得更好这一事实说明了 MySQL 不会将所有可用资源用于单个查询。

你可以试试索引。对于这个查询:

SELECT a.col3, b.col5, b.col4, ...
FROM A a JOIN
B b
ON a.apk = b.afk AND a.bfk = b.bpk
WHERE a.col1 IN (1, 2, 3, ...) AND
a.col2 IN ('abc', 'pqr', ...) AND
a.flag = 1 ;

您需要在 b(fk, bpk)a(flag, col1, col2)a(flag, col2, col1)。多列索引可以帮助 IN,但只针对其中一列,因此更具选择性的应该是索引中的第二列。

关于带有 IN 子句的 SQL 查询的 MYSQL 查询优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36862107/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com