2012-07-09 77 views
1

我有一個mysql數據表,我只需要返回沒有「Deactive」狀態且沒有Total 0的行(但可以有狀態爲deactive的行和總數不是0,反之亦然)。之前,我需要這個要求,我只是在做標準查詢,選擇所有行:Mysql查詢效率

SELECT * FROM tableName WHERE uid = id; 

但是現在,當我更改查詢以加入上述限制:

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

這種自下而上查詢花費多少更長的時間才能完成。爲什麼會發生這種情況,有沒有更好的方法可以做這個查詢?

+0

多少條記錄出現在表中你有你要麼添加到查詢的字段的索引? – Braiba 2012-07-09 22:40:23

+0

是不是你的第二個查詢應該是'SELECT * FROM tableName WHERE uid = id AND(status!=「Deactive」OR Total!= 0);'。還要在這些字段中添加索引,您的查詢將得到更快執行... – 2012-07-09 22:40:37

+0

只有幾千條記錄。不,我沒有這些屬性的任何索引,因爲表格不是很大。 – ewein 2012-07-09 22:49:49

回答

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

+0

我想如果asker添加了合適的括號,那麼沒有子查詢就會有相同的性能(MySQL會很快放棄不匹配的行)。由於它是(沒有parens),因此OR條件可能包含該行,因此在評估Total之前無法消除該行。 – 2012-07-09 22:56:55

-1

你需要返回每一行中的所有數據嗎?即只挑選你需要的列將使查詢運行得更快。

你也說你需要'返回沒有'Deactive'狀態並且沒有Total'0'的行。然後,您的查詢應爲:

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

+0

不,此查詢將刪除狀態爲Deactive或總數爲0的所有行。只要總數不爲0,我仍然希望狀態爲Deactive的行。 – ewein 2012-07-09 23:15:49