我有一个mysql数据表,我只需要返回没有“Deactive”状态且没有总计0的行(但是可能存在状态为deactive且total不是的行0,反之亦然)。在我需要这个要求之前,我只是在做标准查询来选择所有行:
SELECT * FROM tableName WHERE uid = id;
但是现在当我更改查询以添加上述约束时:
SELECT * FROM tableName WHERE uid = id AND (status != "Deactive" OR Total != 0);
此底部查询需要更长时间才能完成。为什么会发生这种情况,是否有更好的方法可以进行此查询?
答案 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;