データベースのパフォーマンスは非常に重要であることは誰もが知っていると思います。mysqlデータベースを 4 つの側面から最適化しましょう。
1. 最も適切なフィールド 属性を選択します
MySQL は大量のデータへのアクセスを十分にサポートしますが、一般的に言えば、データベース内のテーブルが小さいほど、そのテーブルに対して実行される クエリ は高速になります。したがって、テーブルを作成するときに、パフォーマンスを向上させるために、テーブル内のフィールドの幅をできるだけ小さく設定できます。たとえば、郵便番号フィールドを定義する場合、CHAR(255) に設定すると、CHAR(6) で問題ないため、VARCHAR 型を使用しても明らかに冗長になります。同様に、可能であれば、整数フィールドを定義するには BIGIN の代わりに MEDIUMINT を使用する必要があります。
効率を向上させるもう 1 つの方法は、可能であればフィールドを NOT NULL に設定して、今後クエリを実行するときにデータベースが NULL 値を比較する必要がないようにすることです。
「都道府県」や「性別」などの一部のテキストフィールドについては、ENUM タイプとして定義できます。 MySQL では ENUM 型は数値データとして扱われ、数値データはテキスト型よりもはるかに高速に処理されるためです。このようにして、データベースのパフォーマンスを向上させることができます。
2. サブクエリ (サブクエリ) の代わりに結合 (JOIN) を使用する
MySQL は 4.1 から SQL サブクエリをサポートします。この手法では、SELECT ステートメントを使用してクエリ結果の単一列を作成し、この結果を別のクエリのフィルター条件として使用できます。たとえば、基本顧客情報テーブルに注文がない顧客を削除したい場合、サブクエリを使用して、まず売上情報テーブルから注文を行ったすべての顧客の ID を取得し、その結果を次のようなメイン クエリ: DELETE
FROM customerinfo WHERE CustomerID NOT in (SELECT CustomerID FROM salesinfo)
サブクエリを使用すると、論理的に複数の手順を一度に完了する必要がある多くの SQL 操作を完了できます。トランザクションを避けるか、テーブルがロックされており、書き込みが容易になります。ただし、場合によっては、サブクエリをより効率的な結合 (JOIN) に置き換えることができます。たとえば、注文レコードを持たないすべてのユーザーを抽出したいとします。次のクエリを使用して完了できます:
SELECT * FROM customerinfo WHERE CustomerID NOT in (SELECT CustomerID FROM salesinfo )
接続を使用する場合 ( JOIN)... を完了するには このクエリははるかに高速に動作します。特に salesinfo テーブルに CustomerID のインデックスがある場合、クエリは次のようになります:
SELECT * FROM customerinfo
LEFT JOIN salesinfoON customerinfo.CustomerID=salesinfo.
CustomerID
WHERE salesinfo.CustomerID IS NULL
結合 (JOIN).. これがより効率的である理由は、MySQL がこの論理 2 段階のクエリを完了するためにメモリ内に一時テーブルを作成する必要がないためです。
3. 手動で作成した一時テーブルを置き換えるにはユニオン (
UNION
) を使用します
MySQL はバージョン 4.0 以降、一時テーブルを使用する必要がある 2 つ以上の SELECT クエリを 1 つのクエリに結合できる UNION クエリをサポートします。クライアントのクエリ セッションが終了すると、データベースが整然と効率的に保たれるように、一時テーブルは自動的に削除されます。 UNION を使用してクエリを作成する場合、複数の SELECT ステートメントを接続するキーワードとして UNION を使用するだけで済みます。すべての SELECT ステートメントのフィールドの数が同じである必要があることに注意してください。次の例は、UNION を使用したクエリを示しています。 クライアントから名前、電話番号を選択UNION
著者から名前、生年月日
を選択
UNION製品から名前、サプライヤーを選択
4.サブクエリ、結合 (JOIN)、ユニオン (UNION) を使用してさまざまなクエリを作成できますが、すべての データベース操作 を 1 つまたはいくつかの SQL ステートメントだけで実行できるわけではありません。特定の種類の作業を完了するには、一連のステートメントが必要になることがよくあります。ただし、この場合、このステートメント ブロック内の特定のステートメントが誤って実行されると、ステートメント ブロック全体の動作が不確実になります。特定のデータを 2 つの関連するテーブルに同時に挿入したいとします。最初のテーブルが正常に更新された後、データベースで予期しない状況が発生し、2 番目のテーブルの操作が完了しない場合があります。このようにして、データは不完全になり、データベース内のデータさえも破壊されます。この状況を回避するには、トランザクションを使用する必要があります。その機能は、ステートメント ブロック内のすべてのステートメントが成功するか失敗するかのいずれかです。つまり、データベース内のデータの一貫性と完全性を維持できます。物事は BEGIN キーワードで始まり COMMIT キーワードで終わります。この期間中に SQL 操作が失敗した場合、ROLLBACK コマンドによってデータベースを BEGIN が開始される前の状態に復元できます。
BEGIN;
INSERT INTO salesinfo SET CustomerID=14;
UPDATE inventory SET Quantity=11
WHERE item='book';
COMMIT;
トランザクションのもう 1 つの重要な役割は、複数のユーザーが同じ商品を同じ場所で使用する場合です。同時に、データ ソースにアクセスするときに、データベースをロックする方法を使用して安全なアクセス方法をユーザーに提供し、ユーザーの操作が他のユーザーによって干渉されないようにすることができます。
以上がMySQL データベースを最適化するための簡単な方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。