4.MySQL SQL調整3

15102 ワード

1)最初からすべてのデータをインポートする悪いSQL文


(1)現状分析
explain select 사원.사원번호,
	급여.평균연봉,
    급여.최고연봉,
    급여.최저연봉
    from 사원,
    (select 사원번호,
		round(avg(연봉), 0) 평균연봉,
        round(max(연봉), 0) 최고연봉,
        round(min(연봉), 0) 최저연봉
        from 급여
        group by 사원번호
        ) 급여
	where 사원.사원번호 = 급여.사원번호
    and 사원.사원번호 between 10001 and 10100;
まず2行
  • idが1の行にアクセスし、従業員テーブルから2つのテーブルを導出し、オーブンテーブル
  • である.
  • 派生2テーブルとは、idが2であり、select typeエントリがDERIVEDによって作成された3行目のインラインビューを指す.
  • fromセクションでは、給与計算書を使用して実行されたgrooping結果が、新しく作成されたテンポラリ・テーブルのメモリまたはディスクに格納されます.
  • (2)問題
  • from節の給与表を巡り、無条件に過剰なデータ
  • にアクセスする
  • 従業員テーブルbwtween構文を使用してデータにアクセスします.テーブルの30万個の条件のうち10個、
  • (3)調整の実行
    explain select 사원.사원번호,
    	    (select round(avg(연봉), 0)
    	    from 급여 as 급여1
    	    where 사원번호 = 사원.사원번호
    	    ) as 평균연봉,
           	(select round(max(연봉), 0)
    	    from 급여 as 급여2
    	    where 사원번호 = 사원.사원번호
    	    ) as 최고연봉,
           	(select round(min(연봉), 0)
    	    from 급여 as 급여2
    	    where 사원번호 = 사원.사원번호
    	    ) as 최저연봉
        from 사원
        where 사원.사원번호 between 10001 and 10100;
  • 従業員テーブルから100個の新しい構文データを入力し、給与計算書に従業員番号ごとに
  • の年俸を取得します.
  • 最初にID 1の従業員表にアクセスし、給与3/給与2/給与1の順に
  • にアクセスする.
  • DEPENDENTSUBQUERYは重複呼び出しを避ける必要がありますが、100個のデータを抽出する従業員テーブル規格では100回しかアクセスしていないため、性能面では効率の低下はほとんどありません.
  • 2)悪いSQL文は効率を低下させる


    (1)現状分析
    explain select 사원.사원번호, 사원.이름, 사원., 사원.입사일자
        from 사원
    	inner join 급여 on 사원.사원번호 = 급여.사원번호
    	where 사원.사원번호 between 10001 and 50000
        group by 사원.사원번호
        order by sum(급여.연봉) desc
        limit 150, 10;
  • 運転台従業員テーブルとオーブンテーブル給与テーブルの組合せ
  • 従業員テーブル作成テンポラリテーブル図面およびソート演算をテンポラリテーブルで行い、ソートファイルsortを使用して
  • を実行する.
    (2)問題
  • LIMIT演算を使用して10個のデータを数十万個のデータターゲットにチェックインし、これらのデータに対してロールバックおよびソート
  • を実行する.
    (3)調整の実行
    explain select 사원.사원번호, 사원.이름, 사원., 사원.입사일자
        from (select 사원번호
                from 급여
                where 사원번호 between 10001 and 50000
                group by 사원번호
                order by sum(급여.연봉) desc
                limit 150, 10) 급여,
                사원
        where 사원.사원번호 = 급여.사원번호;
  • 給与表でgroupbyとorder byタスクをfromセクションのインラインビューとして作成し、LIMITをインラインビューに制約するために必要なデータ数を減らし、従業員表に結合するデータ数を
  • 減少させる
  • idが1の派生2つのテーブルはidが2の給与テーブルであり、drivenテーブルは職員テーブルである.
  • 明細内ビュー給与表に従って、従業員表に繰り返しアクセスして結合を実行

    3)悪いSQL文は必要以上の情報をもたらす



    (1)現状分析
    explain select count(사원번호) as 카운트
    	from(
    		select 사원.사원번호, 관리자.부서번호
            from (select *
                    from 사원
                    where 사원번호 > 300000
                ) 사원
    	    left join 부서관리자 관리자
    	        on 사원.사원번호 = 관리자.사원번호
        ) 서브쿼리;
  • 部門マネージャ表外部結合に基づいてPKを使用してオーバーラップループ結合にアクセスするときのデータ(行エントリ:1)
  • (2)問題
  • 従業員表の従業員番号を集計する際には、部門マネージャ表と外部署名が必要かどうかを考慮する必要があります.
    (3)調整の実行
    explain select count(사원번호) as 카운트
        from 사원
        where 성별 = 'M'
        and 사원번호 > 300000;
    削除
  • 外部条件を必要としない部門マネージャ番号
  • 4)大量のデータを取得してチェックインする悪いSQL文


    (1)現状分析
    explain select distinct 매핑.부서번호
        from 부서관리자 관리자,
             부서사원_매핑 매핑
        where 관리자.부서번호 = 매핑.부서번호
        order by 매핑.부서번호;
  • 運転台は部門従業員マッピングテーブルのインデックスプールスキャンを行い、部門管理者テーブルは運転台
  • である.
    (2)問題

  • SELECTセクションにマッピングします.管理部門番号.部門番号で作成する場合は、同じ芝生で出力します.
    ->部署番号が同じかどうかを検討する必要があります

  • スレーブ・セクションとwhereセクションの結合を行った後、結合結果に対してDISTINCT操作を行い、結合前の事前重複除外を考慮する
  • (3)調整の実行
    explain select 매핑.부서번호
        from ( select distinct 부서번호
                from 부서사원_매핑 매핑
            ) 매핑
        where exists(select 1
                    from 부서관리자 관리자
                    where 부서번호 = 매핑.부서번호)
        order by 매핑.부서번호;

  • 部門従業員マッピングテーブルのデータをインポートする場合は、重複する部門番号データを削除しておく

  • EXISTS演算子を使用して、「部門マネージャ」テーブルのすべてのデータをチェックせず、同じ部門番号を持つ場合、後続のデータにはアクセスしません.

  • id 2行は「行内ビュー」でindex for group-by:DISTINCTを使用し、I部ゲート番号インデックスでソートして重複データを削除する

  • id 1行は24行全体をインデックスプールスキャン後の重複データとして削除する部門従業員マッピングテーブルと結合であり、部門マネージャテーブルにexists演算子と比較する部門番号がある場合、同じ部門番号データは後でチェックしてスキップしないため、ExtraエントリにLoosScanと表示される
  • 注:SQL調整/オーダーメイド