99%のSQL最適化の作業に遭遇した、これはあなたに(II)のソリューションを与えることができます

-- 示例表
CREATE TABLE `employees` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(24) NOT NULL DEFAULT '' COMMENT '姓名',
  `age` int(20) NOT NULL DEFAULT '0' COMMENT '年龄',
  `position` varchar(20) NOT NULL DEFAULT '' COMMENT '职位',
  `hire_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '入职时间',
  PRIMARY KEY (`id`),
  KEY `idx_name_age_position` (`name`,`age`,`position`) USING BTREE,
  KEY `idx_age` (`age`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=136326 DEFAULT CHARSET=utf8 COMMENT='员工表'

最適化することにより、ORDER BYとグループ

EXPLAIN select * from employees WHERE name='LiLei' and position='dev' order by age;

左端の接頭辞ルールを使用する:即値フィールドを分割することができないので、クエリはkey_lenに= 74から、名前のインデックスを使用することもfilesortレコードを使用せずに余分なフィールド以来、ソート処理に使用される年齢欄を見ることができます。

EXPLAIN select * from employees WHERE name='LiLei'  order by position;


ビューの実行から結果説明:key_lenには74 =、名前のインデックスを使用してクエリは、ソートのための位置は、年齢がスキップされ、filesortレコードを使用して登場しました。

EXPLAIN select * from employees WHERE name='LiLei'  order by age,position;

のみ何filesortレコードを使用して、ソート用インデックス名、年齢や位置を使用しない検索。

EXPLAIN select * from employees WHERE name='LiLei'  order by position,age;

インデックスの順序は、名前、年齢、位置として作成されているので、しかし逆さま位置を年齢や位置をソートするときと異なる場合には、エクストラはfilesortレコードを使用して現れた、ということです。

EXPLAIN select * from employees WHERE name='LiLei'  order by age asc, position desc;

インデックスフィールドと関節の並び順は同じであり、filesortレコードを使用して生成するインデックスの別の種類につながる、ここで位置DESC降順、昇順によるデフォルトの順序であるが。Mysql8バージョンは、クエリのこのタイプをサポートすることができますインデックスを降順以上のものを持っています。

EXPLAIN select * from employees WHERE name in('LiLei', 'zhuge')  order by age, position ;

発注については、複数の等しい条件にも範囲クエリです。

EXPLAIN select * from employees WHERE name > 'a' order by name;

カバーリングインデックスに最適化することができ、

EXPLAIN select name,age,position from employees WHERE name > 'a' order by name;

ソートfilesortレコード

EXPLAIN select * from employees where name='LiLei' order by position;

このビューは、(のみソート部を表示)、SQLの結果を追跡するために対応しています。

set session optimizer_trace="enabled=on",end_markers_in_json=on; ‐‐开启trace
select * from employees where name = 'LiLei' order by position;
select * from information_schema.OPTIMIZER_TRACE;

{
      "join_execution": {  --sql执行阶段
        "select#": 1,
        "steps": [
          {
            "filesort_information": [
              {
                "direction": "asc",
                "table": "`employees`",
                "field": "position"
              }
            ] /* filesort_information */,
            "filesort_priority_queue_optimization": {
              "usable": false,
              "cause": "not applicable (no LIMIT)"
            } /* filesort_priority_queue_optimization */,
            "filesort_execution": [
            ] /* filesort_execution */,
            "filesort_summary": {  --文件排序信息
              "rows": 1,  --预计扫描行数
              "examined_rows": 1,  --参与排序的行
              "number_of_tmp_files": 0, --使用临时文件的个数,这个值为0代表全部使用sort_buffer内存排序,否则使用磁盘文件排序
              "sort_buffer_size": 200704,  --排序缓存的大小
              "sort_mode": "<sort_key, additional_fields>"  --排序方式,这里用的单路排序
            } /* filesort_summary */
          }
        ] /* steps */
      } /* join_execution */
    }

修改max_length_for_sort_data = 10

set max_length_for_sort_data = 10;  --employees表所有字段长度总和肯定大于10字节
select * from employees where name = 'LiLei' order by position;
select * from information_schema.OPTIMIZER_TRACE;

{
      "join_execution": {
        "select#": 1,
        "steps": [
          {
            "filesort_information": [
              {
                "direction": "asc",
                "table": "`employees`",
                "field": "position"
              }
            ] /* filesort_information */,
            "filesort_priority_queue_optimization": {
              "usable": false,
              "cause": "not applicable (no LIMIT)"
            } /* filesort_priority_queue_optimization */,
            "filesort_execution": [
            ] /* filesort_execution */,
            "filesort_summary": {
              "rows": 1,
              "examined_rows": 1,
              "number_of_tmp_files": 0,
              "sort_buffer_size": 53248,
              "sort_mode": "<sort_key, rowid>"  --排序方式为双路排序
            } /* filesort_summary */
          }
        ] /* steps */
      } /* join_execution */
    }

2ソートモードの比較、単一のソートフィールドのデータを入れているすべてのsort_bufferを照会する必要があります、とだけソートデュアル主キーidフィールドと必要がsort_bufferにソートをソートするだろう、と主キーによるバックに必要な元のテーブルのルックアップフィールドデータへのid。MySQLは、ソートの効率を高めるために、異なる設定で異なるモードを使用して並べ替え、パラメータmax_length_for_sort_data選別により制御されています。

最適化の概要

  • 二つの方法でfilesortレコードとインデックスをソートMySQLサポートは、インデックスを使用すると、インデックス自体をスキャンする完全なシーケンシングのMysqlを指します。インデックス、高効率、低filesortレコード効率。
  • 二つの条件を満足することにより、順序インデックスを用いて使用されます。
    左端の最前線インデックスを使用するORDER BY文。
    どこ左端の列のインデックス最前線を満たすために結合句の条件によって句と注文。
  • (インデックスのために作成された)時間インデックス左端の接頭辞ルールに従って、インデックス列で発注を完了してみてください。
  • 条件は列インデックスによって順番にない場合は、filesortレコードを使用して生成されます。

私は公共の数を懸念していませんよ?

  • 以下のように受信することができる[社会的関心Xiaoqiang高度道路の二次元コードの数を終了スイープ。
  • 教材:1Tビデオチュートリアル:フロントとリアエンドはJavaweb教育ビデオ、機械学習/ AI教育ビデオ、Linuxシステムのチュートリアル動画、IELTSのビデオチュートリアルをカバー。
  • 以上の100冊:含むC / C ++やJava、Pythonプログラミング言語は3冊、LeetCodeの説明Daquanのを見なければなりません。
  • ソフトウェアツール:ほとんどのソフトウェアは、ほとんどあなたが道をプログラミングに使用する場合があります含み;
  • プロジェクトソース:20件のJavaWebソースプロジェクト。
    高度な小型の強力な方法は、二次元コード

おすすめ

転載: www.cnblogs.com/xiaoqiang-code/p/11495359.html