mysql - Active Record Join 语句优化

标签 mysql sql activerecord orm redmine

我通过单击问题侧边栏上的摘要找到了此查询(由 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/

相关文章:

php - 如何在 SQL 中的代码点火器中应用 2 OR 和 1 AND 条件?

mysql - 优化这个包含多个子查询的查询

javascript - 如何让它在JavaScript中刷新而不影响HTML?

php - 尝试将双引号表单数据库打印到输入字段中

c# - 在相似数据库之间移动数据

activerecord - 如何从 Rails 的查询中排除 id 数组(使用 ActiveRecord)?

mysql - 如何将内存缓存与 SailsJS 模型一起使用?

sql - TSQL SELECT先前日期的记录

mysql - 1-多-多的数据库结构

sql - rails : Get related records having belonging to category having a particular enum attribute