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