【问题标题】:Issue met in doing a simple SQL query through PhpMyAdmin通过 PhpMyAdmin 进行简单的 SQL 查询时遇到的问题
【发布时间】:2011-06-27 15:35:18
【问题描述】:

我通过 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。提前感谢所有帮助。

【问题讨论】:

    标签: mysql sql database phpmyadmin


    【解决方案1】:

    这个:

    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 上放置一个索引。
    完成后,它应该立即运行。

    损坏的表
    您的表也有可能已损坏;尤其是如果您使用的是 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/

    【讨论】:

    • 感谢索引部分。实际上我从使用 LEFT_JOIN 切换到 NOT IN,似乎更快。
    • @Robert: select x from y where x not in (select ...) 在 95% 的情况下要慢得多。在您的情况下它只会更快,因为表之间几乎没有不匹配,因此not in 列表很小。如果not in 列表变大,它会迅速变得比left join ... where x is null 慢得多
    猜你喜欢
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    • 2013-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多