0

我在下面有一个选择查询,它的作用是从 Virtuemart 表中选择与某个属性匹配的所有产品。属性表相当大(将近 6000 行)。有什么方法可以优化下面的查询,或者是否有任何其他可能有用的过程,我已经尝试将索引添加到一个甚至两个表。

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 使用 where;使用临时的;使用文件排序
1 简单的 jos_vm_product eq_ref PRIMARY PRIMARY 4 shoemark_com_shop.jos_vm_product_attribute.product_id   

任何帮助将不胜感激。谢谢。

4

1 回答 1

0

用和(按该顺序)jos_vm_product_attribute.attribute_name上的复合索引替换索引应该有助于此查询。目前,它仅在for 条件中使用索引,但这个新索引将可用于条件的两个部分。jos_vm_product_attribute.attribute_namejos_vm_product_attribute.attribute_valueWHEREjos_vm_product_attribute.attribute_valueWHERE

于 2013-03-01T15:00:38.367 回答