この記事では、例を使用して、MySQL データベースの最適化のためのインデックス実装の原則と使用方法を説明します。ご参考までに、詳細は以下の通りです。 索引インデックスとは何かインデックスは、特定の値を持つレコードをすばやく見つけるために使用されます。すべての MySQL インデックスは B ツリーの形式で保存されます。インデックスがない場合、クエリを実行するときに、MySQL は最初のレコードから始めて、要件を満たすレコードが見つかるまでテーブル全体のすべてのレコードをスキャンする必要があります。テーブル内のレコード数が多いほど、この操作にかかるコストは高くなります。検索条件として使用される列にインデックスが作成されている場合、MySQL はレコードをスキャンせずに対象レコードの場所をすばやく取得できます。テーブルに 1000 件のレコードがある場合、インデックスを使用してレコードを検索すると、レコードを順番にスキャンするよりも少なくとも 100 倍高速になります。 インデックス分類主キーインデックス 主キーは一意のインデックスですが、「PRIMARY KEY」として指定する必要があります。 AUTO_INCREMENT 列を使用したことがある場合は、主キーなどの概念にすでに精通している可能性があります。主キーは通常、テーブルを作成するときに指定されます。たとえば、「CREATE TABLE tablename ([…], PRIMARY KEY (列リスト));」のようになります。ただし、「ALTER TABLE tablename ADD PRIMARY KEY (column list);」のようにテーブルを変更して主キーを追加することもできます。各テーブルには主キーを 1 つだけ設定できます。 主キーインデックスを作成する 主キーは一意のインデックスですが、「PRIMARY KEY」として指定する必要があります。 AUTO_INCREMENT 列を使用したことがある場合は、主キーなどの概念にすでに精通している可能性があります。主キーは通常、テーブルを作成するときに指定されます。たとえば、「CREATE TABLE tablename ([…], PRIMARY KEY (列リスト));」のようになります。ただし、「ALTER TABLE tablename ADD PRIMARY KEY (column list);」のようにテーブルを変更して主キーを追加することもできます。各テーブルには主キーを 1 つだけ設定できます。 テーブルが列を主キーとして設定すると、その列は主キー インデックスになります。 テーブル aaa を作成 (id int unsigned 主キー auto_increment, 名前 varchar(32) nullでないデフォルト ''); これは主キー インデックスである id 列です。 テーブル bbb (id int 、name varchar(32) not null default '') を作成します。 テーブルの作成時に主キー インデックスを指定しなかった場合は、テーブルの作成後に次のコマンドで追加することもできます。 例: テーブル名を変更し、主キー (列名) を追加します。 主キーインデックスを削除する テーブル記事を変更し、主キーを削除します。 クエリインデックス desc テーブル名; インデックス名は表示できません テーブル名からインデックスを表示 テーブル名からキーを表示 全文索引 テーブル構造を作成する CREATE TABLE記事( id INT UNSIGNED AUTO_INCREMENT NOT NULL 主キー、 タイトル VARCHAR(200)、 本文テキスト、 FULLTEXT (タイトル、本文) )エンジン=myisam 文字セット utf8; 記事 (タイトル、本文) に値を挿入 (「MySQL チュートリアル」、「DBMS は DataBase の略です...」)、 (「MySQL をうまく使う方法」、「... を経験した後」)、 (「MySQL の最適化」、「このチュートリアルでは次の内容を紹介します...」)、 (「1001 MySQL トリック」、「1. mysqld を root として実行しないでください。2. ...」)、 ('MySQL vs. YourSQL','次のデータベース比較では...'), ('MySQL セキュリティ','適切に構成されている場合、MySQL ...'); 誤った使用法: 正しい使い方: 例: 1. MySQLでは、フルテキストインデックスはMyISAMに対してのみ有効です。 ユニークインデックス このタイプのインデックスは基本的に以前の「通常のインデックス」と同じですが、1 つの違いがあります。インデックス列内のすべての値は 1 回しか出現できず、つまり一意である必要があります。一意のインデックスは次の方法で作成できます。 インデックスを作成します。たとえば、CREATE UNIQUE INDEX <インデックス名> ON tablename (列リスト) です。 テーブルを変更します。たとえば、ALTER TABLE tablename ADD UNIQUE [インデックス名] (列リスト) を実行します。 テーブルを作成するときにインデックスを指定します。例: CREATE TABLE tablename ([…], UNIQUE [インデックス名] (列リスト)); テーブル構造を作成する テーブル ddd(id int primary key auto_increment 、 name varchar(32) unique) を作成します。 知らせ 一意のフィールドは NULL にすることができ、複数の NULL を持つことができますが、特定のコンテンツの場合は繰り返すことはできません。 しかし、空の文字列を繰り返すことはできません。 通常のインデックス 通常のインデックス (キーワード KEY または INDEX によって定義されたインデックス) の唯一のタスクは、データへのアクセスを高速化することです。したがって、クエリ条件 (WHEREcolumn=) またはソート条件 (ORDERBYcolumn) で最も頻繁に出現する列に対してのみインデックスを作成する必要があります。可能な限り、インデックスを作成するには、最も整然としたコンパクトなデータ (整数列など) を持つ列を選択する必要があります。 テーブルcccを作成( id int 符号なし、 名前varchar(32) ) テーブル (列 1、列名 2) にインデックス インデックス名を作成します。 インデックスの仕組み データベース インデックスは、データベース テーブル内のデータの迅速なクエリと更新を支援するためにデータベース管理システム内でソートされたデータ構造です。インデックスは通常、B ツリーとそのバリエーションである B+ ツリーを使用して実装されます。 上の図は、インデックス作成の 1 つのアプローチを示しています。左側は 2 つの列と 7 つのレコードを持つデータ テーブルです。左端はデータ レコードの物理アドレスです (論理的に隣接するレコードが、必ずしもディスク上で物理的に隣接するとは限らないことに注意してください)。 Col2 の検索を高速化するために、右に示すようにバイナリ検索ツリーを維持できます。各ノードには、インデックス キー値と、対応するデータ レコードの物理アドレスへのポインターが含まれています。このようにして、バイナリ検索を使用して、O(log2n) の複雑さ内で対応するデータを取得できます。 インデックスを作成すると、システムのパフォーマンスが大幅に向上します。 まず、一意のインデックスを作成することにより、データベース テーブル内の各データ行の一意性が保証されます。 インデックスを追加すると多くの利点があるので、テーブル内のすべての列にインデックスを作成しないのはなぜかと疑問に思う人もいるかもしれません。なぜなら、インデックスを追加することには多くの欠点もあるからです。 まず、インデックスの作成と維持には時間がかかり、データの量が増えるにつれてこの時間も長くなります。 インデックスは、データベース テーブル内の特定の列に作成されます。インデックスを作成するときは、どの列にインデックスを付けることができ、どの列にインデックスを付けることができないかを考慮する必要があります。一般的に、インデックスは次の列に作成する必要があります。検索を高速化するために、頻繁に検索される列に作成します。列の一意性を強制し、テーブル内のデータ構造を編成するために主キーとして機能する列に作成します。結合を高速化するために、主に外部キーである結合で頻繁に使用される列に作成します。範囲に基づいて頻繁に検索される列にインデックスを作成します。これは、インデックスがすでにソートされており、指定された範囲が連続しているためです。頻繁にソートされる列にインデックスを作成します。これは、インデックスがすでにソートされているため、クエリでインデックスのソートを利用してソート クエリ時間を高速化できるためです。条件の決定を高速化するために、WHERE 句で頻繁に使用される列にインデックスを作成します。 同様に、インデックスを作成してはいけない列もいくつかあります。一般的に、インデックスを作成すべきでない列には次の特性があります。 まず、クエリでほとんど使用または参照されない列にインデックスを作成しないでください。これらの列はほとんど使用されないため、インデックスを作成しても作成しなくてもクエリ速度は向上しないからです。逆に、インデックスを追加すると、システムのメンテナンス速度が低下し、必要なスペースが増加します。 データベースの機能に応じて、データベース デザイナーで、一意のインデックス、主キー インデックス、クラスター化インデックスの 3 種類のインデックスを作成できます。 ユニークインデックス 一意のインデックスとは、その中の 2 つの行が同じインデックス値を持つことを許可しないインデックスです。 局所性原理とディスクの事前読み取り ストレージメディアの特性上、ディスクアクセス自体はメインメモリよりはるかに遅くなります。機械的な動作消費に加え、ディスクアクセス速度はメインメモリの数百分の一になることがよくあります。したがって、効率を向上させるには、ディスクI/Oを最小限に抑える必要があります。この目標を達成するために、ディスクは厳密にオンデマンドで読み取られるのではなく、毎回事前に読み取られることがよくあります。必要なのが 1 バイトだけの場合でも、ディスクはこの位置から開始し、一定の長さのデータを順番に逆方向にメモリに読み込みます。この理論的根拠は、コンピュータ サイエンスにおける有名な局所性原理です。つまり、あるデータが使用されると、通常、近くのデータがすぐに使用されるということです。プログラム実行中に必要なデータは通常集中しています。 B-/+ツリーインデックスのパフォーマンス分析 これで、ようやく B-/+ ツリー インデックスのパフォーマンスを分析できるようになりました。 要約すると、インデックス構造として B ツリーを使用することは非常に効率的です。 B ツリーと B+ ツリーのデータ構造について学ぶ時間を取る必要があります。 1) Bツリー B ツリーの各ノードには、キー値と、キー値に対応するデータ オブジェクトのアドレスへのポインターが含まれているため、オブジェクトの検索を正常に行うには、ツリーのリーフ ノードに到達する必要はありません。 2) B+ツリー B+ツリーの非リーフノードに格納されているキーコードは、データオブジェクトのアドレスポインタを示すものではありません。非リーフノードはインデックス部分のみです。すべてのリーフ ノードは同じレイヤーにあり、対応するデータ オブジェクトのすべてのキー コードとストレージ アドレス ポインターが含まれており、リーフ ノードはキー コードに従って昇順にリンクされます。実際のデータ オブジェクトがキー番号ではなく追加された順序で格納されている場合、リーフ ノード インデックスは密なインデックスである必要があります。実際のデータがキーの順序で格納されている場合、リーフ ノード インデックスは疎なインデックスです。 インデックス作成のコストディスク容量使用中 DML(更新、削除、挿入)ステートメントの効率への影響 インデックスを再編成する必要があるため、追加、削除、および変更はインデックスに影響します。
インデックスを追加するのに適した列はどれですか? ① クエリ条件として使用されるクエリフィールドにはインデックスを作成する必要があります。 ② 一意性が低いフィールドは、頻繁に使用される場合でも、単独でインデックスを作成することには適していません。 性別が「男性」であるempから*を選択します ③フィールドを頻繁に更新し、インデックスを定義しない。 概要: インデックスは、次の条件を満たすフィールドに対してのみ作成する必要があります。 ① where条件で頻繁に使用されること ② フィールドの内容がユニークな値が少ないこと ③ フィールドの内容が頻繁に変更されないこと インデックス作成に関する注意事項テーブルを作成する 部門データを追加 PROCEDURE insert_dept(in start int(10),in max_num int(10)) を作成します。 始める i int DEFAULT 0 を宣言します。 自動コミットを0に設定します。 繰り返す i=i+1 と設定します。 dept値に挿入します((start+i)、rand_string(10)、rand_string(8)); i = max_numになるまで 繰り返し終了; 専念; 終わり insert_dept(100,10); 呼び出しを実行します。 主キーインデックスを作成する テーブル名を変更し、主キー (列名) を追加します。 共同インデックスを作成する alter table dept add index my_ind (dname,loc); // dname は左側の列、loc は右側の列です 知らせ: 1. 作成された複数列インデックスの場合、最初の部分が使用されないと、インデックスは作成されません。 使用率を照会する'handler_read%' のようなステータスを表示します。 誰もが注目できる点: handler_read_key: 値が高いほど良いです。値が高いほど、インデックスがクエリに使用される回数が多くなります。 MySQL 関連のコンテンツに興味のある読者は、このサイトの次のトピックをチェックしてください: 「MySQL インデックス操作スキルの概要」、「MySQL 共通関数の概要」、「MySQL ログ操作スキルの概要」、「MySQL トランザクション操作スキルの概要」、「MySQL ストアド プロシージャ スキルの概要」、および「MySQL データベース ロック関連スキルの概要」。 この記事が皆様のMySQLデータベース設計に役立つことを願っています。 以下もご興味があるかもしれません:
|
<<: 花火効果を実現するJavaScript(オブジェクト指向)
>>: docker compose の記述ルールについての簡単な説明
注: MySQL5.7 で root パスワードをクラックするには、パスワード認証をスキップしてデー...
この記事では、画像フォロー効果を実現するためのjQueryの具体的なコードを参考までに紹介します。具...
mysql 効率的なクエリMySQL は、左結合の速度を上げるために group by を犠牲にし...
別のライブラリから別のライブラリにデータをインポートする必要がある場合があり、このデータは CSV ...
目次環境: 1. Dockerはリモート接続アクセスを可能にするidea dockerプラグインをイ...
問題を見つける最近、仕事中に問題が見つかりました。問題は、MySQL ディスクがいっぱいだったことで...
ブラウザの問題かもしれないと思うかもしれませんが、スタイル定義の順序が間違っている可能性が高いです。...
目次1. はじめに2. データベースをバックアップする3. オリジナルのMysqlをアンインストール...
目次序文デザイン成し遂げるまとめ序文最近は、いつも延々とスワイプしています。 Weibo をチェック...
はじめに: インターフェイス デザイナーの Joshua Porter が自身のブログでこの記事を公...
本日の投稿では、Web デザインで使用される円形要素の優れた例をいくつか挙げ、美しい丸いボタン、メニ...
目次構成解析サービス構築ディレクトリ構造ファイルを作成インスタンス構成サービスを開始するテストRed...
voidキーワードの紹介まず、void キーワードは JavaScript で非常に重要なキーワード...
この記事の例では、参考までにvueタイムラインコンポーネントの具体的な実装コードを共有しています。具...
目次ユーザー管理新しいユーザーを作成するユーザー名の変更ユーザーのパスワードを設定するルートパスワー...