2010-11-05 59 views
1

我有一個數據庫,但我預計速度有問題。 因爲我的所有數據都保存seperately在屬性值數據庫中優化Mysql查詢

Product table: 
id int auto_inc PRI 
name var_char(64) 

attribute_table: 
attr_id int auto_inc PRI 
name var_char(64) 

attribute_value: 
attr_id int 
product_id 
value 

但是當我做一個高級搜索我得到ENORM querys像

select * from product_table as pt 
cross join attribute_value as av ON av.product_id = pt.id AND av.value LIKE "test" 
cross join attribute_table as at ON at.attr_id = av.attr_id AND at.name = "test" 
cross join attribute_value as av ON av.product_id = pt.id AND av.value LIKE "test2" 
cross join attribute_table as at ON at.attr_id = av.attr_id AND at.name = "test2" 
cross join attribute_value as av ON av.product_id = pt.id AND av.value LIKE "test3" 
cross join attribute_table as at ON at.attr_id = av.attr_id AND at.name = "test3" 

,但我想這個心不是真的快。但有什麼方法可以優化?或者我可以使用一些技巧來更快地進行搜索,就像一種兌現?

+0

你的查詢應該做什麼?你可能想要使用LEFT JOIN,並且可能希望添加一些索引,但是直到我能夠確定你想要選擇的內容,我無法真正幫助你。 – 2010-11-05 15:08:48

回答

0

我相信你想要的東西更是這樣的:

select * from product_table as pt JOIN attribute_value as av 
    ON av.product_id = pt.id 
WHERE (av.value LIKE "test") 
    OR (at.name = "test") 
    OR (av.value LIKE "test2") 
    OR (at.name = "test2") .... 

,讓你一個連接,從結果的選擇。我認爲這更接近你想要的。

0

首先,我要重寫它(我不明白你爲什麼加入同一個表多次):

select * from product_table as pt 
INNER join attribute_value as av ON (av.product_id = pt.id AND av.value LIKE "test%") 
INNER join attribute_table as at ON (at.attr_id = av.attr_id AND at.name LIKE "test%") 

接下來,運行EXPLAIN SELECT ...檢查執行平原。它顯示了查詢當前使用哪些索引。
然後,確保您在用於連接表的列上有索引 - 您應該在attribute_value.product_id,attribute_table.attr_id上具有索引(至少)。
最後,只選擇你所需要的,而不是*