WHERE子句中的字段顺序是否会影响MySQL的性能?

时间:2010-10-27 17:06:45

标签: sql mysql performance

我在表中有两个索引字段 - typeuserid(单个索引,而不是复合索引)。

type的字段值非常有限(假设它只有0或1),因此50%的表记录具有相同的type。另一方面,userid值来自更大的集合,因此具有相同userid的记录数量很少。

这些查询中的任何一个查询运行速度都快于其他查询:

select * from table where type=1 and userid=5
select * from table where userid=5 and type=1

此外,如果两个字段都没有编入索引,是否会改变行为?

3 个答案:

答案 0 :(得分:57)

答案 1 :(得分:9)

大多数查询优化器使用条件显示为提示的顺序。如果其他条件相同,他们将遵循该命令。

然而,许多事情可以覆盖:

  • 第二个字段有一个索引,第一个字段没有
  • 有统计数字表明字段2更具选择性
  • 第二个字段更易于搜索(varchar(max) vs int

所以(对于所有SQL优化问题都是如此)除非你观察到性能问题,否则最好是为了清晰而优化,而不是(想象)性能。

答案 2 :(得分:7)

它不应该在你的小例子中。查询优化器应该做正确的事情。您可以通过在查询的前面添加explain来确认。 MySQL将告诉你如何将它们连接在一起以及为了进行连接需要搜索多少行。例如:

explain select * from table where type=1 and userid=5

如果他们没有编入索引,可能会改变行为。