1

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

SELECT * FROM tableName WHERE uid = id;

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

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

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

4

2 回答 2

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 是你的朋友

于 2012-07-09T22:42:38.443 回答
-1

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

您还说您需要“返回不具有“停用”状态且总计不为 0 的行。然后,您的查询应为:

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

于 2012-07-09T22:56:55.393 回答