我有两张桌子(一张有 33k 行,另一张有 7k 行)。我想比较这两个表并删除两个 id 不匹配的行。但是当我发送查询时,它会冻结 phpmyadmin。桌子会不会太大?
SELECT * FROM likes LEFT OUTER JOIN uploads on likes.upload_id = uploads.upload_id WHERE uploads.upload_id IS NULL
我知道数据库旨在处理数百万个数据,所以我不确定错误在哪里。
最好的问候, 马蒂亚斯
我有两张桌子(一张有 33k 行,另一张有 7k 行)。我想比较这两个表并删除两个 id 不匹配的行。但是当我发送查询时,它会冻结 phpmyadmin。桌子会不会太大?
SELECT * FROM likes LEFT OUTER JOIN uploads on likes.upload_id = uploads.upload_id WHERE uploads.upload_id IS NULL
我知道数据库旨在处理数百万个数据,所以我不确定错误在哪里。
最好的问候, 马蒂亚斯
我会做一个解释,这样你就可以看到 mysql 做了什么。这将很好地指示使用了多少行。
EXPLAIN SELECT * FROM likes LEFT OUTER JOIN uploads on likes.upload_id = uploads.upload_id WHERE uploads.upload_id IS NULL
您还可以使用另一个浏览器或另一个会话来使用 show processlist 来查看查询是如何执行的。
表可能不是太大,但如果脚本需要很长时间才能完成,PhpMyAdmin 的查询超时可能是一个问题。尝试更改超时或根本不使用 PhpMyAdmin。看看您是否能够使用服务器(或其他工具)上的命令行进行查询。
也可以看看:
冻结是否暗示它正在工作但从不更新/从不“完成”任务?
如果是这样,
我有过类似的事情,发现它们是由于一列上有多个索引,例如一列有一个 PRIMARY 索引和一个以该列命名的索引,所以检查你的索引
我有时会运行可能需要几个小时才能处理的大型导入“查询”。(我取消勾选“部分导入 -> 允许中断导入...”。)
phpMyAdmin 不会在我开始查询的浏览器中响应,即使我尝试重新加载页面,但是如果我使用(我假设)不同 IP 地址的另一台机器上的浏览器,phpMyAdmin 响应很好。
然后,在另一个浏览器上,我发出 SQL 命令SHOW FULL PROCESSLIST
来监视并在需要时终止那个长时间运行的查询。
您可以取消选中导入中的两个选项
1 - 如果脚本检测到它接近 PHP 超时限制,则允许中断导入。(这可能是导入大文件的好方法,但它可能会破坏事务。)
2-启用外键检查