如何更优化此查询?

时间:2011-01-14 20:39:05

标签: sql mysql query-optimization

    SELECT mem.name, 
           mem.regdate, 
           stat.level
      FROM stats AS stat
INNER JOIN members AS mem
     WHERE stat.id = mem.id 
       AND mem.ref = {$members['id']}

statsmembers表在id上有索引。但是当我运行查询时,它检查stats表中的所有行(在members表中它只需要一个)。我有什么想法我做错了吗?感谢。

2 个答案:

答案 0 :(得分:3)

使用正确的ANSI-92 JOIN语法 - 在ON子句中指定JOIN条件:

SELECT mem.name, 
       mem.regdate, 
       stat.level
  FROM stats AS stat
  JOIN members AS mem ON mem.id = stat.id 
 WHERE mem.ref = {$members['id']}

如果没有JOIN标准,MySQL将返回一个笛卡尔积,然后将WHERE子句应用于这些结果。几乎任何其他数据库都会告诉您,您提供的查询存在语法错误。

此外,INNER关键字是可选的。

答案 1 :(得分:0)

尝试从主表中选择(在本例中为成员,我是persume)和JOIN with stats以获取更多信息。使用ON定义统计信息如何连接到成员,并使用WHERE限制成员表的结果。

SELECT mem.name, mem.regdate, stat.level
FROM members AS mem
INNER JOIN stats AS stat
  ON stat.id = mem.id
WHERE mem.ref = {$members['id']}

因为它是一个INNER JOIN你也可以转过来(从统计数据中选择,加入成员),但是如果你看某个成员,这可能更有意义。

相关问题