mysql - 选择将 X 连接到 Y 比将 Y 连接到 X 快十倍——这是为什么?

标签 mysql optimization join

我对 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 中学到什么?

最佳答案

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

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

在你的第一种情况下,第一个表是大表,所以你有很多行。

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

关于mysql - 选择将 X 连接到 Y 比将 Y 连接到 X 快十倍——这是为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5615480/

相关文章:

MySQL:使用 LOAD DATA 时将数据压缩在一列中

mysql - 在 mySQL/Mongo 或 Postgres 中存储 JSON 元数据

algorithm - 图问题松弛二分维简例的快速逼近

java - ConcurrentHashMap 作为缓存性能

mysql - 预览 MySQL 连接的快速方法是什么?

mysql - Latex 不显示来自 mysql 查询的回车符

mysql - Mysql中如何更改列数据类型而不丢失数据

java - JVM/编译器优化对象未使用的属性

c++ - 虚拟机软件优化

带有NULL列的SQL联接