我通过PhpMyAdmin创建了一个数据库和两个表customer_full和customer_change。我成功地从两个文本文件填充了两个表,customer_full现在包含12902行,而customer_change有12947行,每行有一个CUSTOMER_ID字段来标识每个客户。 customer_change表有一些customer_full没有的新成员,我想捕获它们。
现在我需要做的任务很常见,我需要获取仅存在于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。提前感谢所有的帮助。
答案 0 :(得分: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/