我有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列上有索引,但它没有帮助。
有什么建议吗?
答案 0 :(得分:0)
为什么需要DISTINCT
关键字? DISTINCT
总是会降低您的查询速度,因为必须明确考虑每个记录才能进行DISTINCT
比较。我不知道MySQL如何详细处理这个问题,但是在Oracle中,如果你的DISTINCT
字段之一可以为空,你就会得到可怕的执行计划。
但你不应该需要它,你的记录可能是截然不同的,因为你选择comp.id
(我猜?)当你删除DISTINCT
时,它会不会更快?