0

このクエリを最適化するのにほぼ 1 日を費やしました。

SELECT 
    prod. *, 
    cat.slug category_slug, 
    sup.bname bname, 
    sup.slug bname_slug
FROM bb_admin.bb_directory_products AS prod
LEFT JOIN bb_admin.bb_categories_products AS cat 
    ON prod.primary_category_id = cat.category_id
LEFT JOIN bb_admin.bb_directory_suppliers AS sup 
    ON prod.supplier_id = sup.supplier_id
LEFT JOIN bb_admin.bb_directory_suppliers AS credit_sup 
    ON prod.credit_supplier_id = credit_sup.supplier_id
LEFT JOIN bb_admin.bb_directory_suppliers AS photo_sup 
    ON prod.photo_supplier_id = photo_sup.supplier_id
WHERE (
    prod.status = '1'
    OR prod.status = '3'
    OR prod.status = '5'
)
    AND (
        sup.active_package_id != '1'
        OR sup.active_package_id != '5'
        OR sup.active_package_id != '6'
        OR prod.supplier_id = '0'
    )
    AND (
        sup.supplier_id = '1989'
        OR credit_sup.supplier_id = '1989'
        OR photo_sup.supplier_id = '1989'
    )
GROUP BY prod.product_id
ORDER BY prod.priority_index ASC

このクエリを最適化するのを手伝ってくれませんか?

4

1 に答える 1

1
  1. INTチェックするものはすべて整数 ID (仮定) であるため、列のデータ型を またはそのバリアントの 1 つに更新します。
  2. 次の列にインデックスを作成します (可能であればすべてのテーブルで):

    • 製品状態
    • サプライヤーID
    • active_package_id
  3. セグメントINを連結する代わりに句を使用します。OR

更新されたWHERE条項をここに置きます。

WHERE prod.status IN(1, 3, 5)
    AND ( sup.active_package_id NOT IN(1, 5, 6)
        OR prod.supplier_id = 0
    )
    AND 1989 IN (prod.supplier_id, prod.credit_supplier_id, prod.photo_supplier_id)
于 2013-09-12T02:53:40.407 に答える