ホームページ データベース mysql チュートリアル mysqlインデックスとは何ですか? mysql インデックスの関連知識の紹介

mysqlインデックスとは何ですか? mysql インデックスの関連知識の紹介

Dec 29, 2018 am 11:32 AM
mysql mysqlインデックス

この記事では、mysql インデックスとは何ですか? mysql インデックスに関する関連知識の紹介は、必要な友人が参考になれば幸いです。

インデックスとは

インデックスは本の目次のようなものです

インデックスクイック検索に使用されます。インデックスを使用せずに、カラム内の特定の値を持つ行を見つけるには、MySQL は最初のレコードから始めて、関連する行が見つかるまでテーブル全体を読み取る必要があります。テーブルが大きくなるほど、時間がかかります。テーブル内のクエリ対象の列にインデックスがある場合、MySQL はすべてのデータを確認することなく、データ ファイルを検索する場所にすぐにアクセスできるため、時間を大幅に節約できます。

利点と欠点

利点

1. クエリを大幅に高速化します

欠点

1. データが増えると、インデックスの作成と維持に時間がかかります。

#2. インデックスは、データ内のデータを占有します。テーブルには最大オンライン設定もあります。多数のインデックスがある場合、テーブル内のデータを追加、削除、または変更すると、インデックス ファイルがデータ ファイルよりも早くオンライン値に到達する可能性があります。テーブルの場合、インデックスも必要です。 動的メンテナンスによりデータ メンテナンスの速度が低下します。

使用原則とシナリオ

1. インデックスの数は多いほど良いですが、状況によって異なります

2. 頻繁に更新されるテーブルには、インデックスをできるだけ少なくする必要があります。

3. クエリに頻繁に使用されるフィールドのインデックスを作成します。

4. フィールドにはインデックスを使用しないようにします。少量のデータの場合はすべてクエリ データに費やす時間はインデックス データを走査する時間よりも短く、インデックスには最適化効果がありません。

5 異なる値がほとんどないフィールドにはインデックスを使用しないでください。 、男性と女性の 2 つの異なる値のみを持つ性別フィールドなど。

インデックス分類

注: インデックスはストレージ エンジンに実装されています。つまり、異なるストレージ エンジンは異なるインデックスを使用します

MyISAM と InnoDBストレージ エンジン: BTREE インデックスのみをサポートします。つまり、BTREE がデフォルトで使用され、置き換えることはできません。

MEMORY/HEAP ストレージ エンジン: HASH インデックスと BTREE インデックスをサポート

1。インデックス

インデックスには 1 つの列のみが含まれますが、テーブルには複数の単一列インデックスが存在する場合があります。

1.1. 基本的なインデックス タイプ。 MySQL では、純粋にデータをより高速にクエリするためだけに、インデックスが定義されているカラムに重複値や null 値を挿入することを許可する制限はありません。

1.2. 一意のインデックス

インデックス列の値は一意である必要がありますが、NULL 値も許可されます

1.3.特別な一意のインデックスであり、null 値は許可されません。

2. 結合インデックス

テーブル内の複数のフィールドの組み合わせに対してのみ作成されるインデックスです。クエリ条件 インデックスは、これらのフィールドの左側のフィールドが使用される場合にのみ使用されます。結合インデックスを使用する場合は、最適な左プレフィックス ルール

3 に従います。

#フルテキスト インデックス。MyISAM エンジンでのみ使用でき、フルテキスト インデックスは CHAR、VARCHAR、および TEXT タイプのフィールドでのみ使用できます。全文インデックスとは、テキストの山の中で、特定のキーワード (たとえば、「あなたはペンがとても苦手で、二流の人です...) を通じて、そのフィールドが属するレコード行を見つけることができることを意味します。」大きな悪いペン、それは可能かもしれません レコードを見つけます

4. 空間インデックス

空間インデックスは、空間データ型のフィールドに対して確立されるインデックスです。 MySQL の空間データ型、 GEOMETRY 、 POINT、 LINESTRING、 POLYGON。空間インデックスを作成する場合は、SPATIAL キーワードを使用します。要件: エンジンは MyISAM であり、空間インデックスの作成に使用される列は NOT NULL として宣言される必要があります

インデックス メソッド

使用原則: 値が異なる場合が大きく、主に等しい値の検索 (=、<=>、in) に基づいており、値の差が比較的少ない場合は、ハッシュ インデックスの方が効率的な選択肢です。検索の複雑さは O(1) です。 、範囲検索は主に、範囲検索をサポートする B ツリーの方が良い選択です。

B ツリー インデックスB ツリー インデックスには範囲検索と接頭辞検索の機能があり、N 個のノードを持つ B ツリーの場合、レコードを取得する複雑さは O(LogN) です。 。二分探索と同等。

ハッシュ インデックス

ハッシュ インデックスは等しい検索のみを実行できますが、ハッシュ テーブルがどれほど大きくても、検索の複雑さは O(1) です。

インデックスの作成と削除

作成

テーブル作成時に作成されます

