2010-07-21 52 views
2

我有两个表(MYISAM)MySQL的加入是很慢

create table A (email varchar(50)); 
create table B(email varchar(50) key 'email' (email)); 

表A具有130K记录 表B已经20K记录

为什么这条SQL语句花费很长的时间(超过两个分钟,然后我按Ctrl + C中止查询) 语句是:

select count(*) from user A, tmp B where A.email=B.email; 

由于

+0

哪个版本?哪个引擎?是的,索引A.email会更好... – pascal 2010-07-21 15:05:59

+0

为什么你要做一个多选择而不是左连接? 我想我错过了这里的意思... 你可以做一个“描述”两​​个表并发布结果? 查询中的“解释”也有帮助。 – Andreas 2010-07-21 15:37:50

回答

2

我猜猜查询优化器没有什么可继续。为什么不尝试在电子邮件列上定义索引。

+0

表A是另一个项目,我不允许做任何改变:( 然而这是我在解释 | ID | select_type |表| type | possible_keys |键| key_len | ref | rows | filtered | Extra | | 1 | SIMPLE | B |索引| NULL |电子邮件| 53 | NULL | 21401 | 100.00 |使用索引| | 1 | SIMPLE | A | ALL | NULL | NULL | NULL | 136437 | 100.00 |使用where;使用连接缓冲区| – Alaa 2010-07-21 15:03:27

+4

如果您不在A.email上添加索引,数据库引擎将始终在运行此查询时执行全表扫描。如果您不允许使用此查询,则无法对其执行任何操作添加索引。 – a1ex07 2010-07-21 15:12:06

0

通常,连接字符串比连接像int这样的较短数据类型要昂贵。

您可以通过确保两个电子邮件列都已建立索引来加速此查询。

0

如果表A有一个int ID字段,那么表B应该存储该ID而不是再次存储电子邮件字符串。这会减少数据库的大小,并且与索引一起提供比字符串所能提供的更快的查询速度。