2009-01-14 66 views
0

我有一个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我原来的查询示例,我选择使用“参考”我的列名,而这恰好是一样的该类型中的一种,但我希望这不是太混乱...)

+0

你可以给我们输出EXPLAIN SELECT 吗? – Greg 2009-01-14 13:21:04

+0

另外,尝试在两个表上运行OPTIMIZE – Greg 2009-01-14 13:29:58

+0

OK - 我现在正在运行OPTIMIZE。稍后将添加EXPLAIN SELECT输出。 – Ben 2009-01-14 13:40:17

回答

2

查询优化器可能已经做了最好的,它可以,但万一,它的读取巨人表(A)首先,你可以明确告诉它首先读取B使用在STRAIGHT_JOIN语法:

SELECT STRAIGHT_JOIN id FROM B, A where B.ref = A.ref; 
1

从答案,好像你正在做的最有效的事情,你可以用SQL。 A表似乎是一个大问题,那么如何将它分成三个单独的表,有点像本地版本的分片?或者,假设B没有太多列,是否值得将B表格非规范化到A表格中?

最后,你可能只需要购买一个更快的盒子来运行它 - 这是无可替代的马力!

祝你好运。