2013-04-05 266 views
1

我目前遇到SQL查詢問題。我有一個包含colour_code字段的產品表。我無法改變產品表,因爲它是從外部來源獲取的。Mysql連接查詢問題

在網站上,用戶可以通過colour_code搜索產品,並返回所有可用此顏色的產品。

手頭的任務是讓不同的搜索字詞返回具有不同顏色代碼的特定產品。爲此,我添加了一個名爲colour_code_alias的新表,它只有一個colour_code字段,該字段對應於產品表中的colour_code字段以及一個將返回此結果的別名字段。見下面的表格示例。

**Product_tb** 
id, colour_code 
1, "ABC" 

**colour_code_alias_td** 
colour_code,alias 
"ABC","XYZ" 

所以,如果XYZ用戶搜索,就應該如果搜索「ABC」退回的產品與1的ID,他們也應該與1

的ID返回的產品

我的問題是查詢執行時間太長,因爲它沒有使用索引。我的一個簡化查詢低於:

Select * from product 
left join colour_code_alias cca on cca.colour_code = product.colour_code 
where (product.colour_code = 'XYZ' or cca.alias = "XYZ") 

當我使用的解釋說明其不使用此查詢的關鍵。 當我在where子句中刪除'或cca.alias =「XYZ」'時,正在使用產品表中的colour_code索引。

我正在尋找幫助,以提高這樣的查詢的性能,我應該如何索引這種類型的查詢,甚至應該重寫它?

任何幫助表示讚賞。

謝謝, 馬丁。

就像我已經做了什麼..我已經刪除了左連接,並添加了一個選擇查詢到where子句。該查詢如下所示:

Select * from product 
where (product.colour_code = 'XYZ' or product.colour_code = (select colour_code from colour_code_alias where alias = 'XYZ')); 
+0

是cca.alias索引? – mconlin 2013-04-05 12:44:00

+0

是的...我測試過使用3個索引。colour_code,別名和複合colour_code_alias索引。 – Martin 2013-04-05 12:46:06

回答

1

您應該在product.colour_code和別名上有索引。

另一個想法是,以避免或部分完全由填充與原表的別名,以及...是這樣的:

'ABC','ABC' 

這樣,你有一個地方去尋找。

編輯:

一個更多的思考 - 用數字而不是字符串鍵 - 這將是更有效也。 (但可能是困難的,如果你不能改變表)

+0

我在產品和別名表上設置了索引ok ..嗯..我可以嘗試將原始表添加到別名表中。 - 雖然,如果產品表獲得新產品,那麼在我使用新的顏色代碼填充別名表之前,這將不可搜索。 – Martin 2013-04-05 12:48:27

+0

我不能使用數字鍵,因爲你說那裏,我不能改變表。colour_code對於多種產品也可以相同。 – Martin 2013-04-05 12:53:26

1

你可以試試這個查詢:

select *, 
(select id from product where colour_code = cod.colour_code) as id_prod 
from 
colour_code_alias cod 
where (cod.colour_code = 'ABC' or cod.alias = 'XYZ') 
+0

嗨,感謝您的建議..它確實似乎返回了ID,但我簡化了我的問題,如果我說我需要產品的所有列都會發生改變。我更新了我的查詢並將where子句更改爲包括: 'where product.colour_code ='ABC'或product.colour_code IN(從colour_code_alias選擇colour_code,其中alias ='XYZ')' 似乎稍微好一些,但仍然有點慢 – Martin 2013-04-05 13:39:00

+0

更改IN = = ...它似乎是您的表上的索引問題....聲明product.colour_code和colour_code_alias.alias作爲索引 – Hackerman 2013-04-05 13:45:44

+0

感謝您的建議。我已經將我的IN換成了'=',而且好像運行得更快。我已經在這兩個表/字段上設置了索引。解釋查詢仍然沒有顯示product.colour_code的密鑰。 – Martin 2013-04-05 14:00:02