mysqlインデックスとその最適化

インデックス

1.基本的なSQLステートメント

1.インデックスを作成します

CREATE  [UNIQUE | FULLTEXT | SPATIAL]  INDEX  索引名 ON  表名(字段名) [USING 索引方法]

2.インデックスを削除します

drop index 索引名

3.インデックスを表示します

show index on tablename;

2.パフォーマンス低下の理由

1.不適切に記述されたクエリステートメント
2.インデックスの失敗:単一値インデックス、複合インデックス
3.結合が多すぎる(設計上の欠陥または不均一な要件)
4。サーバーの調整とさまざまなパラメーター設定(キャッシュ、スレッド数)

3.利点

  1. クエリを高速化
  2. 並べ替えを減らす

4.デメリット

  1. ギャップロックを増やし、データの更新速度を遅くします
  2. 時間をかけて最適化されたインデックスを作成してください

5.分類

  1. 単一値インデックス:単一の列のみが含まれます
  2. 一意のインデックス:インデックスの値は一意であり、空にすることができます
  3. 複合インデックス:複数の列を持つインデックス

6.検索の原則

  1. B木
  2. ハッシュ
  3. rツリー
  4. 全文

7.どのような状況でインデックスを作成しますか

  1. 主キーには自動的にインデックスが付けられます(キングのユーザー名とゾーンは共同主キーにはなりませんよね??頻繁に更新しないでください。ユーザー名とパーティションを使用して抽選を実行できます!)
  2. 外部キーの索引付け
  3. 統計のグループ化と並べ替えに使用されるフィールドのインデックス付け
  4. 同時実行性が高いと、共同インデックスが作成される傾向があります
  5. 頻繁にクエリされるフィールドのインデックス作成

8.どのような状況でインデックスが確立されませんか?

  1. ユーザー自身のプロファイルなど、場所で使用されないフィールド
  2. 頻繁に更新されるフィールドは、インデックス付けに意味がありません
  3. 300万未満の表にはレコードがほとんどありません
  4. データの繰り返し率が高すぎます

9.パフォーマンス分析

1.説明する

  1. 使用する
  2. タイプ
  3. 余分
  4. 可能なキー
  5. キー
  6. テーブル
  7. id
  8. ref

2.遅いクエリログ

4.バッチデータスクリプト

5.プロフィールを表示

6.グローバルログクエリ

7.一般的な考え方

  1. 遅いクエリログを開始してキャプチャします。
  2. 説明+ SQL分析。
  3. show profileは、サーバーでのSQLの実行の詳細とライフサイクルを照会します。
  4. SQLデータサーバーのパラメーター調整。

10.パフォーマンスの最適化

1.シングルテーブル接続

2.2つのテーブルが接続されています

1.左右の接続と反対のインデックス(左の接続と右のテーブル、右の接続と左のテーブル)

3.3テーブル最適化の場合

  1. 小さなテーブルが大きなテーブルを動かす
  2. 最初にサブセットを最適化する
  3. 結合テーブルに最適化されたステートメントがあることを確認します
  4. 結合バッファにけちをつけないでください

4.インデックス最適化の原則

  1. 私のお気に入りに完全に一致
create index on user a('c', 'd', 'e');
select * from user where c = 'x';  #可以用到索引
select * from user where d = 'y' and  e = 'z' #索引失效了

第二个违背了最佳左前缀法则:
建立索引的第一字段不能丢(索引失效)
建立索引的中间字段不能断(否则部分使用索引)
  1. インデックスに対して関数操作(計算、関数、型変換)を実行しないでください。
select * from user where left(id, 4) = 1;#在索引left上使用了函数

  1. 範囲が使用された後、すべての無効化、インデックス付きフィールドを選択(選択)してみてください
select * from user where id = 4 and age > 1 and name = "te";#使用了范围
范围之后的就失效了, id会用到索引,但是age和age之后就会出现索引失效
select id, age, name where id = 4 and age  > 1 and name = "te"#会使用索引,所以仍旧是使用索引
  1. <>、!=、is null、null、is not nullを使用すると、 "%name"などのように、インデックスも失敗します。
select * from name where name like "%name";#索引失效
select * from name where name like "name%";#like 百分在右边

左側をロードする必要がある場合はどうなりますか?
カバーインデックスを使用する

create index on user idx_name_age(`name`, `age`);
select name, from user where name like "%tea%";
  1. varchar型は一重引用符で囲む必要があります
select * from name = '3000';
select * from name = 3000;#索引失效
都能查到,但是出现了隐式的类型转换

先頭の兄は死ぬことはできず、真ん中の兄弟は壊すことはできません。同様の後にパーセント記号、文字列型が引用され、範囲の後はすべて無効です。

  1. group byは、一時テーブルを生成する場合があります
  2. 小さなテーブルが大きなテーブルを動かします。
select * from A where id in (select id from B);#B表小于大表
select * from A where exists(select id from B);#A表小于大表
exists就是把A中的字段放入子查询寻中进行比较。

おすすめ

転載: blog.csdn.net/fuzekun/article/details/104462447