[MySQL]8編indexについて


index
データベースがインデックスを使用する最大の理由は、検索速度を速めるためです.インデックスは、テーブル内のデータをソートし、必要なデータのみをすばやくインポートするために使用されます.
インデックスがない場合は、テーブル内のデータを最初から最後まで1つずつ検索する必要があります.それがフルスキャンです.ただし、インデックスがテーブルにある場合は、インデックスを表示してデータの場所に直接インポートできます.それがインデックススキャンです!
索引作成条件
  • テーブルにデータが多い場合に作成することをお勧めします.
  • テーブルのデータが多くない場合は、インデックススキャンよりも完全スキャンが高速になる可能性があります.テーブル内のデータが多ければ多いほど、インデックスの効果は顕著になります.
  • のプライマリ・キーを持つコラムは生成する必要はありません!
  • プライマリ・キーが付与されたカラムは、クラスタ・インデックスを作成します.また、Unique制約に関するコラムも同様です.上記の2つの制約条件を使用するコラムでは、インデックスを追加する必要はありません.
  • Cardinalityを確認して生成します.
  • Cardinalityとは、あるコラムの値の分散度を指す.
    たとえば、ID番号を含むコラムと性別を含むコラムを考慮すると、一意の値を持つID番号を持つコラムは基数が高く、性別は2つのデータしかないため、基数が低いと判断する可能性があります.これは、高可用性のコラムでインデックスを作成できることを意味します.
    Indexの欠点
  • インデックスが作成された場合.mdbファイルが増大します.
  • は、並列性を低減し、複数のユーザが複数のユーザアプリケーションで同時に1つのページを変更できるようにする.
  • インデックスのフィールドでデータを更新したり、レコードを追加したり、削除したりすると、パフォーマンスが低下します.
  • インデックスはデータベース領域を占有し、追加の領域が必要です.(10%以上のデータベーススペースが必要)
  • インデックスの作成には時間がかかる場合があります.
  • のデータを頻繁に変更すると、インデックスを再作成する必要があるため、パフォーマンスに影響を与える可能性があります.
  • したがって、インデックスすべきフィールドを事前にテストして決定することをお勧めします.インデックスを追加すると、クエリーの速度が1秒速くなりますが、データ行の追加速度が2秒遅くなり、複数のユーザーがインデックスを使用している場合、レコードのロックの問題が発生する可能性があります.
    気に入ったら、
    (1)Whereセクションでよく使用されるColumn
    (2)外部キーを使用したColumn
    (3)Joinでよく使われるColumn
    Indexの使用を避ける
    (1)高繰返しデータがないColumn->効用
    (2)DMSL(INSERT,DELETE,UPDATE)が頻繁に現れるColumn->脆弱性
  • INSERT
  • :index split現象が発生する可能性があります.
    (index split-インデックスのブロックを1つから2つに分ける)
    インデックスは、データを順番にソートする必要があります.既存のブロックに空き領域がない場合、そのブロックに新しいデータを入力する必要がある場合は、既存のブロックの一部を新しいブロックに書き込み、既存のブロックに空き領域を作成して新しいデータを追加できます.
    *パフォーマンスが非常に悪い
    1 index splitは、新しいブロックを割り当てて鍵を移動する複雑なタスクを実行します.すべてのプロセスがRedoに記録され、大量のRedoが発生します.
    ②インデックス分割を行う場合、そのブロックのキー値を変更することができないため、DMLはブロックされます.
  • DELETE
  • テーブルのデータを削除すると、そのデータは消去され、他のデータがそのスペースを占有します.
    ただし、インデックスからデータを削除すると、データは消去されず、無効なタグのみが保持されます.
    すなわち,テーブルに1万個のデータがあれば,インデックスは2万個とすることができる.この場合、インデックスを使用すると実行速度が期待できません.
  • UPDATE
  • インデックスはコンセプトを更新していません.テーブルが更新されると、インデックスはdeleteを最初に発生し、新しい操作のinsert操作を実行します.deleteとinsertの2つの操作がインデックスに同時に表示され、他のDMLよりも大きな負荷が発生します.
    索引の作成、削除
    CREATE INDEX 인덱스명 
    ON 테이블명 ( 컬럼명1, 컬럼명2, ... ); 또는 
    -- 단일 인덱스 
    ALTER TABLE 테이블명 ADD INDEX 인덱스명 ( 컬럼명 ); 
    -- 복합 인덱스 
    ALTER TABLE 테이블명 ADD INDEX 인덱스명 ( 컬럼명1, 컬럼명2, ... );
    
    -- 인덱스 삭제 
    ALTER TABLE 테이블명 DROP INDEX 인덱스명;
    その他参照:https://lalwr.blogspot.com/2016/02/db-index.html