この記事の内容は作業効率の向上に関するものです。MySQL の最適化スキルは、必要な方の参考になれば幸いです。
1. where、order by、group by に使用されるすべての列にインデックスを追加します。
1) レコードが一意にマークされるようにするだけでなく、インデックスによって次のことが可能になります。また、データベースから結果をより速く取得できるのは MySQL サーバーです。インデックスは並べ替えにおいても非常に重要な役割を果たします。
Mysql のインデックスは追加のスペースを占有し、挿入、削除、更新のパフォーマンスがある程度低下する可能性があります。ただし、テーブルに 10 行を超えるデータがある場合は、インデックスを作成すると検索の実行時間を大幅に短縮できます。
2) 運用環境でクエリがどのように動作するかをより明確に理解するために、「最悪の場合のデータ サンプル」を使用して MySql クエリをテストすることを強くお勧めします。
3) 500 行を超えるデータベース テーブルで次のクエリ ステートメントを実行しているとします。
mysql>select customer_id, customer_name from customers where customer_id='345546'
上記のクエリは、Mysql サーバーにフル テーブル スキャンを実行させて、データが求められています。
4) モデル、Mysql は、クエリ ステートメントのパフォーマンスを分析するための特別な Explain ステートメントを提供します。キーワードの後にクエリ ステートメントを追加すると、MySql はオプティマイザがそのステートメントに関して持っているすべての情報を表示します。
Explain ステートメントを使用して上記のクエリを分析すると、次の分析結果が得られます:
mysql> explain select customer_id, customer_name from customers where customer_id='140385'; +----+-------------+-----------+------------+------+---------------+------+---------+------+------+----------+-------------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-----------+------------+------+---------------+------+---------+------+------+----------+-------------+| 1 | SIMPLE | customers | NULL | ALL | NULL | NULL | NULL | NULL | 500 | 10.00 | Using where |
ご覧のとおり、オプティマイザーは非常に重要な情報を表示します。 -データベーステーブルを調整します。まず、キー列が Null であるため、MySql はテーブル全体のスキャンを実行します。次に、MySql サーバーは、このクエリを完了するために 500 行のデータをスキャンすることを明らかにしました。
5) 上記のクエリを最適化するには、customer_id 列にインデックス m を追加するだけです:
mysql> Create index customer_id ON customers (customer_Id); Query OK, 0 rows affected (0.02 sec) Records: 0 Duplicates: 0 Warnings: 0
Explain ステートメントを再度実行すると、次の結果が得られます。 :
mysql> Explain select customer_id, customer_name from customers where customer_id='140385'; +----+-------------+-----------+------------+------+---------------+-------------+---------+-------+------+----------+-------+| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-----------+------------+------+---------------+-------------+---------+-------+------+----------+-------+| 1 | SIMPLE | customers | NULL | ref | customer_id | customer_id | 13 | const | 1 | 100.00 | NULL | +----+-------------+-----------+------------+------+---------------+-------------+---------+-------+------+----------+-------+
2. Union を使用して Like ステートメントを最適化する
1) 場合によっては、クエリ内の比較に or 演算子を使用する必要があります。 or キーワードが where 句で頻繁に使用されすぎると、MySQL オプティマイザがレコードを取得するために誤ってフル テーブル スキャンを選択する可能性があります。 Union 句を使用すると、特にクエリの一方に最適化されたインデックスがあり、もう一方のクエリにも最適化されたインデックスがある場合に、クエリの実行が高速になります。
たとえば、first_name と last_name にそれぞれインデックスがある場合、次のクエリ ステートメントを実行します。
mysql> select * from students where first_name like 'Ade%' or last_name like 'Ade%'
上記のクエリと、union を使用して 2 つのクエリ ステートメントをマージする次のクエリを比較すると、はるかに遅いです。
mysql> select * from students where first_name like 'Ade%' union all select * from students wherelast_name like 'Ade%'
3. 先頭にワイルドカードを含む式の使用を避ける
クエリに先頭にワイルドカードがある場合、Mysql はインデックスを使用できません。上記の Student テーブルを例にとると、次のクエリにより、MySQL はテーブル全体のスキャンを実行し、適切なタイミングで first_name フィールドにインデックスを追加します。
mysql> select * from students where first_name like '%Ade'
Explain 分析を使用すると、次の結果が得られます:
| possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------------+| 1 | SIMPLE | students | NULL | ALL | NULL | NULL | NULL | NULL | 500 | 11.11 | Using where | +----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------------+
上に示したように、MySQL は 500 行のデータすべてをスキャンするため、クエリが非常に遅くなります。
4. データベース アーキテクチャの最適化
1) 正規化
まず、多少の損失がある場合でも、すべてのデータベース テーブルを正規化します。たとえば、顧客と注文のデータを記録するために 2 つのテーブルを作成する必要がある場合は、注文テーブル内の顧客 ID で顧客を参照する必要があり、その逆ではありません。以下の図は、データの冗長性を持たずに設計されたデータベース アーキテクチャを示しています。
5. 最適なデータ型を使用する
1) MySQL は、整数、浮動小数点、倍精度浮動小数点数、日付などのさまざまなデータ型をサポートします。 、datetime、varchar、text など。データベース テーブルを設計するときは、特性を満たすことができる最も短いデータ型を使用するようにしてください。
たとえば、システム ユーザー テーブルを設計していて、ユーザー数が 100 を超えない場合は、user_ud に「TINYINT」タイプを使用する必要があります。このタイプの値の範囲は -128 ~ 128 です。 。フィールドに日付型の値を格納する必要がある場合は、クエリ時に複雑な型変換を実行する必要がないため、日時型を使用することをお勧めします。
値がすべて数値型の場合は、Integer を使用します。計算を実行するとき、Integer 型の値は Text 型の値よりも高速です。
以上が作業効率の向上: MySQL 最適化のヒントの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。