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
        )
    )
)

編集: 簡単に言うと、顧客が自転車を選択すると、これに適合する製品 (製品自体または製品オプションのバリエーション) が選択されます。このコードが機能することに注意してください。最適化する方法があるかどうかを知りたいだけです。

4

2 に答える 2

0

これを試して:

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 )
于 2012-08-10T17:20:32.610 に答える
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

ただし、これにより速度が大幅に向上することはありませんでした。(おそらくその時点でのサーバー負荷が原因で、より速く返されることもあれば、遅く返されることもあります)。

于 2012-08-10T17:58:48.027 に答える