Mysql查询效率

时间:2012-07-09 22:37:21

标签: mysql

我有一个mysql数据表,我只需要返回没有“Deactive”状态且没有总计0的行(但是可能存在状态为deactive且total不是的行0,反之亦然)。在我需要这个要求之前,我只是在做标准查询来选择所有行:

SELECT * FROM tableName WHERE uid = id;

但是现在当我更改查询以添加上述约束时:

SELECT * FROM tableName WHERE uid = id AND (status != "Deactive" OR Total != 0);

此底部查询需要更长时间才能完成。为什么会发生这种情况,是否有更好的方法可以进行此查询?

2 个答案:

答案 0 :(得分:2)

第一个查询是根据索引查找的(我假设是'uid')。第二个查询是对其他值进行过滤。运行它,它将帮助您弄清楚如何最好地优化它:

EXPLAIN EXTENDED SELECT * FROM tableName WHERE uid = id AND status != "Deactive" OR Total != 0;

这很脏,但这可能是加快速度的快速方法:

SELECT 
  *
FROM 
(
  SELECT 
    * 
  FROM 
    tableName 
  WHERE 
    uid = id 
) as temp
WHERE
  temp.status != "Deactive" 
  OR temp.Total != 0;

这将强制查询首先获取具有匹配uid的行,然后将其过滤掉,而不必进行大表扫描。就像我之前说过的那样,EXPLAIN EXTENDED是你的朋友

答案 1 :(得分:-1)

您需要返回每行中的所有数据吗?即只选择您需要的列将使查询运行得更快。

您还说您需要'返回状态为“Deactive”且没有“0”的行。您的查询应该是:

SELECT * (or column names) FROM tableName WHERE uid = id AND status != "Deactive" AND Total != 0;