0

このクエリを最適化するには、結合を使用するように言われました。

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

ただし、結合を使用しても速度がまったく向上しないようです。

select distinct p.product_id from cart_products p 
    left join product_bikes pb on p.product_id = pb.product_id and pb.bike_id = $bike_id
    left join cart_product_options po on po.product_id = p.product_id
    left join cart_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 = $bike_id
    where pb.bike_id = $bike_id or vb.bike_id = $bike_id

サーバーの負荷と現在のテーブルのサイズによっては、どちらも高速に実行されますが、製品や製品のオプションなどの数が多い場合、アドオンのこのセクションが原因で速度が低下しました。mysql がこのクエリを最も速く実行する方法を知りたいだけです。誰かがJOINSが優れた答えであると言うことができますか、それともこれをスピードアップするための他のトリックを知っていますか?

4

1 に答える 1

0

Mysql は、"in" ステートメントでサブクエリを処理するという非常に貧弱な仕事をします。相関サブクエリで「exists」を使用すると、特に相関のために内部テーブルで使用されるフィールドにインデックスがある場合は、はるかに高速になります。

次のようなものを試してください:

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
      exists (select *
              from cart_product_options cpo
               where cpo.productid = p.productid and
                     exists (select option_id
                             from cart_product_option_variants cpov
                             where cpo.option_id = cpov.option_id and
                                   exists (select variant_id
                                           from variant_bikes vb
                                           where vb.variant_id = cpov.variant_id and
                                                 bike_id=$bike_id
                                           )
                             )
              ) 

これは動作するはずです。. . しかし、ネストされたサブクエリがたくさんあります。

于 2012-08-10T18:41:36.807 に答える