MySQL学習ノート4(インデックス)

5506 ワード

Mysql学習ノート4
索引
インデックスは、データベース・テーブル内の特定のレコードをすばやくクエリーするための特殊なデータベース構造です.インデックスは、データベースのパフォーマンスを向上させる重要な方法です.MySQLでは、すべてのデータ型をインデックスできます.MySQLのインデックスには、通常のインデックス、一意性インデックス、全文インデックス、単列インデックス、多列インデックス、空間インデックスなどが含まれます.
1:索引の意味と特徴2:索引の分類3:索引の設計方法4:索引の作成方法5:索引の削除方法
1:索引の意味と特徴
インデックスは、データベース・テーブルの1つまたは複数のカラムの値をソートするテーブルに作成される構造です.インデックスを使用すると、クエリの速度が向上します.
インデックスの利点:データの取得速度を向上させることができます.これはインデックスの作成の最も主要な原因です.依存関係のあるサブテーブルと親テーブルの間の連合クエリーでは、クエリーの速度を向上させることができます.パケットとソートの句を使用してデータ・クエリーを行う場合も、クエリー内のパケットとソートの時間を大幅に節約できます.
インデックスの欠点:インデックスの作成と維持には時間がかかり、データ量の増加に伴って消費時間の数が増加します.インデックスは物理空間を占有する必要があり、各インデックスは一定の物理空間を占有しなければならない.データの追加、削除、変更時にインデックスを動的に維持すると、データのメンテナンス速度が低下します.
2:索引の分類
1.一般索引一般索引を作成する際、制限は一切付加されません.このようなインデックスは、フィールド自体の整合性制約によって決定される値が一意であるかどうか、および空でないかどうかの任意のデータ型に作成できます.インデックスを作成すると、クエリー時にインデックスでクエリーできます.
2.一意性インデックスUNIQUEパラメータを使用して、インデックスを一意性インデックスに設定します.一意性インデックスを作成する場合は、インデックスの値を制限する必要があります.一意性インデックスを使用します.レコードをより迅速に特定できます.プライマリ・キーは、特殊な一意性インデックスです.
3.全文インデックスFULLTEXTパラメータを使用して、全文インデックスとしてインデックスを設定します.フルテキストインデックスは、CHAR、VARCHR、またはTEXTタイプのフィールドにのみ作成できます.データ量の大きい文字列タイプのフィールドをクエリーする場合、全文インデックスを使用するとクエリーの速度が向上します.4.単一カラム索引表の単一フィールドに索引を作成します.単一カラムインデックスは、このフィールドに基づいてのみインデックスされます.単一カラムインデックスは、通常のインデックスであってもよいし、一意性インデックスであってもよい.全文インデックスであってもよい.インデックスが1つのフィールドにのみ対応していることを保証します.
5.複数のカラム・インデックス複数のカラム・インデックスは、テーブルの複数のフィールドにインデックスを作成します.このインデックスは、作成時に対応する複数のフィールドを指し、これらのフィールドでクエリーできます.ただし、インデックスは、クエリー条件でこれらのフィールドの最初のフィールドが使用されている場合にのみ使用されます.たとえば、テーブルのid、name、sexフィールドに複数のカラムインデックスを作成します.では、クエリ条件がidフィールドを使用している場合にのみインデックスが使用されます.
6.スペースインデックスSPATIALパラメータを使用して、スペースインデックスとしてインデックスを設定します.空間インデックスは、空間データ型にのみ確立され、システムが空間データを取得する効率を向上させることができます.空間データ型としては、GEOMETRY、POINT、LINESTRING、POLYGONなどがある.現在、スペース検索はMyISAMストレージエンジンのみがサポートされています.このようなインデックスはあまり使われません.
3:インデックスの設計原則
1.一意性インデックスの一意性インデックスを選択する値は一意であり、インデックスによってレコードをより迅速に決定できます.たとえば、学生テーブルの学号は一意性のあるフィールドです.このフィールドに一意性インデックスを作成すると、学生の情報をすぐに決定できます.名前を使用すると、同じ名前の現象が発生し、クエリーの速度が低下する可能性があります.
2.ソート、グループ化、およびコンビネーション操作が頻繁に必要なフィールドのインデックスを作成するために、常にソート、グループ化、およびコンビネーション操作が必要なフィールドを作成するには、ソート操作に多くの時間がかかります.インデックスを作成すると、ソート操作を効果的に回避できます.
3.クエリー条件としてよく使用されるフィールドにインデックスを作成するクエリー条件としてよく使用されるフィールドのクエリー速度は、テーブル全体のクエリー速度に影響します.したがって、このようなフィールドにインデックスを作成します.テーブル全体のクエリー速度を向上させることができます.
4.インデックスの数を制限するインデックスの数は、多くないほど良いです.各インデックスにはディスク領域が必要です.インデックスが多ければ多いほど、ディスク領域が大きくなります.テーブルを変更するときは、インデックスの再構築と更新が面倒です.インデックスが多ければ多いほど、テーブルの更新に時間がかかります.
5.できるだけデータ量の少ないインデックスを使う
6.インデックスフィールドの値が長い場合は、値の接頭辞を使用してインデックスをインデックス化することが望ましい.たとえば、TEXTやBLOGタイプのフィールドでは、全文検索に時間がかかります.フィールドの前の数文字のみを取得すると、検索速度が向上します.
7.使用されていない、または使用されていないインデックス・テーブルのデータが大量に更新されているか、またはデータの使用方法が変更されている場合、既存のインデックスの一部が不要になる可能性があります.データベース管理者は、これらのインデックスを定期的に見つけ、名前を削除して更新操作に及ぼすインデックスの影響を低減する必要があります.
4:索引の作成
インデックスの作成とは、テーブルへのアクセス速度を向上させるために、テーブルの1つ以上のカラムにインデックスを作成することです.インデックスの作成には、テーブルの作成時にインデックスを作成する方法、既存のテーブルにインデックスを作成する方法、ALTER TABLE文を使用してインデックスを作成する方法の3つがあります.
4.1テーブルを作成するときにインデックスを作成するときにインデックスを直接作成する方法が最も簡単で便利です.その基本形式は以下の通りである:CREATE TABLEテーブル名(属性名データ型[完全性制約条件]、属性名データ型[完全性制約条件]);
  • 通常インデックス
  • を作成
    CREATE TABLE index1( id INT, name VARCHAR(20), sex BOOLEAN, INDEX(id) );
  • 一意性インデックス
  • を作成
    CREATE TABLE index2( id INT UNIQUE, name VARCHAR(20), UNIQUE INDEX index2_id(id ASC) );
  • 全文インデックス
  • を作成
    CREATE TABLE index3( id INT, info VARCHAR(20), FULLTEXT INDEX index3_info(info) );
  • 単列インデックス
  • を作成する
    CREATE TABLE index4( id INT, subject VARCHAR(30), INDEX index4_sj(subject(10)) );
  • マルチカラムインデックス
  • を作成する
    CREATE TABLE index5( id INT, name VARCHAR(20), sex CHAR(4), INDEX index5_ns(name,sex) );

    4.2既存のテーブルにインデックスを作成既存のテーブルに、テーブル上の1つまたは複数のフィールドに直接インデックスを作成できます.基本形式は、CREATE[UNIQUE|FULLTEXT|SPATIAL]INDEXインデックス名ONテーブル名(属性名[(長)][ASC|DESC]);
    4.3既存のテーブルには、ALTER TABLE文を使用してインデックスを作成し、ALTER TABLE文を使用してテーブル上の1つまたは複数のフィールドに直接インデックスを作成できます.基本形式は以下の通りである:ALTER TABLEテーブル名ADD[UNIQUE|FULLTEXT|APATIAL]INDEXインデックス名(属性名[(長)][ASC|DESC]);
    5:索引の削除
    インデックスの削除とは、テーブルにすでに存在するインデックスを削除することです.使用されなくなったインデックスの一部は、テーブルの更新速度を低下させ、データベースのパフォーマンスに影響を与えます.既存のインデックスに対応して、DROP文でインデックスを削除できます.基本形式は以下の通りである:DROP INDEXインデックス名ONテーブル名;