我的查詢是這樣如何用兩個where子句優化SQL查詢?
SELECT * FROM tbl1
JOIN tbl2 ON something = something
WHERE 1 AND (tbl2.date = '$date' OR ('$date' BETWEEN tbl1.planA AND tbl1.planB))
當我運行此查詢,它比例如該查詢
SELECT * FROM tbl1
JOIN tbl2 ON something = something
WHERE 1 AND ('$date' BETWEEN tbl1.planA AND tbl1.planB)
或
SELECT * FROM tbl1
JOIN tbl2 ON something = something
WHERE 1 AND tbl2.date = '$date'
在本地主機,第一要慢得多查詢大約需要0.7秒,第二個查詢大約0.012秒,第三個查詢大約0.008秒。
我的問題是你如何優化這個?如果當前我的表中有1000行,並且需要0.7秒來顯示第一個查詢,那麼如果我有10.000行,則需要7秒?與第二個查詢(0.12秒)和第三個查詢(0.08)相比,這是一個巨大的減速。
我試過添加索引,但結果沒有什麼不同。
感謝
編輯:此應用程序將只在本地工作,所以無需擔心速度在網上。
對不起,我沒有包含EXPLAIN,因爲我真正的查詢要複雜得多(約5個連接)。但是聯結(我認爲)並不重要,因爲我已經嘗試省略它們,並且仍然獲得與上述大致相同的結果。
日期屬於tbl1,planA和planB屬於tbl2。我試着給tbl1.date,tbl2.planA和tbl2.planB添加索引,但結果不明顯。
按照schema的意思是MyISAM或InnoDB?這是MyISAM。
好的,我馬上發佈我的查詢。希望這不是令人困惑。
SELECT *
FROM tb_joborder jo
LEFT JOIN tb_project p ON jo.project_id = p.project_id
LEFT JOIN tb_customer c ON p.customer_id = c.customer_id
LEFT JOIN tb_dispatch d ON jo.joborder_id = d.joborder_id
LEFT JOIN tb_joborderitem ji ON jo.joborder_id = ji.joborder_id
LEFT JOIN tb_mix m ON ji.mix_id = m.mix_id
WHERE dispatch_date = '2011-01-11'
OR '2011-01-11'
BETWEEN planA
AND planB
GROUP BY jo.joborder_id
ORDER BY customer_name ASC
而且描述輸出
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE jo ALL NULL NULL NULL NULL 453 Using temporary; Using filesort
1 SIMPLE p eq_ref PRIMARY PRIMARY 4 db_dexada.jo.project_id 1
1 SIMPLE c eq_ref PRIMARY PRIMARY 4 db_dexada.p.customer_id 1
1 SIMPLE d ALL NULL NULL NULL NULL 2048 Using where
1 SIMPLE ji ALL NULL NULL NULL NULL 455
1 SIMPLE m eq_ref PRIMARY PRIMARY 4 db_dexada.ji.mix_id 1
你有什麼指數? 'DESCRIBE SELECT(你的查詢)'的輸出是什麼? – bdonlan 2011-01-22 10:03:59
另外,這些表的模式是什麼? – bdonlan 2011-01-22 10:08:43