2011-06-27 36 views
1

我通过PhpMyAdmin创建了一个数据库和两个表customer_full和customer_change。我成功地从两个文本文件中填充了两个表,customer_full现在包含12902行,而customer_change包含12947行,并且每行都有一个CUSTOMER_ID字段来标识每个客户。 customer_change表有一些customer_full没有的新成员,我想捕获它们。通过PhpMyAdmin进行简单SQL查询时遇到问题

现在的任务,我需要做的是很常见的,我需要,只有在customer_change表中存在,但在customer_full表中不存在的行,所以我写并执行以下查询:

SELECT * FROM customer_change 
LEFT JOIN customer_full ON customer_change.CUSTOMER_ID = customer_full.ID 
WHERE customer_full.ID IS NULL 

似乎我在PhpMyAdmin中提交查询后,它会一直停留在“等待http://localhost/phpmyadmin/import.php”,并最终变成超时错误。 但是,如果我运行像

SELECT * FROM customer_change,customer_full 

一些简单的查询,它会工作,并通过简单地从两个表中加入的每个记录并返回结果。所以我想知道是否有专家可以帮我调试,可能是我的查询有效率问题,或者我应该更多地检查PhpMyAdmin的配置吗?或者是否有其他可能的原因,我以前的查询失败?

请原谅,如果这很简单,因为我刚开始自学MySql。预先感谢所有的帮助。

回答

2

此:

SELECT * FROM customer_change,customer_full 

是一个跨加入它加入表customer_change每一行针对customer_full每一行。所以它返回12,902 x 12,947 = 167,042,194行。不知道为什么你会想要这个。

左侧加入你写看起来是正确的:

SELECT * FROM customer_change 
LEFT JOIN customer_full ON customer_change.CUSTOMER_ID = customer_full.ID 
WHERE customer_full.ID IS NULL 

缺少指数
为了使它快速运行,你需要穿上customer_change.CUSTOMER_ID指数和customer_full.ID的索引。
一旦你做完了,它应该立即运行。

损坏表
也有可能您的表损坏; ESP。如果你使用MyISAM。
尝试运行在这个环节中列出的步骤:
http://dev.mysql.com/doc/refman/5.0/en/corrupted-myisam-tables.html
或者此链接:http://www.thegeekstuff.com/2008/09/how-to-repair-corrupted-mysql-tables-using-myisamchk/

+0

感谢索引部。其实我从使用LEFT_JOIN切换到NOT IN,似乎更快。 – Kevin

+0

@Robert:'从x选择x,其中x不在(选择...)'的95%时间要慢得多。它只是在你的情况下更快,因为表之间几乎不匹配,所以'不在'列表中很小。如果“不在”列表变大,它将迅速比“左连接......其中x为空”慢得多 – Johan