CREATE TABLE 表名[字段名 数据类型]  [UNIQUE|FULLTEXT|SPATIAL|...] [INDEX|KEY] [索引名字] (字段名[length])   [ASC|DESC]
ログイン後にコピー

例:

CREATE TABLE `NewTable` (
    `id` INT NOT NULL AUTO_INCREMENT,
    `username` VARCHAR (255) NOT NULL,
    `name` VARCHAR (255) NOT NULL,
    `sex` TINYINT NOT NULL DEFAULT 0,
    `address` VARCHAR (255) NULL,
    PRIMARY KEY (`id`), # 主键索引
    INDEX `name` (`name`) USING BTREE, # 普通索引
    UNIQUE INDEX `username` (`username`) USING BTREE # 唯一索引
    INDEX `u_n_a` (`username`,    `name`,`address`) USING BTREE # 组合索引
);
ログイン後にコピー

既存のテーブルの作成

ALTER TABLE 表名 ADD[UNIQUE|FULLTEXT|SPATIAL] [INDEX|KEY] [索引名] (索引字段名)[ASC|DESC]
ログイン後にコピー
例:

ALTER TABLE `test`
ADD PRIMARY KEY (`id`),  # 主键索引
ADD INDEX `name` (`name`) USING BTREE , # 普通索引
ADD UNIQUE INDEX `username` (`username`) USING BTREE , # 唯一索引
ADD INDEX `u_n_a` (`username`, `name`, `address`) USING BTREE ; # 组合索引
ログイン後にコピー

インデックスの削除

ALTER TABLE 表名 DROP INDEX 索引名。
ログイン後にコピー

例:

ALTER TABLE `test`
DROP PRIMARY KEY,
DROP INDEX `username`,
DROP INDEX `name`,
DROP INDEX `u_n_a`;
ログイン後にコピー

インデックスの更新

最初に削除してからビルド

ALTER TABLE `test`
DROP INDEX `username` ,
ADD UNIQUE INDEX `username1` (`username`) USING BTREE ,
DROP INDEX `name` ,
ADD INDEX `name2` (`name`) USING BTREE ,
DROP INDEX `u_n_a` ,
ADD INDEX `u_a_n` (`username`, `address`, `name`) USING BTREE ;
ログイン後にコピー

インデックスの失敗状況

1 結合されたフィールドが最適に従っていません。左プレフィックス ルール

2。「%test」などのファジー クエリ。

# 索引生效
select * from `test` where `name` like "123";
# 索引生效
select * from `test` where `name` like "123%";
# 索引失效
select * from `test` where `name` like "%123";
# 索引失效
select * from `test` where `name` like "%123%";
ログイン後にコピー

3. 在索引列上做如下任何操作(计算,函数,(自动或者手动)类型装换),会导致索引失效而导致全表扫描

如 sex 字段上添加索引

# 索引失效
select * from `test` where `sex`*0.5  = 1
ログイン後にコピー

4. 范围索引(>,<,between and)后,无法命中组合索引右边的列

构建索引

ALTER TABLE `test`
ADD INDEX `s_n` (`sex`, `name`) USING BTREE ;
ログイン後にコピー

示例:

# 命中全部
select * from `test` where `sex` = 1 and `name` = &#39;a&#39;;
# 命中部分,sex命中,name失效
select * from `test` where `sex` > 1 and `name` = 'a';</p>
<p style="white-space: normal;">5. !=, is null, is not null 无法使用索引</p>
<p style="white-space: normal;">6. 字符串字段的值不加单引号(数字不报错,英文报错)索引失效</p>
<p>构建索引</p>
<pre class="brush:php;toolbar:false">ALTER TABLE `test`
ADD INDEX `name` (`name`) USING BTREE ;
ログイン後にコピー

示例

# 索引失效
select * from `test` where `name`  =  123;
# 索引生效
select * from `test` where `name`  =  '123';
ログイン後にコピー

7. or 条件导致索引失效

构建索引

ALTER TABLE `test`
ADD INDEX `sex` (`sex`) USING BTREE ;
ADD INDEX `n_u` (`name`, `username`) USING BTREE ;
ログイン後にコピー

示例:

# 索引不生效
select * from `test` where (`name` = 'aa' and `username` = 'aa') or `sex` > 1 
# 索引sex生效
select * from `test` where `sex` = 1 and (`id` = 2 or `name` = 'aa' )
ログイン後にコピー

附录

最佳左前缀法则

如果索引了多列,要遵守最左前缀法则。指的是查询要从索引的最左前列开始并且不跳过索引中的列

如下构建索引

ALTER TABLE `test` ADD INDEX `u_a_n` (`username`, `address`, `name`) USING BTREE ;
ログイン後にコピー

如下查询情况

# 命中部分
select * from `test` where `username` = 'aaa';
# 命中部分
select * from `test` where `username` = 'aa' and `address` = 'aaa';
# 全命中
select * from `test` where `username` = 'aa' and `address` = 'aaa' and `name` = 'a';
# 不命中,第一条件字段不是username
select * from `test` where  `address` = 'aaa';
ログイン後にコピー

