ホームページ  >  記事  >  データベース  >  MySQL はシステムの実行速度を向上させるためにインデックスを作成します

MySQL はシステムの実行速度を向上させるためにインデックスを作成します

黄舟
黄舟オリジナル
2016-12-15 11:26:361229ブラウズ

mytable テーブルを作成するとします。
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL ); 10,000 個のレコードをランダムに挿入します。そのうちの 1 つは 5555、管理者です。
username="admin" SELECT * FROM mytable WHERE username='admin'; のレコードを検索するとき、username にインデックスが確立されていれば、MySQL はスキャンせずにレコードを正確に見つけることができます。逆に、MySQL はすべてのレコードをスキャンします。つまり、10,000 レコードがクエリされます。
インデックスは、単一列インデックスと結合インデックスに分かれています。単一列インデックスは、インデックスに 1 つの列のみが含まれることを意味します。テーブルには複数の単一列インデックスを含めることができますが、これは結合されたインデックスではありません。結合インデックス。つまり、1 つのインデックスに複数の列が含まれます。
MySQL のインデックスには次の種類があります。
(7) インデックス使用上の注意事項
インデックスを使用する場合、次のようなヒントと注意事項があります。
◆インデックスには NULL 値を持つカラムは含まれません
カラムに NULL 値が含まれる限り複合インデックス内の 1 つの列に NULL 値が含まれている限り、この列はこの複合インデックスに対して無効になります。したがって、データベースを設計するときは、フィールドのデフォルト値を NULL にしないでください。
◆短いインデックス
を使用して文字列のインデックスを作成し、可能であればプレフィックスの長さを指定します。たとえば、CHAR(255) 列がある場合、ほとんどの値が最初の 10 文字または 20 文字内で一意である場合は、列全体にインデックスを付けないでください。短いインデックスはクエリ速度を向上させるだけでなく、ディスク領域と I/O 操作を節約します。
◆インデックス列のソート
MySQL クエリはインデックスを 1 つだけ使用するため、where 句でインデックスが使用されている場合、order by の列はインデックスを使用しません。したがって、データベースのデフォルトの並べ替えで要件を満たすことができる場合は、並べ替え操作を使用しないでください。必要に応じて、これらの列に対して複合インデックスを作成することをお勧めします。
◆like ステートメント操作
一般に、like 操作の使用は推奨されません。使用する必要がある場合、その使用方法も問題になります。 「%aaa%」のようにインデックスは使用されませんが、「aaa%」のようにインデックスが使用されます。
◆列を操作しないでください
select * from users where YEAR(adddate)<2007; は各行を操作するため、インデックスの失敗とテーブル全体のスキャンが発生するため、
select * from users where に変更できます。 adddate<'2007-01-01';
◆NOT IN および <> 操作は使用しないでください
以上で MySQL のインデックス タイプを紹介しました。
(6) インデックスのデメリット
インデックスを使用するメリットは上記の通りですが、インデックスを使いすぎると悪用の原因となります。したがって、インデックスには欠点もあります。
◆インデックスはクエリ速度を大幅に向上させますが、テーブルの INSERT、UPDATE、DELETE などのテーブルの更新速度も低下します。テーブルを更新するとき、MySQL はデータを保存するだけでなく、インデックス ファイルも保存する必要があるためです。
◆インデックスファイルを作成するとディスク容量が占有されます。通常、この問題は深刻ではありませんが、大きなテーブルに複数の結合インデックスを作成すると、インデックス ファイルが急速に拡張します。
インデックスは効率を向上させるための 1 つの要素にすぎません。MySQL に大量のデータ テーブルがある場合は、最適なインデックスの調査と構築、またはクエリ ステートメントの最適化に時間を費やす必要があります。
(5) インデックスを作成するタイミング
インデックスの作成方法を学びましたが、どのような場合にインデックスを作成する必要があるでしょうか?一般に、WHERE および JOIN に出現するカラムにはインデックスを付ける必要がありますが、MySQL では <、<=、=、>、>=、BETWEEN、IN のインデックスのみが使用され、場合によっては LIKE でインデックスが使用されるため、これが完全に当てはまるわけではありません。索引。例:
SELECT t.Name FROM mytable t LEFT JOIN mytable m ON t.Name=m.username WHERE m.age=20 AND m.city='鄭州' この時点では、都市と年齢のインデックスを作成する必要があります。 mytable テーブル userame は JOIN 句にも現れるため、インデックスを作成する必要があります。
インデックスを作成する必要があるのは特定の LIKE のみであると先ほど述べました。 MySQL はワイルドカード文字 % と _ で始まるクエリを作成するときにインデックスを使用しないためです。たとえば、次の文ではインデックスを使用します:
SELECT * FROM mytable WHERE username like'admin%' ですが、次の文ではインデックスを使用しません:
SELECT * FROM mytable WHEREt Name like'%admin' したがって、次のようにする必要があります。 LIKE を使用する場合は、上記の違いに注意してください。
(4) 複合インデックス
単一列インデックスと複合インデックスを視覚的に比較するには、テーブルに複数のフィールドを追加します:
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, city VARCHAR(50) NOT NULL , age INT NOT NULL ); MySQL の効率をさらに引き出すには、結合インデックスの確立を検討する必要があります。名前、都市、年齢をインデックスに構築するだけです:
ALTER TABLE mytable ADD INDEX name_city_age (name(10),city,age); テーブルを作成するとき、ユーザー名の長さは 16 で、ここでは 10 が使用されます。これは、通常、名前の長さが 10 を超えないため、インデックス クエリが高速化され、インデックス ファイルのサイズが削減され、INSERT の更新速度が向上します。
ユーザー名、都市、年齢にそれぞれ単一列インデックスを作成し、テーブルに 3 つの単一列インデックスがある場合、クエリ効率は前述の結合インデックスとは大きく異なり、結合インデックスよりもはるかに低くなります。 。現時点では 3 つのインデックスがありますが、MySQL は最も効率的であると思われる単一列インデックスのみを使用できます。
そのような結合インデックスを確立することは、実際には、次の 3 セットの結合インデックスを確立することと同じです:
usernname,city,age usernname,city usernname なぜ city や age のような結合インデックスがないのですか?これは、MySQL 複合インデックスの「左端のプレフィックス」の結果です。簡単に理解すると、組み合わせは左端から開始するだけです。これら 3 つの列を含むクエリだけがこの結合インデックスを使用するだけでなく、次の SQL もこの結合インデックスを使用します:
SELECT * FROM mytable WHREE username="admin" AND city="Zhengzhou" SELECT * FROM mytable WHREE username="admin"以下のものは使用されません:
SELECT * FROM mytable WHREE age=20 AND city="鄭州" SELECT * FROM mytable WHREE city="鄭州"
(3) 主キーインデックス
を許可しない特殊な一意のインデックスです。 NULL 値。通常、主キー インデックスはテーブルの作成時に作成されます。
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, PRIMARY KEY(ID) ); もちろん、ALTER コマンドを使用することもできます。テーブルには主キーを 1 つだけ持つことができることに注意してください。
(2) 一意のインデックス
前の通常のインデックスと似ていますが、インデックス列の値は一意である必要がありますが、null 値も許可される点が異なります。複合インデックスの場合、列値の組み合わせは一意である必要があります。以下の作成方法があります。
◆インデックスの作成
CREATE UNIQUE INDEXindexName ON mytable(username(length)) ◆テーブル構造の変更
ALTER mytable ADD UNIQUE [indexName] ON (username(length)) ◆テーブルを直接作成指定
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, UNIQUE [indexName] (username(length)) );
(1) 通常のインデックス
これは最も基本的なインデックスであり、制限はありません。以下の作成メソッドがあります。
◆インデックスの作成
CREATE INDEX IndexName ON mytable(username(length)); CHAR、VARCHAR 型の場合、BLOB および TEXT の場合、長さはフィールドの実際の長さより小さくてもかまいません。 type、lengthを指定する必要があります。以下同様。
◆テーブル構造を変更する
ALTER mytable ADD INDEX [indexName] ON (username(length)) ◆テーブル作成時に直接指定
CREATE TABLE mytable( ID INT NOT NULL, username VARCHAR(16) NOT NULL, INDEX [indexName] ( username(length)) ); インデックスを削除する構文:
DROP INDEX [indexName] ON mytable;
Index は高速検索の鍵です。 MySQL インデックスの確立は、MySQL を効率的に運用するために非常に重要です。ここでは、一般的な MySQL インデックス タイプをいくつか示します。
データベーステーブルでは、フィールドにインデックスを付けるとクエリ速度が大幅に向上します。

上記は、システムの実行速度を向上させるための Mysql インデックス作成の内容です。その他の関連記事については、PHP 中国語 Web サイト (www.php.cn) に注目してください。


声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。