1

100 万を超える製品を含む OpenCart データベースがあります。%LIKE%検索クエリは、クエリとを使用して、ID を持つテーブルと製品説明を持つテーブルの 2 つの個別のテーブルに対して作成されますINNER JOIN。JOINS をなくして速度を向上させるために 2 つのテーブルを 1 つに結合することについて読みましたが、それは良い考えだと思いますか?

現在作成されているクエリは次のとおりです。

 SELECT COUNT(DISTINCT p.product_id) AS total 
 FROM oc_product p 
 INNER JOIN oc_product_description pd 
 ON (pd.product_id = p.product_id ) 
 WHERE p.status = 1 
 AND ( pd.name LIKE 'orange' OR pd.tag LIKE 'orange')

基準として pd.name と pd.tag を使用します。

4

1 に答える 1

0

理論的には、両方のテーブルを 1 つに結合すると、クエリ速度が確実に向上します。ただし、一部のシナリオでは、読み取り/書き込み操作が重いため、これは簡単な解決策ではない場合があります。タグなどの検索可能なフィールド値を更新するユーザー/管理者が大量にいない場合は、テーブルを 1 つに結合することが合理的な決定になります。

複数の検索可能なフィールドを 1 つのインデックスに適用したり、結合の代わりにサブクエリを使用したりするなど、クエリを改善する方法は他にもいくつかあります。

例:

SELECT 
    COUNT(p.product_id) AS total 
FROM 
    oc_product p 
WHERE 
    p.status = 1 
    AND 
    p.product_id IN 
    (
        SELECT 
            DISTINCT pd.product_id 
        FROM 
            oc_product_description pd 
        WHERE 
            CONCAT_WS(pd.name,pd.tag) LIKE 'orange'
    )

詳細情報とボトルネックについては EXPLAIN を確認してください。それが役に立てば幸い。

于 2013-10-21T23:50:52.547 に答える