ホームページ >データベース >SQL >SQL の問題を解決すると、MySQL についての理解が確実に一歩前進します。

SQL の問題を解決すると、MySQL についての理解が確実に一歩前進します。

coldplay.xixi
coldplay.xixi転載
2020-12-26 17:42:094834ブラウズ

SQL チュートリアル このコラムでは、MySQL をより効果的に理解する方法を紹介します

SQL の問題を解決すると、MySQL についての理解が確実に一歩前進します。

##推奨 (無料): SQL チュートリアル

属性テーブル (product_props) の構造は次のとおりです

データ音量が 800 W を超えています

フィールド名タイプ説明##idpn_idpv_idproduct_idproduct_id、pn_id、および pv_id の間には 1 対多の関係があります。
int id
int 属性タイプ
int 属性値
int Product ID
データは次のようになります:


product_id109701097010970109701098010980#10980
pn_id pv_id
5 (モデル) 135 (Apple 9)
11 (メモリ) 23 (512G)
10 (カラー) 17 (ローカルゴールド)
8 (ネットワーク) 6(5G)
5 135
11 24 (1024G)
10 16 (オーロラブルー)
製品テーブル(製品)の構造は次のとおりです

##データ量が 40W を超える

フィールド名タイプ説明product_idintproduct_idtype_idinttypeidbrand_idintbrandidmodel_idintモデル idステータスtinyintステータスデータは類似しています

product_idtype_idbrand_idmodel_idstatus109701(モバイル)1(Apple)1(iPhone8)1(通常) 109801(モバイル)1(Apple)1(iPhone8X) 3 (販売済み)109811(モバイル)1(Apple)1 (Iphone8XP)1(正常)問題

モデル番号が であることを確認します。 Apple 9

同時に、メモリは

512G、色は ローカル ゴールド、ステータスは normal、製品の総数は ps: 属性条件は 10 グループを超える可能性があります。 要件

パフォーマンスを最優先し、集計関数などは避けます。

元の問題に対する解決策のパフォーマンス ランキング

@Kamicloud からの既存のスキーム

    SELECT 
        sql_no_cache `product_id`
    FROM
        `zx_tests` AS a
    WHERE
        `pn_id` = 101 AND `pv_id` = 59
            AND EXISTS( SELECT 
               sql_no_cache  *
            FROM
                `zx_tests`
            WHERE
            a.product_id = product_id and
                `pn_id` = 101 AND `pv_id` = 171);
    
        2 组条件下 0.657,3 组 0.695,4 组 0.759,5 组 0.743 (单独查属性表)
  1. @Elijah_Wang からのサブクエリ スキーム
    SELECT `product_id` FROM `product` WHERE `pn_id` = 5 AND `pv_id` = 135 AND `product_id` IN (SELECT `product_id` FROM `product` WHERE `pn_id` = 11 AND `pv_id` = 23);
    
        2 组条件下 0.729,3 组 0.75,4 组 0.730,5 组 0.757 (新问题之前)
  1. 新しい質問後のパフォーマンス ランキング

@Elijah_Wang からのサブクエリ プラン

        select SQL_NO_CACHE count(1) from pdi_product a join  (
            SELECT
                 distinct product_id
            FROM
                `product_props` 
            WHERE
                `pn_id` = 5 
                AND `pv_id` = 127
                AND `product_id` IN ( SELECT  `product_id` FROM `product_props` WHERE `pn_id` = 11 AND `pv_id` = 22 ) 
                AND `product_id` IN ( SELECT  `product_id` FROM `product_props` WHERE `pn_id` = 10 AND `pv_id` = 18 ) 
                AND `product_id` IN ( SELECT  `product_id` FROM `product_props` WHERE `pn_id` = 8 AND `pv_id` = 6 )  
                AND `product_id` IN ( SELECT  `product_id` FROM `product_props` WHERE `pn_id` = 9 AND `pv_id` = 1 )
                ) b on a.product_id = b.product_id 
                where  a.status = 1;
  1. 1.5 ~ 1.56 (実行範囲 10)

