我有一个SQL查询,需要很长时间才能在MySQL上运行(这需要几分钟的时间)。该查询是针对一个拥有超过1亿行的表运行的,所以我并不惊讶它的速度很慢。理论上讲,应该可以加快速度,因为我真的只想从大表中取回行(我们称之为A),它在另一个表B中有引用。如何加快MySQL 4.1上的这个SQL查询?
所以我的查询是:
SELECT id FROM A, B where A.ref = B.ref;
(A有超过1亿行; B有只有几千)。
我已经添加索引:
alter table A add index(ref);
alter table B add index(ref);
但它仍然很慢(几分钟 - 我很高兴与一分钟)。
不幸的是,我被困在MySQL 4.1.22,所以我不能使用视图。
我宁愿不将所有相关行从A复制到一个单独的较小的表中,因为我需要的行会不时更改。另一方面,目前这是我能想到的唯一解决方案。
欢迎任何建议!
编辑:下面是运行EXPLAIN我查询的输出:
+----+-------------+------------------------+------+------------------------------------------+-------------------------+---------+------------------------------------------------+-------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------------------+------+------------------------------------------+-------------------------+---------+------------------------------------------------+-------+-------------+
| 1 | SIMPLE | B | ALL | B_ref,ref | NULL | NULL | NULL | 16718 | Using where |
| 1 | SIMPLE | A | ref | A_REF,ref | A_ref | 4 | DATABASE.B.ref | 5655 | |
+----+-------------+------------------------+------+------------------------------------------+-------------------------+---------+------------------------------------------------+-------+-------------+
(在redacting我原来的查询示例,我选择使用“参考”我的列名,而这恰好是一样的该类型中的一种,但我希望这不是太混乱...)
你可以给我们输出EXPLAIN SELECT吗? –
Greg
2009-01-14 13:21:04
另外,尝试在两个表上运行OPTIMIZE – Greg 2009-01-14 13:29:58
OK - 我现在正在运行OPTIMIZE。稍后将添加EXPLAIN SELECT输出。 – Ben 2009-01-14 13:40:17