其他桌子上的Fullscan LEFT JOIN

时间:2011-02-21 08:39:47

标签: mysql performance

我有2个数据库表Companies(使用InnoDB引擎)和Company_financial_figures(使用MyISAM引擎)。表Companies有大约300 000条记录,Company_financial_figures有60万条记录。表Company_financial_figures也有表LEFT JOIN中使用的标志。

查询的想法是选择公司的所有实际余额(有一种情况,当时公司没有该公司的余额数据,但无论如何必须选择它,所以我必须使用LEFT JOIN)。在我看来,它必须从Company_financial_figures表中选择大约300k记录,但不能进行全表扫描,如600k记录。此查询的性能非常慢。

查询是这样的:

SELECT DISTINCT comp.id, comp.name, comp.surname, cff.balance FROM companies comp LEFT JOIN company_financial_figures cff ON (cff.company_id = comp.id AND cff.actual = 1)

+----+-------------+-------------------+-------+---------------+----------+---------+------+--------+-------------+
| id | select_type | table             | type  | possible_keys | key      | key_len | ref  | rows   | Extra       |
+----+-------------+-------------------+-------+---------------+----------+---------+------+--------+-------------+
|  1 | SIMPLE      | companies         | index | NULL          | comp_i_i | 2       | NULL | 346908 | Using index |
|  1 | SIMPLE      | company_finan..   | ALL   | NULL          | NULL     | NULL    | NULL | 610364 |             |
+----+-------------+-------------------+-------+---------------+----------+---------+------+--------+-------------+

我在company_id列上有索引,但它没有帮助。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

为什么需要DISTINCT关键字? DISTINCT总是会降低您的查询速度,因为必须明确考虑每个记录才能进行DISTINCT比较。我不知道MySQL如何详细处理这个问题,但是在Oracle中,如果你的DISTINCT字段之一可以为空,你就会得到可怕的执行计划。

但你不应该需要它,你的记录可能是截然不同的,因为你选择comp.id(我猜?)当你删除DISTINCT时,它会不会更快?