哪个是带过滤器的更快的子查询,然后加入或加入查询然后在MYSQL中过滤

时间:2015-09-14 23:01:47

标签: mysql

我有两个表一个是用户表,另一个是专业表。 用户表中的字段:userid,username,userLocation 专业表中的字段:userid,userSpecialty

现在我想加入两个表。请告诉我哪种方法会更好:

select * from ( select * from user where userLocation = 'value') u inner join specialty s on u.userid = s.userid;

select * from user u inner join specialty s on u.userid = s.userid where userLocation = 'value';

最好尽量减少记录的数量或SQL优化器会自动执行此操作吗?

1 个答案:

答案 0 :(得分:1)

为获得最佳性能的最佳镜头,请优先考虑第二个查询中的模式,即没有内联视图的查询。

对于早期版本的MySQL(版本5.5及更早版本),第一个查询将要求MySQL运行内联视图查询,并实现派生表(u)。完成后,外部查询将针对派生表运行。该表不会被编入索引。对于大型集合,这可能是一个重大的性能影响。对于小集合,单个查询的性能影响不明显。

使用第二个查询,不会强制优化器创建和填充派生表,因此可能会提高性能。

合适的索引(或索引的不存在)i0ndexes的存在将对性能产生更大的影响。并且检索所有列(包括查询不需要的列(SELECT *))也会对性能产生影响。指定列的子集(实际需要的表达式)将提供更好的性能,尤其是当覆盖索引可用于避免查找表的基础数据页时。