ホームページ > データベース > mysql チュートリアル > 高負荷アプリケーションの MySQL パフォーマンスを最適化するにはどうすればよいですか?

高負荷アプリケーションの MySQL パフォーマンスを最適化するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-28 20:03:22
オリジナル
507 人が閲覧しました

How Can You Optimize MySQL Performance for High-Load Applications?


導入

データベースを多用するアプリケーションでは、MySQL がバックボーンとして機能し、数百万のトランザクションを効率的に管理します。ただし、アプリケーションが拡大するにつれて、データベースのパフォーマンスの低下がボトルネックになる可能性があります。このガイドでは、MySQL のパフォーマンスを最適化し、高負荷下でもアプリケーションの高速性と応答性を維持するための実行可能な戦略を検討します。実際の例を用いて、インデックス作成、クエリの最適化、スキーマ設計、キャッシュなどのトピックを取り上げます。


1. データベーススキーマの最適化

適切に設計されたスキーマは MySQL のパフォーマンスの基礎です。重要な原則は次のとおりです:

適切なデータ型を使用する

ストレージを節約し、操作を高速化するには、ニーズに合った最小のデータ型を選択してください。例:

-- Instead of using VARCHAR(255) for a country code:
CREATE TABLE countries (
    country_code CHAR(2), -- Fixed size, more efficient
    name VARCHAR(100)
);
ログイン後にコピー
ログイン後にコピー

データベースを正規化する

正規化によりデータの冗長性が減り、データの整合性が向上します。

-- Example: Normalized design
CREATE TABLE authors (
    author_id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100)
);

CREATE TABLE books (
    book_id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(100),
    author_id INT,
    FOREIGN KEY (author_id) REFERENCES authors(author_id)
);
ログイン後にコピー
ログイン後にコピー

過剰な正規化を避ける

高読み取りワークロードの場合は、コストのかかる結合を避けるためにデータを非正規化します。

-- Example: Denormalized table for fast reads
CREATE TABLE book_details (
    book_id INT,
    title VARCHAR(100),
    author_name VARCHAR(100)
);
ログイン後にコピー
ログイン後にコピー

2. インデックス作成の活用

インデックスはクエリを高速化するために重要ですが、使いすぎると書き込み操作が遅くなる可能性があります。

頻繁にクエリされる列のインデックスを作成する

-- Example: Adding an index to a frequently queried column
CREATE INDEX idx_author_name ON authors (name);
ログイン後にコピー
ログイン後にコピー

複数の列に複合インデックスを使用する

複合インデックスにより、複数の列をフィルタリングする際のパフォーマンスが向上します。

-- Example: Composite index for multi-column queries
CREATE INDEX idx_book_author ON books (title, author_id);
ログイン後にコピー

冗長なインデックスを避ける

クエリを分析して、重複するインデックスが作成されていないことを確認します。


3. SQLクエリを最適化する

EXPLAIN を使用してクエリを分析する

EXPLAIN コマンドは、MySQL がクエリを実行する方法を示し、非効率性を特定するのに役立ちます。

EXPLAIN SELECT * FROM books WHERE title = 'Optimization Guide';
ログイン後にコピー

SELECT * を避ける

不要な列をフェッチするとメモリ使用量が増加し、クエリが遅くなります。

-- Avoid:
SELECT * FROM books;

-- Use:
SELECT title, author_id FROM books;
ログイン後にコピー

大規模なデータセットの行を制限する

フェッチされる行数を制限するには、LIMIT を使用します。

SELECT title FROM books LIMIT 10;
ログイン後にコピー

4. 結合の最適化

結合列に適切なインデックスを使用する

-- Adding indexes to join columns
CREATE INDEX idx_author_id ON books (author_id);
ログイン後にコピー

OUTER JOIN より INNER JOIN を優先する

INNER JOIN は一致する行のみをフェッチするため高速です。

-- Example: INNER JOIN
SELECT books.title, authors.name
FROM books
INNER JOIN authors ON books.author_id = authors.author_id;
ログイン後にコピー

5. キャッシュを使用する

クエリキャッシュ

MySQL のクエリ キャッシュを有効にして、頻繁に実行されるクエリの結果を保存します。

SET GLOBAL query_cache_size = 1048576; -- Set cache size
SET GLOBAL query_cache_type = 1; -- Enable query cache
ログイン後にコピー

Redis または Memcached で外部キャッシュを使用する

柔軟性を高めるために、クエリ結果を外部システムにキャッシュします。

-- Instead of using VARCHAR(255) for a country code:
CREATE TABLE countries (
    country_code CHAR(2), -- Fixed size, more efficient
    name VARCHAR(100)
);
ログイン後にコピー
ログイン後にコピー

6. パーティショニングとシャーディング

水平分割

日付などのキーに基づいて、大きなテーブルを小さなテーブルに分割します。

-- Example: Normalized design
CREATE TABLE authors (
    author_id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100)
);

CREATE TABLE books (
    book_id INT AUTO_INCREMENT PRIMARY KEY,
    title VARCHAR(100),
    author_id INT,
    FOREIGN KEY (author_id) REFERENCES authors(author_id)
);
ログイン後にコピー
ログイン後にコピー

シャーディング

データを複数のデータベースに分散して水平方向に拡張します。


7. パフォーマンスの監視と調整

スロークエリログを有効にする

さらなる分析のために遅いクエリをログに記録します。

-- Example: Denormalized table for fast reads
CREATE TABLE book_details (
    book_id INT,
    title VARCHAR(100),
    author_name VARCHAR(100)
);
ログイン後にコピー
ログイン後にコピー

パフォーマンススキーマの使用

MySQL のパフォーマンス スキーマを利用してメトリクスを収集します。

-- Example: Adding an index to a frequently queried column
CREATE INDEX idx_author_name ON authors (name);
ログイン後にコピー
ログイン後にコピー

結論

MySQL のパフォーマンスの最適化は、スキーマ設計、インデックス作成、クエリ調整、キャッシュを含む多面的なプロセスです。ここで説明した戦略を適用することで、高負荷下でもアプリケーションのデータベースが堅牢かつ効率的に維持されるようにすることができます。定期的な監視と調整により、アプリケーションの規模が拡大してもパフォーマンスの問題を回避できます。

以上が高負荷アプリケーションの MySQL パフォーマンスを最適化するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート