2014-03-24 46 views
0

考虑一个只有两个列的表,如col1col2mysql - 查找具有共同字段的行的最快方法

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

例如,考虑的情况下,要找到所有有一个人的名字是“约翰”

+0

所以要澄清,鉴于“约翰史密斯”,你会想找到“简史密斯“,”比尔史密斯“和”朱迪史密斯“以及? –

+0

@MichaelBerkowski是的,正好在MySQL 5.5.35中的 – marcosh

回答

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

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

+0

+1:尽管在这里写了另一个答案,但这并不使用20年前的语法,而现在在大多数RDBMS中都已弃用。 *(为什么人们觉得使用显式连接非常困难?)* – MatBailie

2

基本上你需要这个查询的同姓的人的名字:

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

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

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

+0

这个查询完全按照@Vatev提出的查询执行,所以我也提出了你的答案。我选择他是因为明确加入 – marcosh

0

在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,不必打扰你。 (虽然很高兴知道你可以通过自连接,存在子句和其他方式实现同​​样的效果)。

+0

不幸的是,MySQL在优化子查询方面可能非常愚蠢。它在5.6.14上运行正常,但是当我在5.5.35上尝试时,它将它变成了一个依赖子查询。 – Vatev

+0

我也在5.5.35中试过,并且用一张581262行的表格,查询爆炸了...... – marcosh

+0

听起来很可怕。似乎我很幸运,不必使用MySQL。我很抱歉给出了一个不好的建议。我不知道,dbms会发现很难处理这样简单的查询。 –

相关问题