【问题标题】:mysql - fastest way to find rows having common fieldmysql - 查找具有公共字段的行的最快方法
【发布时间】:2014-03-24 15:09:21
【问题描述】:

考虑一个只有两列的表,例如 col1col2

我想找到最快的方法来计算所有具有col2 等于col2 列的行的col1 等于给定值的列。

例如,考虑这样一种情况,您要查找与一个名为“John”的人具有相同姓氏的所有人的姓名

【问题讨论】:

  • 所以澄清一下,给定“John Smith”,您是否也想找到“Jane Smith”、“Bill Smith”和“Judy Smith”?
  • @MichaelBerkowski 是的,完全正确

标签: mysql sql


【解决方案1】:
SELECT
t.*
FROM table t
JOIN table t2 ON t2.col2 = t.col2
WHERE t2.col1 = 'some value'

您需要在两列上都有索引才能获得良好的性能。

【讨论】:

  • +1 :虽然是在此处的另一个答案之后编写的,但这并不使用 20 年前的语法,现在在大多数 RDBMS 中已弃用。 (为什么人们发现使用显式连接如此困难?)
【解决方案2】:

基本上你需要这个查询:

select
  t1.col1
from
  table t1,
  table t2
where
  t2.col1='John' and
  t1.col2=t2.col2

如果你为 col1, col2 字段添加索引,它应该足够快。

如果您想为大量数据生成输出表,那么临时创建表可能是最快的。

【讨论】:

  • 在 mysql 5.5.35 中,此查询的执行与@Vatev 提出的查询完全相同,因此我也赞成您的回答。我选择他是因为明确加入
【解决方案3】:

在 SQL 中,它通常是最快的,只要你写你想要的。您想要 col2 在某个集合中的 tablex 中的所有记录。这个集合全是 col2,其中 col1 是 'John'。

select * from tablex
where col2 in (select col2 from tablex where col1 = 'John');

col1 上的索引将帮助您快速找到 John。 col2 上的索引将帮助您找到其他索引。

有很多方法可以选择您想要的数据。现代 dbms 会查看您的查询并找到选择数据的最佳方式。因此,可能是您重新编写查询,但 dbms 注意到它实际上是相同的查询并使用相同的执行计划。

所以您的首要目标应该是:使查询可读。这是您要做的两件事:查找 John(内部查询),查找其他人(外部查询)。因此,您不加入表,因为您只想查看 tablex 中具有某些姓氏的记录。在内部,dbms 很可能决定将 tablex 与其自身连接,然后进行过滤。但这取决于 dbms,不必打扰您。 (虽然很高兴知道您可以通过自联接、exists 子句以及其他方式实现相同的目的。)

【讨论】:

  • 不幸的是,MySQL 在优化子查询方面可能非常愚蠢。它在 5.6.14 上运行良好,但是当我在 5.5.35 上尝试它时,它变成了一个依赖子查询。
  • 我也在 5.5.35 中尝试过,并且对于一个有 581262 行的表,查询爆炸了......
  • 这听起来很可怕。似乎我很幸运不必使用 MySQL。我很抱歉给了一个不好的建议。我不知道,一个 dbms 会发现很难处理这么简单的查询。
猜你喜欢
  • 2011-09-25
  • 1970-01-01
  • 1970-01-01
  • 2018-07-26
  • 2011-02-14
  • 2020-10-24
  • 1970-01-01
  • 2011-07-10
  • 2020-07-31
相关资源
最近更新 更多