1 データベース インデックスを作成するための一般的なルールは次のとおりです。 1. テーブルの主キーと外部キーにはインデックスが必要です。 A. 複合インデックス内のプライマリ列フィールド(通常は選択性の高いフィールド)を正しく選択します。 8. 頻繁にデータ操作を実行するテーブルには、インデックスをあまり多く作成しないでください。 上記は、インデックスを設定する際の一般的な判断基準です。 2. 数千万件のレコードを持つMySQLデータベースのインデックス作成とパフォーマンス向上方法に関する事項1. 注記:まず、テーブルスペースとディスクスペースが十分にあるかどうかを検討する必要があります。インデックスもデータの一種であり、インデックスを作成すると必然的に多くのテーブルスペースを占有することになります。したがって、大きなテーブルのインデックスを作成する場合、最初に考慮すべきことはスペース容量です。 2. パフォーマンス調整:最初に考慮すべき点はディスク I/O です。物理的には、インデックスとデータを(アレイに関係なく)異なるディスクに分散させるようにしてください。論理的には、データ テーブルスペースはインデックス テーブルスペースとは別です。これは、インデックスを構築するときに従うべき基本原則です。 次に、インデックスを作成するときはテーブル全体をスキャンする必要があることがわかっているので、初期化パラメータ db_file_multiblock_read_count の値を増やすことを検討する必要があります。通常は 32 以上に設定します。 また、インデックスを作成する際には、テーブル全体のスキャンに加え、データに対する大量のソート操作も必要になります。そのため、ソート領域のサイズを調整する必要があります。 9i より前では、セッション レベルで sort_area_size のサイズを増やすことができます (たとえば、100 m 以上に設定)。 9i 以降では、初期化パラメータ workarea_size_policy の値が TRUE の場合、ソート領域は pga_aggregate_target から自動的に割り当てられます。 最後に、インデックスを作成するときに、nologging オプションを追加できます。これにより、インデックス作成中に生成される再実行の量が削減され、実行速度が向上します。 MySqlインデックスを最適化する際に注意すべき問題適切に設計された MySql インデックスにより、データベースのパフォーマンスが向上し、データベースの効率が大幅に向上します。 MySQL インデックスを設計する際には、いくつか注意すべき点があります。 1. インデックスを作成するクエリが主な焦点となるアプリケーションの場合、インデックスは特に重要です。多くの場合、パフォーマンスの問題は、単にインデックスの追加を忘れたり、より効果的なインデックスを追加できなかったりすることによって引き起こされます。インデックスが追加されていない場合、特定のデータが 1 つだけであっても、特定のデータを見つけるためにテーブル全体のスキャンが実行されます。テーブルに大量のデータがあるが、条件を満たす結果が少ない場合、インデックスを追加しないと致命的なパフォーマンスの低下が発生します。ただし、すべての状況でインデックスを作成する必要はありません。たとえば、性別には 2 つの値しかない場合があります。インデックスを作成しても利点がないだけでなく、更新速度にも影響します。これを過剰インデックスと呼びます。 2. 総合指数例えば、次のような文があります。 エリアが「北京」かつ年齢が22のユーザーから*を選択します。 MySQL クエリは一度に 1 つのインデックスしか使用できないため、それぞれ area と age に単一のインデックスを作成すると、インデックスなしの完全なテーブル スキャンに比べて効率が大幅に向上しますが、area 列と age 列に複合インデックスを作成すると、さらに効率が向上します。 (エリア、年齢、 3. インデックスにはNULL値を持つ列は含まれません列に NULL 値が含まれている限り、その列はインデックスに含まれません。複合インデックス内の 1 つの列に NULL 値が含まれている限り、その列はこの複合インデックスに対して無効になります。したがって、データベースを設計するときに、フィールドのデフォルト値を NULL に設定しないでください。 4. 短いインデックスを使用するシリーズ列にインデックスを付ける場合、可能であればプレフィックスの長さを指定する必要があります。たとえば、CHAR(255)列があり、最初の10文字または20文字の範囲内でほとんどの値が一意である場合は、列全体にインデックスを付けないでください。短いインデックスを使用すると、クエリ速度が向上するだけでなく、ディスク領域と I/O 操作も節約できます。 5. ソートインデックスの問題MySQL クエリは 1 つのインデックスのみを使用するため、where 句でインデックスがすでに使用されている場合、order by 句の列ではインデックスは使用されません。したがって、データベースのデフォルトのソートで要件を満たすことができる場合は、ソート操作を使用しないでください。複数の列のソートを含めないようにしてください。必要な場合は、これらの列に複合インデックスを作成するのが最適です。 6. 類似文操作一般的に言えば、like 操作の使用は推奨されません。使用する必要がある場合、どのように使用するかも問題です。 「%a%」のようにはインデックスを使用しませんが、「aaa%」のようにはインデックスを使用できます。 7. 列に対して操作を実行しないYEAR(adddate) のユーザーから * を選択します 8. NOT INや演算は使用しないNOT IN 操作も IN 操作もインデックスを使用せず、完全なテーブルスキャンが実行されます。 NOT INはNOT EXISTSに置き換えることができ、id3の場合はid>3またはidを使用できます。 インデックスの追加例: [shanghaiDB].[dbo].[Activity](AUDITSTATUS) に(ONLINE=ON) を指定して IDX_AUDITSTATUS インデックスを作成します。 [nantongDB].[dbo].[Orders](ANUM,MID) に IDX_ANUMMID インデックスを作成します (ONLINE=ON) Usercenter.[dbo].MO(SiteCode) に IDX_SiteCode インデックスを作成します (ONLINE=ON) [all].[dbo].[AccessLog](AccessDt) で(ONLINE=ON) を指定して IDX_AccessDt インデックスを作成します。 インデックスの作成 注: 大きなテーブルのインデックスを作成する場合は、ONLINE パラメータを追加することを忘れないでください。最近、データベースを最適化していました。2億件のレコードがあるテーブルがあり、ジョイントインデックスを追加する必要があることがわかりました。共通のcreate index index_name on tablename (entp_id,sell_date)を使用しました。結果は悲惨でした。すべてのDMLステートメントがブロックされ、システムを正常に使用できなくなりました。幸いなことに、夜の10時で、ユーザーはあまりいませんでした。1時間後、インデックスが完了し、ブロックが解消されました。 オンラインで調べたところ、オンライン パラメータを追加すると、すべての DML ステートメントをブロックせずにオンラインでインデックスを作成できることがわかりました。これは苦労して学んだ教訓であり、皆さんと共有したいと思います。オンラインで追加する場合と追加しない場合の具体的な違いは次のとおりです。 インデックス作成に対する DML 操作の影響。 作成操作中に他のプロセスがこのインデックスに対応するデータに対して DML 操作を実行している場合、作成操作は影響を受けます。 SQL> テーブルテストを作成します (ID 番号、名前 varchar2(20)); テーブルが作成されました。 次にセッションを再開します。 SQL> テスト値に挿入(1、 'lms'); 1 行が作成されました。 <コミットなし> SQL> test(id) にインデックス t1 を作成します。 test(id)にインデックスt1を作成する * 1行目にエラーがあります: ORA-00054: リソースがビジー状態のため、NOWAIT を指定して取得しました パラメータ「online」を追加します。このパラメータを追加すると、作成プロセス中にインデックスをオンラインに保つだけでなく、Oracle はインデックスを作成する前にすべての DML 操作が完了するのを待機し、その後 DDL ロックを取得して作成を開始します。 SQL> test(id) にインデックス t1 をオンラインで作成します。 <コミットする前に保留> <コミット後> SQL> コミット; コミットが完了しました。 インデックスが変更されました。 コミットしない場合は、上記の操作は保留されます。 したがって、将来的にインデックスを作成および再構築するときには、オンラインで追加するのが最適です。 MySQL フィールドがインデックスに適しているかどうかについては、これで説明は終わりです。MySQL フィールド インデックスに関するより詳しい内容については、123WORDPRESS.COM の過去の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: Docker で Redis センチネル モードを構成する方法 (複数のサーバー上)
>>: 支払いカウントダウンを実現し、ホームページに戻るためのjs
昨日 HTML を少し学んだばかりで、JD.com の検索バーを作るのが待ちきれませんでした。 作っ...
1: 文字列を区切るためのストアドプロシージャを定義する 区切り文字 $$ `mess`$$ を使う...
Windows システム向け MySQL インストール チュートリアルダウンロード1. https:...
目次導入子プロセスプロセスを非同期的に作成する同期作成プロセス導入Node.js のメイン イベント...
翻訳プログラムを例に挙げてみます。前回はWindowsでのアプリケーションのパッケージ化についてお話...
今日は、開発でよく使われる、非常に便利な HTML タグをいくつかまとめてみたいと思います。これらの...
0. 背景ハードウェア: Xiaomi Notebook Air 13/Inter Core i7-...
MySQL 8.0.25解凍版のインストールチュートリアル、参考までに具体的な内容は以下のとおりです...
序文: 「MySQL 入門」シリーズの記事は終了しました。今後も引き続き MySQL に焦点を当て、...
目次1 違い1.1 スペース占有1.2 表現範囲1.3 タイムゾーン2 テスト3つの選択肢MySQL...
序文nginx モジュールには、公式とサードパーティの 2 種類があります。nginx のインストー...
1. アップグレードプロセス: sudo apt-get updateパッケージが見つからない、パッ...
複合インデックス (結合インデックスとも呼ばれます) は、複数の列に対して作成されるインデックスです...
導入今日は Python でデータベースに接続する方法を学んだので、MySQL データベースをインス...
この記事では、MySQL のデータベース テーブルの容量を確認するためのコマンド ステートメントを紹...