ホームページ >データベース >mysql チュートリアル >MySQL 最適化の一般的な方法

MySQL 最適化の一般的な方法

步履不停
步履不停オリジナル
2019-07-01 17:55:273891ブラウズ

MySQL 最適化の一般的な方法

1. 最も適切なフィールド属性を選択します
テーブル内のフィールドの幅をできるだけ小さく設定します: char の上限は 255 ですbytes (固定占有スペース)、varchar の上限は 65535 バイト (実際に占有されるスペース)、text の上限は 65535 バイトです。
フィールドを NOT NULL に設定してみてください。クエリの実行時に、データベースは NULL 値を比較する必要はありません。

2. サブクエリ (Sub-Queries) の代わりに結合 (JOIN) を使用します。
結合 (JOIN) の方が効率的である理由は、MySQL がクエリを実行する必要がないためです。メモリ内 この論理クエリを完了するための一時テーブルを作成するには、2 つの手順が必要です (結合クエリ条件とインデックスの方が高速です)。

3. 手動で作成した一時テーブルの代わりにユニオン (UNION) を使用する
一時テーブルの使用を必要とする 2 つ以上の SELECT クエリを 1 つのクエリに結合します。
SELECT 名前、電話番号 FROM クライアント UNION SELECT 名前、生年月日 FROM 著者 UNION SELECT 名前、サプライヤー FROM 製品;

4. トランザクション
サブクエリ (Sub -クエリ)、接続(JOIN)、ユニオン(UNION)を使用してさまざまなクエリを作成できますが、すべてのデータベース操作が 1 つまたはいくつかの SQL ステートメントだけで完了できるわけではありません。特定の種類の作業を完了するには、一連のステートメントが必要になることがよくあります。
結果は、ステートメント ブロック内のすべてのステートメントが正常に動作するか、すべてが失敗するかのどちらかになります。つまり、データベース内のデータの一貫性と完全性を維持できます。物事は BEGIN キーワードで始まり COMMIT キーワードで終わります。この期間中に SQL 操作が失敗した場合、ROLLBACK コマンドによってデータベースを BEGIN が開始される前の状態に復元できます。

5. テーブルのロック
トランザクションはデータベースの整合性を維持するための非常に優れた方法ですが、その排他性により、特にデータベースのパフォーマンスに影響を与えることがあります。大規模なアプリケーション システム。トランザクションの実行中はデータベースがロックされるため、他のユーザーのリクエストはトランザクションが終了するまで待つことしかできません。
LOCK TABLE 在庫 WRITE
在庫から数量を選択
WHEREItem='本';
...
在庫を更新 SET 数量=11
WHEREItem='本';
UNLOCK TABLES
ここでは、SELECT ステートメントを使用して初期データを取得し、いくつかの計算を通じて UPDATE ステートメントを使用して新しい値をテーブルに更新します。 WRITE キーワードを含む LOCK TABLE ステートメントは、UNLO​​CK TABLES コマンドが実行される前に、挿入、更新、または削除のためのインベントリへの他のアクセスがないことを保証します。

6. 外部キーの使用
テーブルをロックする方法ではデータの整合性を維持できますが、データの関連性は保証できません。現時点では、外部キーを使用できます。たとえば、外部キーを使用すると、各販売レコードが既存の顧客を指していることを確認できます。ここで、外部キーは、customerinfo テーブルの CustomerID を salesinfo テーブルの CustomerID にマップできます。有効な CustomerID のないレコードは更新されず、salesinfo に挿入されません。

CREATE TABLE customerinfo 
( 
CustomerID INT NOT NULL , 
PRIMARY KEY ( CustomerID ) 
) TYPE = INNODB; 
CREATE TABLE salesinfo 
( 
SalesID INT NOT NULL, 
CustomerID INT NOT NULL, 
PRIMARY KEY(CustomerID, SalesID), 
FOREIGN KEY (CustomerID) REFERENCES customerinfo 
(CustomerID) ON DELETECASCADE 
) TYPE = INNODB;


例のパラメータ「ON DELETE CASCADE」に注意してください。このパラメータにより、customerinfo テーブル内の顧客レコードが削除されると、salesinfo テーブル内の顧客に関連するすべてのレコードも自動的に削除されます。 MySQL で外部キーを使用する場合は、テーブルの作成時にテーブル タイプをトランザクション セーフな InnoDB タイプとして定義することを忘れないでください。このタイプは、MySQL テーブルのデフォルトのタイプではありません。これは、CREATE TABLE ステートメントに TYPE=INNODB を追加することで定義されます。

7. インデックスの使用
クエリ ステートメントに MAX ()、MIN ()、ORDERBY などのコマンドが含まれている場合、パフォーマンスの向上はより明らかです。
インデックスは、JOIN、WHERE 判定、ORDER BY 並べ替えに使用されるフィールドに構築する必要があります。多数の重複値を含むデータベース内のフィールドにインデックスを作成しないようにしてください。 ENUM タイプのフィールドの場合、customerinfo の "province".. フィールドなど、重複する値が多数存在する可能性があります。そのようなフィールドにインデックスを作成しても役に立ちません。逆に、データベースのパフォーマンスを低下させます。

8. 最適化されたクエリ ステートメント
SELECT FROM order WHERE YEAR(OrderDate)<2001;
SELECT FROM order WHERE OrderDate<"2001-01-01";

SELECT FROM inventory WHERE Amount/7SELECT FROM inventory WHERE AmountMySQL にクエリ内で自動型変換を実行させることは避けてください。変換プロセスにより、インデックスが無効になります。

SQL に関連する技術的な記事については、SQL チュートリアル 列にアクセスして学習してください。

以上がMySQL 最適化の一般的な方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。