1. Mysql でのインデックスの作成と削除
innodb および myisam エンジンは、主キーまたは UNIQUE 属性を持つ列のインデックスを自動的に作成します。
他の列にインデックスを付けたい場合は、それを明示的に指定する必要があります。
1. テーブル作成時にインデックスを作成します
1 2 3 4 | CREATE TABLE 表名 (
各个列的信息...,
(KEY/INDEX) 索引名 (需要被索引的单个列或多个列)
)
|
ログイン後にコピー
KEY または INDEX のいずれかを同義語として使用できることに注意してください。
たとえば、index_demo テーブルを作成するときに、c2 列と c3 列に結合インデックスを追加します:
1 2 3 4 5 6 7 | CREATE TABLE index_demo(
c1 INT,
c2 INT,
c3 CHAR(1),
PRIMARY KEY(c1),
INDEX idx_c2_c3 (c2, c3)
);
|
ログイン後にコピー
ここで作成されるインデックスの名前は idx_c2_c3 です。インデックス名は任意に付けることができますが、 idx_ を使用することをお勧めします。 idx_ はプレフィックスで、その後に再開するインデックスの列名が続きます。複数の列はアンダースコアで区切られます。
2. テーブル構造を変更するときにインデックスを追加します
1 | ALTER TABLE 表名 ADD (KEY/INDEX) 索引名 (需要被索引的单个列或多个列);
|
ログイン後にコピー
3. テーブル構造を変更するときにインデックスを削除します
1 | ALTER TABLE 表名 DROP (KEY/INDEX) 索引名;
|
ログイン後にコピー
次に、最初に構築されたインデックス idx_c2_c3 を削除します。次のように書きます:
1 | ALTER TABLE index_demo DROP INDEX idx_c2_c3;
|
ログイン後にコピー
2. インデックスのコスト
インデックスは良いものですが、恣意的に作成することはできません。
1. スペースのコスト
これは非常に明白です。
つまり、これには多くのストレージスペースが必要になります。
2. 時間コスト
シーケンスの維持に時間がかかる
テーブル内のデータを追加、削除、または変更する場合は、必ず各 B ツリー インデックスを変更する必要があります。
私たちは知っています:
- B ツリー内の各レベルのノードは、インデックス列値の昇順で二重にリンクされたリストを形成します。
- リーフ ノードであっても内部ノードであっても、内部レコードはインデックス列の値の順に並べられ、単一リンク リストを形成します。
したがって、操作の追加、削除、または変更を行うと、ノードとレコードの並べ替えに損傷が生じる可能性があり、ストレージ エンジンはページ分割などの操作を実行するために余分な時間が必要になります。ノードとレコードの分類を維持するためのリサイクル。
多数のインデックスが作成された場合、各インデックスに対応する B ツリーに関連するメンテナンス操作が必要となり、大量の消費が発生することが想像できます。
時間のかかる実行計画の分析
クエリ ステートメントを実行する前に、まず実行計画が生成されます。
一般的に、クエリ ステートメントは実行中に最大 1 つのセカンダリ インデックスを使用します。実行プランを生成するときは、クエリを実行するためにさまざまなインデックスを使用するコストを計算し、最終的に最小のインデックスを選択する必要があります。問い合わせてください。
作成されるインデックスが多すぎると、コスト分析の実行に時間がかかりすぎて、クエリ ステートメントの実行パフォーマンスに影響を与える可能性があります。
以上がMysql インデックスの作成、削除、使用のコストはいくらですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。