sql >> データベース >  >> RDS >> Mysql

MySQLテーブルにインデックスを作成するためのベストプラクティス–ローリングインデックスビルド

    MySQLテーブルに適切なインデックスを設定することで、SELECTクエリのパフォーマンスを大幅に向上させることができます。ただし、テーブルにインデックスを追加すること自体がコストのかかる操作であり、テーブルのサイズによっては完了するまでに長い時間がかかる場合があることをご存知ですか?この間、システムリソースがインデックス作成作業でもビジー状態になるため、クエリのパフォーマンスが低下する可能性もあります。このブログ投稿では、通常のワークロードに影響を与えないようにMySQLインデックス作成プロセスを最適化する方法について説明します。

    MySQLローリングインデックスの作成

    このアプローチを「ローリングインデックス作成」と呼びます。MySQLマスタースレーブレプリカセットがある場合は、一度に1ノードずつローリング方式でインデックスを作成できます。マスターのパフォーマンスに影響を与えないように、スレーブノードでのみインデックスを作成する必要があります。スレーブでインデックスの作成が完了すると、現在のマスターを降格し、最新のスレーブの1つを新しいマスターとして昇格させます。このとき、インデックスの作成は元のマスターノード(現在はスレーブ)で続行されます。フェイルオーバーが原因でデータベースへの接続が失われるまでの期間は短時間(数十秒)になりますが、これはアプリケーションレベルで再試行することで解決できます。

    ローリングインデックス作成のパフォーマンス上の利点

    ローリングインデックス作成のパフォーマンス上の利点を理解するために、小さな実験を行いました。

    このテストでは、Sysbenchを使用して作成されたMySQLデータセットを使用しました。このデータセットには、それぞれ5,000万行の3つのテーブルがあります。バランスの取れたワークロード(50%の読み取りと50%の書き込み)を10分間実行する30のクライアントでMySQLマスターに負荷を生成し、同時に、2つのシナリオでテーブルの1つに単純なセカンダリインデックスを構築しました:

    >
    1. マスター上で直接インデックスを作成する
    2. スレーブでのインデックスの作成

    MySQLテストベッドの構成

    MySQLインスタンスタイプ 8GBのRAMを搭載したEC2インスタンスm4.large
    展開タイプ 準同期レプリケーションを使用した2ノードマスタースレーブセット
    MySQLバージョン 5.7.25

    パフォーマンス結果

    シナリオ ワークロードスループット(1秒あたりのクエリ数) 95パーセンタイルレイテンシ
    マスターでのインデックスの作成 453.63 670ミリ秒
    ローリングインデックスの作成 790.03 390ミリ秒

    お持ち帰り

    MySQLマスターで直接インデックス作成を実行することで、ローリング操作を通じてMySQLスレーブでインデックス作成を実行することで達成されたスループットの60%しか体験できませんでした。マスターサーバーでインデックスの作成が行われた場合、クエリの95パーセンタイルレイテンシも1.8倍高くなりました。

    #MySQLテーブルにインデックスを作成するためのベストプラクティスクリックしてツイート

    ローリングインデックス作成の自動化

    ScaleGridは、MySQLデプロイメントのローリングインデックス作成を、それを開始するためのシンプルなユーザーインターフェイスで自動化します。

    上記のUIで、データベースとテーブル名を選択し、テーブルの変更操作として「インデックスの追加」を選択できます。次に、列名とインデックス名を指定すると、テーブルの変更コマンドが生成されて表示されます。 [作成]をクリックすると、インデックスの作成が一度に1つのノードでローリング方式で行われます。

    さらに、ScaleGridは、テーブルに新しい列をローリング方式で追加するなど、他の単純なテーブル変更操作もサポートします。詳細については、今後のブログ投稿にご期待ください。


    1. リレーショナルと非リレーショナルデータベース - パート1

    2. MySQLで2つの日付の間のレコードを取得する方法

    3. Java-カスタムタイプでOracleプロシージャを呼び出す方法は?

    4. Crontab/Cronを使用してMySQLデータベースを自動的にチェックおよび最適化する