从多个表中选择列并连接到非常大的表

时间:2014-01-03 17:27:47

标签: mysql

我正在尝试使用单个select语句来获取报告,该语句连接到多个表并计算项目的出现次数。

问题是我加入的表可能包含也可能不包含数据,而我加入的表有大量数据集。

我的问题的简化示例是:

item
-----------------
| id |   name   |
-----------------
|  1 |  item 1  |
|  2 |  item 2  |
|  3 |  item 3  |
|  4 |  item 4  |
|  5 |  item 5  |
|  6 |  item 6  |
|  7 |  item 7  |
|  8 |  item 8  |
|  9 |  item 9  |
-----------------

opened
----------------
| id | item_id |
----------------
|  1 |      1  |
|  2 |      2  |
|  3 |      3  |
|  4 |      3  |
|  5 |      2  |
----------------

closed
----------------
| id | item_id |
----------------
|  1 |      2  |
|  2 |      2  |
|  3 |      5  |
|  4 |      8  |
|  5 |      8  |
----------------

以下两个陈述都很慢。这是因为我的项目数据集有超过200万条记录。

select i.id, count(o.id) opened, count(c.id) closed
from item i
left join opened o on i.id= o.item_id
left join closed c on i.id= c.item_id
group by i.id;

select i.id, count(o.id) opened, count(c.id) closed
from item i
left join opened o on i.id= o.item_id
left join closed c on i.id= c.item_id
where o.item_id is not null or c.item_id is not null
group by i.id;

有没有人对如何提高速度有任何想法。我要找的结果应该是:

------------------------
| id | opened | closed |
------------------------
|  1 |      1 |      0 |
|  2 |      2 |      2 |
|  3 |      2 |      0 |
|  5 |      0 |      1 |
|  8 |      0 |      2 |
------------------------

0 个答案:

没有答案