分析の説明:

  • #
        select SQL_NO_CACHE count(1) from pdi_product a 
            where  a.status = 1 and a.product_id in (SELECT
             distinct product_id
        FROM
            `product_props` 
        WHERE
            `pn_id` = 5 
            AND `pv_id` = 127
            AND `product_id` IN ( SELECT  `product_id` FROM `product_props` WHERE `pn_id` = 11 AND `pv_id` = 22 ) 
            AND `product_id` IN ( SELECT  `product_id` FROM `product_props` WHERE `pn_id` = 10 AND `pv_id` = 18 ) 
            AND `product_id` IN ( SELECT  `product_id` FROM `product_props` WHERE `pn_id` = 8 AND `pv_id` = 6 )  
            AND `product_id` IN ( SELECT  `product_id` FROM `product_props` WHERE `pn_id` = 9 AND `pv_id` = 1 ))
は 0.69 ~ 0.72 かかります (実行範囲 10 回)

SQL 性能实战来了,机不可失!

分析の説明:


  • SQL 性能实战来了,机不可失!@Kamicloud からの既存の解決策
    SELECT SQL_NO_CACHE
            count(1) 
        FROM
            product a
        WHERE
            a.STATUS = 1 
            AND a.product_id IN (
        SELECT DISTINCT
            `product_id` 
        FROM
            `product_props` AS a 
        WHERE
            a.`pn_id` = 5 
            AND a.`pv_id` = 127 
            AND EXISTS ( SELECT product_id FROM `product_props` WHERE a.product_id = product_id AND `pn_id` = 11 AND `pv_id` = 22 ) 
            AND EXISTS ( SELECT product_id FROM `product_props` WHERE a.product_id = product_id AND `pn_id` = 10 AND `pv_id` = 18 ) 
            AND EXISTS ( SELECT product_id FROM `product_props` WHERE a.product_id = product_id AND `pn_id` = 9 AND `pv_id` = 1 ) 
            AND EXISTS ( SELECT product_id FROM `product_props` WHERE a.product_id = product_id AND `pn_id` = 8 AND `pv_id` = 6 ) 
            );
    5.7-5.85 かかります (実行範囲 10 回)
  1. # #分析の説明:

  •     SELECT SQL_NO_CACHE
            count(1) 
        FROM
            pdi_product a
            join (SELECT DISTINCT
            `product_id` 
        FROM
            `product_props` AS a 
        WHERE
            a.`pn_id` = 5 
            AND a.`pv_id` = 127 
            AND EXISTS ( SELECT product_id FROM `product_props` WHERE a.product_id = product_id AND `pn_id` = 11 AND `pv_id` = 22 ) 
            AND EXISTS ( SELECT product_id FROM `product_props` WHERE a.product_id = product_id AND `pn_id` = 10 AND `pv_id` = 18 ) 
            AND EXISTS ( SELECT product_id FROM `product_props` WHERE a.product_id = product_id AND `pn_id` = 9 AND `pv_id` = 1 ) 
            AND EXISTS ( SELECT product_id FROM `product_props` WHERE a.product_id = product_id AND `pn_id` = 8 AND `pv_id` = 6 ) ) b
        on a.product_id = b.product_id
        WHERE
            a.STATUS = 1
  • 5.7-6.0 かかります (実行範囲 10 回)

SQL 性能实战来了,机不可失!分析の説明:

単純に属性テーブルを確認すると1番目の位置の速度が最も速いことがわかりますが、製品の状態を確認すると速度は劣っています。サブクエリ。

SQL 性能实战来了,机不可失!Explain 分析後、最初のサブクエリが速い理由は、その SQL が単純であり、select_type が単純であるためです。


join メソッドや既存メソッドに関係なく、select_type はほとんどが DERIVED および DEPENDENT SUBQUERY です。

関連する無料学習の推奨事項:

mysql ビデオ チュートリアル

以上がSQL の問題を解決すると、MySQL についての理解が確実に一歩前進します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はlearnku.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。