考虑一个只有两个列的表,如col1
和col2
。mysql - 查找具有共同字段的行的最快方法
我想找到最快的方法来计算所有的行col2
等于col2
列col1
行等于给定的值。
例如,考虑的情况下,要找到所有有一个人的名字是“约翰”
考虑一个只有两个列的表,如col1
和col2
。mysql - 查找具有共同字段的行的最快方法
我想找到最快的方法来计算所有的行col2
等于col2
列col1
行等于给定的值。
例如,考虑的情况下,要找到所有有一个人的名字是“约翰”
SELECT
t.*
FROM table t
JOIN table t2 ON t2.col2 = t.col2
WHERE t2.col1 = 'some value'
您需要在两列上都有索引才能获得良好的性能。
+1:尽管在这里写了另一个答案,但这并不使用20年前的语法,而现在在大多数RDBMS中都已弃用。 *(为什么人们觉得使用显式连接非常困难?)* – MatBailie
基本上你需要这个查询的同姓的人的名字:
select
t1.col1
from
table t1,
table t2
where
t2.col1='John' and
t1.col2=t2.col2
如果向col1,col2字段添加索引,它应该足够快。
如果您想生成大量数据的输出表,那么可能临时创建表将是最快的。
这个查询完全按照@Vatev提出的查询执行,所以我也提出了你的答案。我选择他是因为明确加入 – marcosh
在SQL中,它通常是最快的,当你只是写你想要的。你需要来自table2的所有记录,其中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,不必打扰你。 (虽然很高兴知道你可以通过自连接,存在子句和其他方式实现同样的效果)。
所以要澄清,鉴于“约翰史密斯”,你会想找到“简史密斯“,”比尔史密斯“和”朱迪史密斯“以及? –
@MichaelBerkowski是的,正好在MySQL 5.5.35中的 – marcosh