【问题标题】:how many max join table at mysql? and how to count it?mysql有多少个最大连接表?以及如何计算它?
【发布时间】:2014-10-07 22:35:39
【问题描述】:

也许这个问题与this one 有关。 我有问题.. 我朋友说mysql对最大连接表有限制。 我明白了:

单个连接中可以引用的最大表数 是 61。这也适用于可 在视图的定义中引用。

这是真的吗? 然后,例如: 我有选择查询并加入 2 个表: left join a on b.id = a.b_id 那么,如何计算连接表的数量呢? 每桌?或每次加入? 那么,该查询标记为 1(每个连接)还是 2(每个表)? 61(最大限制)是每个表还是每个连接?

【问题讨论】:

  • 我认为引用非常具体:“tables 的最大数量”;所以你数桌子。如果您在查询中使用视图,则还必须计算联接中的联接表……但是,老实说……您会在单个查询中联接 61 个表吗?
  • 我已经编写了数百行的大量查询,但它们可能使用 25 个不同的表。顺便说一句,这在 Oracle 中是非常特殊的,因为此类查询通常难以维护,尤其难以测试和调试。 MySQL 在性能方面开始放弃大约十几个表。我不知道为什么有人会在 MySQL 的一个查询中使用 61 个(如果您认为限制是关于连接的,则为 62 个)表,我当然不想成为优化它的人。 :)
  • 你知道它很容易测试吗? sqlfiddle.com/#!2/043dd/8 再添加一个连接,MySQL 就会蓬勃发展。

标签: mysql sql join


【解决方案1】:

文字很清楚:“表的最大数量 [...] 是 61”。后跟“这也适用于视图中的表数”。

【讨论】:

    【解决方案2】:

    MySQL 的连接限制为 61 个表。

    如果您使用生成的 sql 和大量嵌套视图,则很容易达到 61 个表的限制。

    经过一番测试,我发现了这一点

    • 如果表在联接之外,则不计入视图不计入 作为表格,除非他们不从任何表格中选择,例如: CREATE VIEW v_now AS SELECT NOW() AS now

    • 两次加入同一张桌子将被视为两张桌子

    • where 子句 WHERE EXISTS 中的表不计算在内

    假设我们有这个设置

    CREATE TABLE test (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY);
    CREATE VIEW v_now AS SELECT NOW() AS now;
    CREATE VIEW v_test AS SELECT t.id FROM test t LEFT JOIN test t2 ON t2.id!=t.id AND t2.id > t.id WHERE t2.id IS NULL;
    

    这个选择

    SELECT t.id, (SELECT 1 FROM test WHERE id=1) AS one FROM test t 
    JOIN v_test vt ON t.id = vt.id 
    JOIN v_test vt2 ON t.id = vt2.id 
    JOIN test t3 ON t3.id = t.id
    JOIN v_now now
    WHERE EXISTS (SELECT 1 FROM test)
    

    那么就这样算

    SELECT t.id, (SELECT 1 FROM test WHERE id=1) AS one 
    FROM test t (+1)
    JOIN v_test vt ON t.id = vt.id (+2)
    JOIN v_test vt2 ON t.id = vt2.id (+2)
    JOIN test t3 ON t3.id = t.id (+1)
    JOIN v_now now (+1)
    WHERE EXISTS (SELECT 1 FROM test) (+0)
    
    test (+1)
    v_test (+0)
        test (+1)
        test (+1)
    v_test (+0)
        test (+1)
        test (+1)
    test (+1)
    v_now (+1)
    

    这样算7张桌子

    As mentioned in the comments

    SELECT id FROM tbl t
    JOIN (SELECT NOW() AS now)
    

    这将算作 2 个表。

    免责声明:我没有测试上面的代码,我测试的例子太复杂了,已经达到了 61 个连接表的限制。

    【讨论】:

    • 将 (SELECT NOW() AS now) 算作一张表吗?即使没有引用实际的表。
    • @PHPGuru 这是一个很好的问题,但遗憾的是我不知道,我会记下检查并在此处更新(可能需要一段时间),如果您在此之前找到答案,请在此处添加评论,我会更新答案。
    • 我确实找到了答案,是的,如果在联接中使用,它也算作一个表格。
    猜你喜欢
    • 2021-07-21
    • 1970-01-01
    • 1970-01-01
    • 2014-05-11
    • 2021-07-15
    • 2018-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多