代码之家  ›  专栏  ›  技术社区  ›  True Soft

使用Sub-Select进行MySQL查询选择花费的时间太长

  •  7
  • True Soft  · 技术社区  · 15 年前

    我在执行从两个表中选择时发现了一些奇怪的事情:

    SELECT * FROM table_1 WHERE id IN (
        SELECT id_element FROM table_2 WHERE column_2=3103);
    

    此查询大约花费了242秒。

    但当我执行子查询时

    SELECT id_element FROM table_2 WHERE column_2=3103
    

    不到0.002s(结果是2行)。
    然后,当我这样做的时候

    SELECT * FROM table_1 WHERE id IN (/* prev.result */)
    

    相同:0.002秒。

    我想知道为什么MySQL要做这样的第一个查询,这比前两个查询分别花费更多的时间?它是从子查询结果中选择某个内容的最佳解决方案吗?

    其他细节: table_1 大约有9000行,以及 table_2 有90000行。

    在我添加索引之后 column_2 表2 第一次查询用了0.15秒。

    3 回复  |  直到 15 年前
        1
  •  7
  •   Andomar    15 年前

    也许查询分析器会对每一行的子查询进行评估。

    尝试用内部联接替换子查询,并查看这是否提高了性能:

    SELECT     * 
    FROM       table_1 t1
    INNER JOIN table_2 t2
    ON         t1.id = t2.id_element
               AND t2.column_2 = 3103
    
        2
  •  2
  •   TMG    14 年前

    这是6版之前MySQL中的一个已知错误。

    我发现的解决方法是:

    从表1中选择* 身份证在哪里? 选择id_element from(选择id_element from table_2,其中column_2=3103)作为q)

        3
  •  0
  •   aviv    14 年前

    我也有同样的问题。 我为表添加了一个索引(可能您已经有了),并使用了use index指令。在您的情况下,应该是这样的:

    SELECT * FROM table_1 USE INDEX(id)
    WHERE id IN (SELECT id_element FROM table_2 WHERE column_2=3103);
    

    对我来说,它使事情变得更好。