記事のディレクトリ
インデックス
1.基本的なSQLステートメント
1.インデックスを作成します
CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX 索引名 ON 表名(字段名) [USING 索引方法];
2.インデックスを削除します
drop index 索引名
3.インデックスを表示します
show index on tablename;
2.パフォーマンス低下の理由
1.不適切に記述されたクエリステートメント
2.インデックスの失敗:単一値インデックス、複合インデックス
3.結合が多すぎる(設計上の欠陥または不均一な要件)
4。サーバーの調整とさまざまなパラメーター設定(キャッシュ、スレッド数)
3.利点
- クエリを高速化
- 並べ替えを減らす
4.デメリット
- ギャップロックを増やし、データの更新速度を遅くします
- 時間をかけて最適化されたインデックスを作成してください
5.分類
- 単一値インデックス:単一の列のみが含まれます
- 一意のインデックス:インデックスの値は一意であり、空にすることができます
- 複合インデックス:複数の列を持つインデックス
6.検索の原則
- B木
- ハッシュ
- rツリー
- 全文
7.どのような状況でインデックスを作成しますか
- 主キーには自動的にインデックスが付けられます(キングのユーザー名とゾーンは共同主キーにはなりませんよね??頻繁に更新しないでください。ユーザー名とパーティションを使用して抽選を実行できます!)
- 外部キーの索引付け
- 統計のグループ化と並べ替えに使用されるフィールドのインデックス付け
- 同時実行性が高いと、共同インデックスが作成される傾向があります
- 頻繁にクエリされるフィールドのインデックス作成
8.どのような状況でインデックスが確立されませんか?
- ユーザー自身のプロファイルなど、場所で使用されないフィールド
- 頻繁に更新されるフィールドは、インデックス付けに意味がありません
- 300万未満の表にはレコードがほとんどありません
- データの繰り返し率が高すぎます
9.パフォーマンス分析
1.説明する
- 使用する
- タイプ
- 余分
- 行
- 可能なキー
- キー
- テーブル
- id
- ref
2.遅いクエリログ
4.バッチデータスクリプト
5.プロフィールを表示
6.グローバルログクエリ
7.一般的な考え方
- 遅いクエリログを開始してキャプチャします。
- 説明+ SQL分析。
- show profileは、サーバーでのSQLの実行の詳細とライフサイクルを照会します。
- SQLデータサーバーのパラメーター調整。
10.パフォーマンスの最適化
1.シングルテーブル接続
2.2つのテーブルが接続されています
1.左右の接続と反対のインデックス(左の接続と右のテーブル、右の接続と左のテーブル)
3.3テーブル最適化の場合
- 小さなテーブルが大きなテーブルを動かす
- 最初にサブセットを最適化する
- 結合テーブルに最適化されたステートメントがあることを確認します
- 結合バッファにけちをつけないでください
4.インデックス最適化の原則
- 私のお気に入りに完全に一致
create index on user a('c', 'd', 'e');
select * from user where c = 'x'; #可以用到索引
select * from user where d = 'y' and e = 'z' #索引失效了
第二个违背了最佳左前缀法则:
建立索引的第一字段不能丢(索引失效)
建立索引的中间字段不能断(否则部分使用索引)
- インデックスに対して関数操作(計算、関数、型変換)を実行しないでください。
select * from user where left(id, 4) = 1;#在索引left上使用了函数
- 範囲が使用された後、すべての無効化、インデックス付きフィールドを選択(選択)してみてください
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"#会使用索引,所以仍旧是使用索引
- <>、!=、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%";
- varchar型は一重引用符で囲む必要があります
select * from name = '3000';
select * from name = 3000;#索引失效
都能查到,但是出现了隐式的类型转换
先頭の兄は死ぬことはできず、真ん中の兄弟は壊すことはできません。同様の後にパーセント記号、文字列型が引用され、範囲の後はすべて無効です。
- group byは、一時テーブルを生成する場合があります
- 小さなテーブルが大きなテーブルを動かします。
select * from A where id in (select id from B);#B表小于大表
select * from A where exists(select id from B);#A表小于大表
exists就是把A中的字段放入子查询寻中进行比较。