【问题标题】:Accessing MySQL tables with over 10 million rows = Error: too many connection访问超过 1000 万行的 MySQL 表 = 错误:连接过多
【发布时间】: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 服务器。但是如果我们对两个包含几千行的表运行相同的进程,它不会遇到这个问题,但仍然需要一些时间。

为什么会发生这种情况,我们如何才能避免这种情况,同时完全优化这个过程。

【问题讨论】:

    标签: mysql mysql-management


    【解决方案1】:

    两件事 - 检查您的软件如何处理 MySQL 连接。貌似打开了一个持久连接,然后不重用,每次查询前都有一个新的连接。

    第二 - 您可以修改查询以在一个语句中完成,而不是对每个用户运行单独的查询。这样只需要一个连接,所有的处理都在 MySQL 端,这将能够进一步优化它。

    编辑:您可以检查的另一件事是在查询上运行 EXPLAIN 以确保您已设置所有正确的索引(如果选择部分现在运行缓慢)。

    【讨论】:

    • 它没有使用持久连接。让我感到困惑的是,在 MySQL 的进程列表中,在我上面发布的主要 SQL 查询之后有很多 SELECT 查询。此选择查询正在选择来宾表中的 ID。 LEFT JOIN 或任何 JOIN 语句是否执行子选择查询? LEFT JOIN 是否可能导致“连接过多”错误?
    • @officeboi - 不,这是不可能的。您为此使用什么软件/语言/库?可能是您的库正在通过单独的选择检索其他信息...并且可能是同一个库导致了额外的连接...
    【解决方案2】:

    警告:在对实时数据运行之前测试此查询。我不对任何数据丢失负责

    DELETE 
      u
    FROM
      users AS u 
    LEFT JOIN
      guests AS g 
    ON g.id = u.id
    WHERE 
      g.id IS NULL 
      AND (users.in >= '$before' AND users.in <= '$now')
    

    至于您的问题的核心(连接太多),我怀疑您的 PHP 脚本正在循环中启动新连接,以获取要删除的 ID。

    【讨论】:

    • 我制作了一个简单的 PHP 测试脚本,只是为了获取 user 表中不存在于 guest 表中的 ID。这是正常的 - 使用正常连接(非持久性)连接,然后使用上面的 SQL 查询进行选择,然后断开连接并使用 PHP 输出结果。我仍然遇到同样的问题,它给了我“连接太多”错误。我什至将结果限制为 2500,它仍然是一样的。在脚本运行时,也没有人可以访问 MySQL 数据库。 JOIN 语句是否可能正在执行子选择导致过多的连接错误?
    • 没有。一个查询在一个连接中运行。它不会为子查询等创建额外的连接。
    猜你喜欢
    • 1970-01-01
    • 2021-10-11
    • 1970-01-01
    • 2012-12-29
    • 1970-01-01
    • 2020-09-03
    • 2019-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多