mysql - 查找具有公共字段的行的最快方法

时间:2014-03-24 15:09:21

标签: mysql sql

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

我希望找到最快的方法来计算col2等于col2col1列{(1}}等于给定值的所有行。

例如,考虑一下您要查找名字与姓氏相同姓氏的所有人姓名的情况' John'

3 个答案:

答案 0 :(得分:3)

SELECT
t.*
FROM table t
JOIN table t2 ON t2.col2 = t.col2
WHERE t2.col1 = 'some value'

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

答案 1 :(得分:2)

基本上你需要这个查询:

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

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

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

答案 2 :(得分:0)

在SQL中,当你只是写下你想要的东西时,它通常是最快的。你想要tablex中所有记录,其中col2在某个集合中。这个集合都是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而且不必打扰你。 (虽然很高兴知道你可以通过自联接,存在子句以及其他方式实现相同的目标。)