【问题标题】:Select joining X to Y is ten times faster than joining Y to X -- why is this?选择加入 X 到 Y 比加入 Y 到 X 快十倍——这是为什么呢?
【发布时间】:2011-04-10 23:40:13
【问题描述】:

我对 MySQL 了解不多,只是任何非 DBA 程序员都知道的:如何将数据输入和输出。

我的网站上有一个页面运行速度非常慢,而查询是瓶颈。这样做需要十秒钟:

    SELECT foo, bar, baz, bax
    FROM small_table
    LEFT JOIN
    large_table
    on small_table.id = large_table.thread_id

我没有任何索引,所以我索引了 id 列。现在需要六秒钟。

然后我做了一些阅读,尝试了ANALYZEEXPLAIN命令但并没有真正理解它们,然后只是为了实验,改变了表格:

    SELECT foo, bar, baz, bax
    FROM large_table <-- first
    LEFT JOIN
    small_table <-- second
    on small_table.id = large_table.thread_id

现在它花了 零点六 秒。

[该应用程序是一个论坛。 small_table 列出线程(100 条记录),而 large_table 包含在这些线程上发布的帖子(20,000 条记录)。]

我当然可以继续试验,但有些问题:

  • 我发现了什么原理?
  • 一般来说,当我选择缓慢时,最好的方法是什么?
  • 在上面的例子中,我的SELECT 和以前一样吗?它产生完全相同的结果。
  • 我应该从ANALYZEEXPLAIN 那里学到什么?

【问题讨论】:

    标签: mysql optimization join


    【解决方案1】:

    我敢打赌,结果数据是不同的...除非您保留在 select all 中的列都在小表中。

    left join 保留第一个表中的每一行,并在存在匹配时添加第二个表中的行。

    在您的第一种情况下,第一个表是大表,因此您有很多行。

    在第二种情况下,第一个表很小,因此行数更少,因此查询速度更快。

    【讨论】:

    • 您能否明确说明“第一”表是什么?文件顺序中的第一个?因为我说使用 big_table JOIN small_table 查询运行得更快,而您似乎建议它应该是相反的方式。 [顺便说一句,由于我遗漏的查询的其他部分的原因,我认为数据将是相同的。]
    猜你喜欢
    • 1970-01-01
    • 2020-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多