2012-08-10 91 views
0

有什麼方法可以優化下面的查詢?它需要查看多個表。非常感謝您的幫助。相關模式:優化多表搜索

CREATE TABLE `variant_bikes` (
    `variant_id` mediumint(8) unsigned NOT NULL DEFAULT '0', 
    `bike_id` mediumint(8) unsigned NOT NULL DEFAULT '0', 
    PRIMARY KEY (`variant_id`,`bike_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

CREATE TABLE `product_bikes` (
    `product_id` mediumint(8) unsigned NOT NULL DEFAULT '0', 
    `bike_id` mediumint(8) unsigned NOT NULL DEFAULT '0', 
    PRIMARY KEY (`product_id`,`bike_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 

CREATE TABLE `cart_products` (
    `product_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`product_id`), 
) ENGINE=MyISAM AUTO_INCREMENT=95 DEFAULT CHARSET=utf8; 

CREATE TABLE `cart_product_options` (
    `option_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, 
    `product_id` mediumint(8) unsigned NOT NULL DEFAULT '0', 
    PRIMARY KEY (`option_id`), 
) ENGINE=MyISAM AUTO_INCREMENT=9040 DEFAULT CHARSET=utf8; 

CREATE TABLE `cart_product_option_variants` (
    `variant_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, 
    `option_id` mediumint(8) unsigned NOT NULL DEFAULT '0', 
    PRIMARY KEY (`variant_id`), 
) ENGINE=MyISAM AUTO_INCREMENT=9040 DEFAULT CHARSET=utf8; 

和SQL是:

select distinct p.product_id 
from cart_products p 
    left join product_bikes b on p.product_id = b.product_id where bike_id = $bike_id 
or 
p.product_id in (
    select product_id from cart_product_options where option_id in (
     select option_id from cart_product_option_variants where variant_id in (
      select variant_id from variant_bikes where bike_id=$bike_id 
     ) 
    ) 
) 

編輯:短髮是客戶選擇一輛自行車,這其中選擇適合的產品,無論是產品本身還是產品選項變種。注意這個代碼的作品,我只是想知道是否有一種方法來優化它。

+0

連接是您的問題的解決方案 http://dev.mysql.com/doc/refman/5.1/en/join.html – chicharito 2012-08-10 17:10:49

+1

JOIN是正確的策略。按表開始連接一個表,並在每個階段添加一個過濾器。 – 2012-08-10 17:22:55

回答

0

雖然本質上我的問題改了一下連接策略的作品,但它是最好的答案?即做它解決我原來它被優化成兩個工作問題:

select distinct p.product_id from cscart_products p 
    left join product_bikes pb on p.product_id = pb.product_id and pb.bike_id = 111 
    left join cscart_product_options po on po.product_id = p.product_id 
    left join cscart_product_option_variants pov on pov.option_id = po.option_id 
    left join variant_bikes vb on vb.variant_id = pov.variant_id and vb.bike_id = 111 
    where pb.bike_id = 111 or vb.bike_id = 111 

這導致然而,沒有明顯的速度提升。 (有時它會更快地返回,其他時間可能由於當時的服務器負載而變慢)。

1

試試這個:

select * from product_bikes PB 
     join cart_product_options CPO on PB.PRODUCT_ID = CPO.PRODUCT_ID 
     join cart_product_option_variants CPOV on CPO.OPTION_ID = CPOV.OPTION_ID 
where PB.product_id = $product[product_id] 
and CPOV.variant_id in ($valid_variants_list) 
+0

試試看,謝謝 – Wolfe 2012-08-10 17:24:52

+0

當另一個返回713行時,該查詢返回一個空集,重複時使用相同的ID,但不同使其成爲1行。我知道它至少應該返回一些東西。但是我也有其他一些問題,我會在解決問題時編輯我的帖子。 – Wolfe 2012-08-10 17:37:12

+1

在像蟾蜍這樣的查詢編輯器中試用qurey。此外,請嘗試逐個查詢。從第一個表開始,添加適用於它的條件。加入下一個表格,添加條件適用於此,等等。嘗試整個大查詢一次可能不會使一些問題容易識別。 – 2012-08-10 17:46:50