gpt4 book ai didi

mysql - Active Record Join 语句优化

转载 作者:行者123 更新时间:2023-11-29 09:34:47 24 4
gpt4 key购买 nike

我通过单击问题侧边栏上的摘要找到了此查询(由 Redmine 3.4 和 Rails 4.2.5.1 - Active Record 生成),消耗 100% CPU 超过 3 小时...

在 mysql 上运行 SHOW FULL PROCESSLIST 后,我得到了这个:

SELECT COUNT(*) FROM `custom_values` INNER JOIN issues 
ON issues.id = custom_values.customized_id INNER JOIN issue_statuses
ON issues.status_id=issue_statuses.id WHERE `custom_values`.`custom_field_id`
= 16 AND ((issues.id=29951 OR issues.id=29950 OR ........................

现在有 29940 个 OR!!! 剩下的 SQL 查询

.............OR issues.id=6)) AND `custom_values`.`value` = 'Some Value' 
AND `issue_statuses`.`is_closed` = 1

我想知道是否有一种方法可以优化上述查询,以便我可以建议改进引起此问题的Redmine或Active Record。

最佳答案

使用IN怎么样?

SELECT COUNT(*) FROM `custom_values` INNER JOIN issues 
ON issues.id = custom_values.customized_id INNER JOIN issue_statuses
ON issues.status_id=issue_statuses.id WHERE `custom_values`.`custom_field_id`
= 16 AND ((issues.id in (29951, 29950, 29440,.. ........................

SELECT COUNT(*) FROM `custom_values` INNER JOIN issues 
ON issues.id = custom_values.customized_id INNER JOIN issue_statuses
ON issues.status_id=issue_statuses.id WHERE `custom_values`.`custom_field_id`
= 16 AND ((issues.id between 29951 and 29940...

通过使用 cte。

with cte as (
select 29940 as ct, 0 as cnt
union all
select cte.ct + 1, 1 as cnt
from `custom_values`
inner join issues ON issues.id = custom_values.customized_id
inner join issue_statuses ON issues.status_id=issue_statuses.id
cte on cte.ct = t.order_sp
where cte.ct <= 29951 and `custom_values`.`custom_field_id` and issues.id = cte.ct
)select sum(cnt) from cte;

关于mysql - Active Record Join 语句优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57864978/

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