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

Mysql 从多个表中选择列并连接到非常大的表,mysql,Mysql,我试图使用一个select语句获取一个报表,该语句连接到多个表并统计一个项目的出现次数 问题是我要加入的表可能包含数据,也可能不包含数据,而我要加入的表有一个大的数据集 我的问题的一个简化示例是: item ----------------- | id | name | ----------------- | 1 | item 1 | | 2 | item 2 | | 3 | item 3 | | 4 | item 4 | | 5 | item 5 | |

我试图使用一个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 |
------------------------

你能指定你在哪些列上有什么索引吗?我可能会先在查询中使用“explain”,看看是否有明显的错误。200万行不是一个太大的数据集&不应该有太多问题。可能是一些简单的东西,比如缺少索引等。这里有解释文档:我在所有id列上都有一个主键索引。我在item_id列上还有一个索引和外键。