この記事では、インデックスと、それらを使用してMySQLデータベースクエリのパフォーマンスを向上させる方法について説明します。
MySQLのデータベースインデックスを使用すると、 SELECTのパフォーマンスを高速化できます。 クエリステートメント。小さなテーブルの場合、インデックスはあまり役に立ちません。ただし、大量のデータを含むテーブルがある場合、インデックスを使用するとパフォーマンスが大幅に向上します。
次の動作はすべて、テーブルにインデックスを追加することでメリットが得られる可能性があることを示しています。
- サイトの読み込みが非常に遅いか、まったく読み込まれません。
- アプリケーションがデータベースに接続できません。
- データベースクエリはバックアップされます。
これらの問題のいずれかが発生した場合は、データベースクエリを分析し、インデックスの追加を検討する必要があります。
マネージドVPSまたはマネージド専用サーバーを使用している場合は、インデックスの追加に加えて、ソートバッファーサイズを増やすことも役立つ場合があります。 https://my.a2hosting.comのカスタマーポータルでチケットを開いて、このオプションについてGuruCrewと話し合ってください。インデックスを使用することでメリットが得られる可能性のあるテーブルを特定するには、データベースクエリを分析する必要があります。 EXPLAIN SELECT ステートメントはこれを行うのに役立ちます。データベースクエリを分析するには、次の手順に従います。
- SSHを使用してアカウントにログインします。
- コマンドプロンプトで、 usernameを置き換えて次のコマンドを入力します A2ホスティングアカウントのユーザー名とデータベース データベースの名前:
mysql -u username -p database
- [パスワードの入力]プロンプトで、パスワードを入力します。 mysql>プロンプトが表示されます。
-
次のSQLコマンドを入力します。
EXPLAIN SELECT * FROM table_name WHERE conditions \G
独自のアプリケーションコードを作成する場合は、 SELECTをすでに知っています。 データの取得に使用するステートメント。 WordPressやPrestaShopなどのサードパーティアプリケーションを使用している場合は、ソースコードまたはデータベースログを調べて、正確な SELECTを特定する必要がある場合があります。 データの取得に使用されるステートメント。 -
EXPLAIN SELECTからの出力 ステートメントは、MySQLクエリオプティマイザがクエリを実行する方法を示しています。たとえば、次の出力について考えてみます。
mysql> EXPLAIN SELECT title FROM employees WHERE lastname LIKE 'T%' \G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: employees type: ALL possible_keys: NULL key: NULL key_len: NULL ref: NULL rows: 142 Extra: Using where 1 row in set (0.00 sec)
この例の出力:
- possible_keys およびキー 値は両方ともNULL 、これは、MySQLにこのクエリに使用できるインデックスがないことを示します。
- 行 値は、MySQLがこのクエリに対して142行を読み取ることを示します。テーブルに合計142行ある場合、これはMySQLがすべての行を調べて結果セットを生成する必要があることを意味します。大きなテーブルの場合、これにはかなりの時間がかかる可能性があります。
一方、 index_nameというインデックスを作成する場合 姓の場合 列の場合、MySQLは同じクエリに対して次の出力を生成する可能性があります:
mysql> EXPLAIN SELECT title FROM employees WHERE lastname LIKE 'T%' \G *************************** 1. row *************************** id: 1 select_type: SIMPLE table: employees type: range possible_keys: index_name key: index_name key_len: 22 ref: NULL rows: 17 Extra: Using where; Using index 1 row in set (0.00 sec)
ご覧のとおり、possible_keys およびキー 値は、MySQLがクエリの最適化に使用できるインデックスを検出したことを示します。さらに、MySQLは、142行すべてではなく、17行のみを読み取って結果セットを生成します。 (これは、テーブルに17行あり、姓が「T」で始まることを意味します。)最後に、追加 値は、MySQLがクエリにインデックスを使用することも示します。
テーブル内のインデックスの追加、削除、表示
データベースクエリを分析し、パフォーマンスのボトルネックがどこにあるかを判断したら、インデックスを追加する準備が整います。これを行うには、次の手順に従います。
- SSHを使用してアカウントにログインします。
- コマンドプロンプトで、 usernameを置き換えて次のコマンドを入力します A2ホスティングアカウントのユーザー名とデータベース データベースの名前:
mysql -u username -p database
- [パスワードの入力]プロンプトで、パスワードを入力します。 mysql>プロンプトが表示されます。
-
テーブルにインデックスを追加するには、次のSQLコマンドを入力します。 table_nameを置き換えます テーブルの名前index_name 新しいインデックスの名前(任意の名前にすることができます)、および table_column インデックスを追加するテーブル列の名前:
ALTER TABLE table_name ADD INDEX index_name (table_column);
インデックスはパフォーマンスを向上させることができますが、インデックスの数が多すぎると、パフォーマンスに悪影響を与える可能性もあります。これは、テーブルに含まれるインデックスが多いほど、それらを最新の状態に保つためにMySQLが実行する必要のある作業が増えるためです。秘訣は、パフォーマンスを向上させるのに十分なインデックス間の適切なバランスを見つけることですが、パフォーマンスに悪影響を与えるほど多くはありません。 -
テーブルからインデックスを削除するには、次のSQLコマンドを入力します。 table_nameを置き換えます テーブルの名前に置き換え、 index_nameを置き換えます 削除するインデックスの名前:
ALTER TABLE table_name DROP INDEX index_name;
-
テーブルのすべてのインデックスを表示するには、次のSQLコマンドを入力します。 table_nameを置き換えます テーブルの名前:
SHOW INDEX FROM table_name \G
インデックスを作成したら、 EXPLAIN SELECTを使用する必要があります クエリがどのように影響を受けるかを確認するには、もう一度ステートメントを実行します。さらに、データベースのパフォーマンスを引き続き監視して、改善があるかどうかを確認する必要があります。データベースに最適なインデックスの数を見つけるために、一連のテストを実行する必要がある場合があります。
- MySQLの最適化とインデックスの詳細については、https://dev.mysql.com/doc/refman/5.5/en/optimization-indexes.htmlにアクセスしてください。
- EXPLAINの詳細については ステートメントについては、https://dev.mysql.com/doc/refman/5.5/en/explain.htmlにアクセスしてください。