我有這個疑問:SQL的性能問題
SELECT stringa FROM table WHERE stringb = 'x' OR stringb = 'y' OR stringb = 'z'
這只是一個縮短的版本,實際的查詢擁有1000「OR」子句在一個查詢。
它需要幾分鐘時間執行,這是不好的。
我試過在時間做一個查詢,像這樣:
SELECT stringa FROM table WHERE stringb = 'x'
SELECT stringa FROM table WHERE stringb = 'y'
SELECT stringa FROM table WHERE stringb = 'z'
但是,這需要更長的時間。我也試過這樣一個大的查詢:
SELECT stringa FROM table WHERE stringb = 'x'
UNION
SELECT stringa FROM table WHERE stringb = 'y'
UNION
SELECT stringa FROM table WHERE stringb = 'z'
但是再次花費了更長的時間。
如果有人有任何提高性能的建議,將不勝感激。我的表是MyISAM,如果它很重要。
編輯:
下面是表的結構:
列:
key (CHAR PRIMARY), stringa (CHAR), stringb (CHAR)
,行看起來像這樣:(鍵 - stringa - stringb)
key - a - b
key - a - c
key - a - d
key - a - e
key - a - f
key - b - b
key - b - c
key - b - d
key - c - c
key - c - d
key - c - f
key - d - f
等..有近百萬行。
,我需要選擇所有「stringa」,其中「stringb」等於A或B或C等
當然stringa和stringb不只是「a」和「B」,它們包含的字符長度在3到80個字符之間變化。
我希望以某種方式
如果單列的查詢花了很長一段時間,你很可能缺少一個索引。 – dasblinkenlight 2012-08-03 21:26:37
通常,「選擇」使任何數據庫系統的優化器難以使用任何類型的索引,並且性能受到嚴重影響。儘量只選擇你需要的列值。如果沒有一列,請在需要的列或列上放置一個索引。 – Mithrandir 2012-08-03 21:27:08
你從哪裏得到你的OR子句比較?你不能做一個'SELECT列WHERE一個in(SELECT valid_terms FROM other_table)'嗎?或者是每個OR真的在具有單個值的不同列上?如果是後者...有些東西不對 – 2012-08-03 21:27:54