【发布时间】:2011-03-13 15:08:35
【问题描述】:
如何优化这个 MySQL 查询,它访问两个表,每个表都超过 1000 万行?
下面的查询所做的是,它从 'users' 表中获取 'guests' 表中不存在的所有 id。结果将返回数十万行,因此我们将其限制为每次运行至少获得 5000 个 id。有没有更好的方法来运行它,这样我们每次运行就可以完成更多工作。
$before = date here before in time;
$now = date now;
$query="SELECT users.id
FROM users
LEFT JOIN guests ON guests.id = users.id
WHERE guests.id IS NULL AND (users.in >= '$before' AND users.in <= '$now')
LIMIT 0,5000";
在我们知道哪些 ID 不存在于 guest 表中之后,我们必须删除 users 表中的那些行。所以这意味着它将运行另外 5000 个删除查询来删除所有这些 ID。
如果我们对包含超过 1000 万行数据的两个表运行此过程,我们的服务器将返回一个错误,即它有太多的连接,并且在您重新启动之前无法访问 MySQL 服务器。但是如果我们对两个包含几千行的表运行相同的进程,它不会遇到这个问题,但仍然需要一些时间。
为什么会发生这种情况,我们如何才能避免这种情况,同时完全优化这个过程。
【问题讨论】: