【问题标题】:MySQL Query Select using sub-select takes too longMySQL Query Select 使用子选择需要太长时间
【发布时间】:2009-11-08 14:15:31
【问题描述】:

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

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.002 秒(结果为 2 行)。
然后,当我这样做时

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

都是一样的:0.002s。

我想知道为什么 MySQL 会像这样执行第一个查询,比单独的最后两个查询花费更多的时间?根据子查询的结果进行选择是否是最佳解决方案?

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

在我从table_2column_2 上添加索引后,第一个查询耗时 0.15 秒。

【问题讨论】:

  • 内部选择给出多少个结果?
  • 能否发布运行EXPLAIN SELECT * FROM table_1 WHERE id IN (SELECT id_element FROM table_2 WHERE column_2=3103) 的结果。这将显示 MySQL 正在使用的查询计划和索引。
  • @Dani 帖子指出内部查询返回 2 行。
  • 抱歉,错过了。在那种情况下,它根本没有意义。查询 9000 行的 2 个值不应花费 242 秒...
  • 为什么不SELECT * FROM table_1 WHERE id = (SELECT id_element FROM table_2 WHERE column_2 = 3103);

标签: mysql optimization select


【解决方案1】:

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

尝试用 INNER JOIN 替换子查询,看看这是否会提高性能:

SELECT     * 
FROM       table_1 t1
INNER JOIN table_2 t2
ON         t1.id = t2.id_element
           AND t2.column_2 = 3103

【讨论】:

    【解决方案2】:

    这是 mysql 版本 6 之前的一个已知错误。

    我发现的解决方法是:

    SELECT * FROM table_1 身份在哪里( SELECT id_element FROM (SELECT id_element FROM table_2 WHERE column_2=3103) as q)

    【讨论】:

    • 能否请您添加错误详细信息的链接?
    • 这个解决方法在我的特定查询上节省了一些时间(从 50 秒缩短到 10 秒,但两个单独的查询仍然以 0.7 秒的组合获胜
    【解决方案3】:

    我也有同样的问题。 我为表添加了一个索引(猜你已经有了)并使用了 USE INDEX 指令。在您的情况下,它应该如下所示:

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

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

    【讨论】:

    • 你的id字段不是自增吗? MySQL 应该知道使用它而不指定它。
    猜你喜欢
    • 1970-01-01
    • 2016-11-24
    • 2010-12-10
    • 2012-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-23
    • 1970-01-01
    相关资源
    最近更新 更多