2013-03-01 53 views
0

我在下面有一個選擇查詢,它所做的是選擇所有與來自Virtuemart表的特定屬性匹配的產品。屬性表相當大(近6000行)。有沒有什麼辦法來優化下面的查詢,或者是否有其他可能有用的進程,我已經嘗試將索引添加到一個甚至兩個表中。Virtuemart屬性查詢的優化

SELECT DISTINCT `jos_vm_product`.`product_id`, 
    `jos_vm_product_attribute`.`attribute_name`, 
    `jos_vm_product_attribute`.`attribute_value`, 
    `jos_vm_product_attribute`.`product_id` 
FROM (`jos_vm_product`) 
    RIGHT JOIN `jos_vm_product_attribute` 
     ON `jos_vm_product`.`product_id` = `jos_vm_product_attribute`.`product_id` 
WHERE ((`jos_vm_product_attribute`.`attribute_name` = 'Size') 
    AND ((`jos_vm_product_attribute`.`attribute_value` = '6.5') 
     OR (`jos_vm_product_attribute`.`attribute_value` = '10')))  
GROUP BY `jos_vm_product`.`product_sku` 
ORDER BY CONVERT(`jos_vm_product_attribute`.`attribute_value`, SIGNED INTEGER) 
LIMIT 0, 24 

這裏是EXPLAIN表的結果:

 
id select_type  table      type possible_keys            key    key_len  ref  rows Extras 
1 SIMPLE   jos_vm_product_attribute range idx_product_attribute_name,attribute_value,attribute_name attribute_value 765   NULL 333  Using where; Using temporary; Using filesort 
1 SIMPLE   jos_vm_product    eq_ref PRIMARY              PRIMARY   4   shoemark_com_shop.jos_vm_product_attribute.product_id 

任何幫助將不勝感激。謝謝。

回答

0

jos_vm_product_attribute.attribute_namejos_vm_product_attribute.attribute_value(按此順序)的複合索引替換jos_vm_product_attribute.attribute_name索引應該有助於此查詢。目前,它只使用WHERE條件中的索引jos_vm_product_attribute.attribute_value,但是此新索引可用於WHERE條件的兩個部分。

+0

嗨G-Nugget,謝謝你的回覆。我試着按照你的建議做,但發生了以下錯誤: #1071 - 指定的密鑰太長;最大密鑰長度爲1000字節 – 2013-03-05 22:24:42

+0

編輯:實際上,我縮短了這兩列的字符長度,然後重新運行SQL alter table SQL命令以添加到組合索引中,它工作正常,沒有發生錯誤。我會檢查速度是否有差異。謝謝! – 2013-03-05 22:33:10

+0

@TarunDhanwani這些列的數據類型和字符集是什麼?如果可能的話,你應該嘗試完全索引列。如果您使用的是utf-8歸類,則可以有效地將索引中的字段長度加倍,這將使其更快地達到1000字節的限制。 – 2013-03-06 14:48:10