以上がmysqlインデックスとは何ですか? mysql インデックスの関連知識の紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

MySQL:簡単な学習のためのシンプルな概念 MySQL:簡単な学習のためのシンプルな概念 Apr 10, 2025 am 09:29 AM

MySQLは、オープンソースのリレーショナルデータベース管理システムです。 1)データベースとテーブルの作成:createdatabaseおよびcreateTableコマンドを使用します。 2)基本操作:挿入、更新、削除、選択。 3)高度な操作:参加、サブクエリ、トランザクション処理。 4)デバッグスキル:構文、データ型、およびアクセス許可を確認します。 5)最適化の提案:インデックスを使用し、選択*を避け、トランザクションを使用します。

phpmyadminを開く方法 phpmyadminを開く方法 Apr 10, 2025 pm 10:51 PM

次の手順でphpmyadminを開くことができます。1。ウェブサイトコントロールパネルにログインします。 2。phpmyadminアイコンを見つけてクリックします。 3。MySQL資格情報を入力します。 4.「ログイン」をクリックします。

Navicatプレミアムの作成方法 Navicatプレミアムの作成方法 Apr 09, 2025 am 07:09 AM

NAVICATプレミアムを使用してデータベースを作成します。データベースサーバーに接続し、接続パラメーターを入力します。サーバーを右クリックして、[データベースの作成]を選択します。新しいデータベースの名前と指定された文字セットと照合を入力します。新しいデータベースに接続し、オブジェクトブラウザにテーブルを作成します。テーブルを右クリックして、データを挿入してデータを挿入します。

NavicatでMySQLへの新しい接続を作成する方法 NavicatでMySQLへの新しい接続を作成する方法 Apr 09, 2025 am 07:21 AM

手順に従って、NAVICATで新しいMySQL接続を作成できます。アプリケーションを開き、新しい接続(CTRL N)を選択します。接続タイプとして「mysql」を選択します。ホスト名/IPアドレス、ポート、ユーザー名、およびパスワードを入力します。 (オプション)Advanced Optionsを構成します。接続を保存して、接続名を入力します。

MySQLおよびSQL:開発者にとって不可欠なスキル MySQLおよびSQL:開発者にとって不可欠なスキル Apr 10, 2025 am 09:30 AM

MySQLとSQLは、開発者にとって不可欠なスキルです。 1.MYSQLはオープンソースのリレーショナルデータベース管理システムであり、SQLはデータベースの管理と操作に使用される標準言語です。 2.MYSQLは、効率的なデータストレージと検索機能を介して複数のストレージエンジンをサポートし、SQLは簡単なステートメントを通じて複雑なデータ操作を完了します。 3.使用の例には、条件によるフィルタリングやソートなどの基本的なクエリと高度なクエリが含まれます。 4.一般的なエラーには、SQLステートメントをチェックして説明コマンドを使用することで最適化できる構文エラーとパフォーマンスの問題が含まれます。 5.パフォーマンス最適化手法には、インデックスの使用、フルテーブルスキャンの回避、参加操作の最適化、コードの読み取り可能性の向上が含まれます。

単一のスレッドレディスの使用方法 単一のスレッドレディスの使用方法 Apr 10, 2025 pm 07:12 PM

Redisは、単一のスレッドアーキテクチャを使用して、高性能、シンプルさ、一貫性を提供します。 I/Oマルチプレックス、イベントループ、ノンブロッキングI/O、共有メモリを使用して同時性を向上させますが、並行性の制限、単一の障害、および書き込み集約型のワークロードには適していません。

SQLが行を削除した後にデータを回復する方法 SQLが行を削除した後にデータを回復する方法 Apr 09, 2025 pm 12:21 PM

データベースから直接削除された行を直接回復することは、バックアップまたはトランザクションロールバックメカニズムがない限り、通常不可能です。キーポイント:トランザクションロールバック:トランザクションがデータの回復にコミットする前にロールバックを実行します。バックアップ:データベースの定期的なバックアップを使用して、データをすばやく復元できます。データベーススナップショット:データベースの読み取り専用コピーを作成し、データが誤って削除された後にデータを復元できます。削除ステートメントを使用して注意してください:誤って削除されないように条件を慎重に確認してください。 WHERE句を使用します:削除するデータを明示的に指定します。テスト環境を使用:削除操作を実行する前にテストします。

MySQL:世界で最も人気のあるデータベースの紹介 MySQL:世界で最も人気のあるデータベースの紹介 Apr 12, 2025 am 12:18 AM

MySQLはオープンソースのリレーショナルデータベース管理システムであり、主にデータを迅速かつ確実に保存および取得するために使用されます。その実用的な原則には、クライアントリクエスト、クエリ解像度、クエリの実行、返品結果が含まれます。使用法の例には、テーブルの作成、データの挿入とクエリ、および参加操作などの高度な機能が含まれます。一般的なエラーには、SQL構文、データ型、およびアクセス許可、および最適化の提案には、インデックスの使用、最適化されたクエリ、およびテーブルの分割が含まれます。

See all articles