DUICUO

DBA + オープンソースツール: データベースクエリを超高速化!条件フィールドにインデックスを追加するかどうかを自動判断するツール

sql_helperツールの紹介

インデックスはデータベースにおいて非常に重要です。クエリを高速化し、データベースのパフォーマンスを向上させることができるからです。クエリ条件として頻繁に使用されるフィールドにインデックスを追加すると、クエリの効率が大幅に向上します。ただし、インデックスの作成と維持には、データ量、クエリ頻度、更新頻度など、いくつかの要素を考慮する必要があります。

sql_helperは、コマンドラインとWebベースの両方のアクセスを提供するオープンソースプロジェクトです。主な機能は、条件付きフィールドにインデックスが必要かどうかを自動的に判断することです。MySQL 5.7/8.0およびMariaDBデータベースで動作し、開発者がデータベースクエリのパフォーマンスを最適化できるように支援します。このツールはSQL文を分析することで、クエリ効率を向上させるためにインデックスを追加する必要がある条件付きフィールドを特定します。

ワークフロー

ステップ 1: SQL 構文パーサーを使用して、テーブル名、エイリアス、関連フィールド名、条件フィールド名、並べ替えフィールド名、グループ化フィールド名を抽出します。

ステップ 2: WHERE 句があるかどうかを確認します。ない場合はプロンプトを表示します。

ステップ3: 結合クエリで、a.id = b.id の b を結合する場合、テーブル構造をクエリして結合フィールドにインデックスが設定されているかどうかを確認します。設定されていない場合は、インデックスを作成するためのプロンプトを表示します。

ステップ4:Explain実行プランを呼び出し、type値がALL、またはrowsが1000を超える場合、テーブルのデータ分布(エイリアスがある場合は、対応する元のテーブル名)とWHERE条件フィールドを確認します。ツールはデフォルトで100,000件のデータをサンプルとしてサンプリングし、カーディナリティをチェックします。例えば、性別フィールドには男性と女性の2つの値があります。割合が半分(50%)を超える場合、このフィールドにインデックスを作成することは推奨されません。

ステップ 5: group by フィールドと order by フィールドをチェックし (同じアルゴリズムを使用)、それらを where 条件フィールドと結合して複合インデックスを形成します。

ステップ6: これらのフィールドが以前にインデックス化されているかどうかを確認します。まだ作成されていない場合は、ユーザーにインデックスの作成を促します。既にインデックスが存在する場合は、ユーザーに促しません。

sql_helperツールは、SQL文の条件式がすべてANDである場合にのみ、複合インデックスの作成を提案することに注意してください。ORの場合、SQLパーサーによる解析が困難になる可能性があります(SQLは柔軟で固定されておらず、フィールドを一般的なアルゴリズムで組み合わせることはできません)。

たとえば、「c1 = 1 または c2 = 2」

ツールは (c1、c2) の複合インデックスの作成を提案しますが、実際には c1 と c2 に個別のインデックスを作成する必要があります。

つまり、c1 = 1となるtから...を選択する。

すべてを結合する

c2 = 2 となる t から ... を選択する

コマンドラインの使用

shell> chmod 755 sql_helper shell> ./sql_helper -f test.yaml -q 'select * from sbtest1 limit 1;' 

  • 注: test.yaml は MySQL 構成ファイルです。

`--sample` パラメータは、デフォルトで 100,000 件のデータエントリをサンプリングします(スレーブデータベースからサンプルデータを取得できます)。実際の状況に応じて、サンプルデータを適切に増やすことができます(例えば、100万行から1,000万行など)。これにより、ツールはインデックスを追加するかどうかをより正確に判断できます。

SELECT クエリのみがサポートされます (主にスロー ログ内の SQL クエリ用)。

写真

自動インデックス作成機能はあくまで補助的な機能であることにご注意ください。最終的な決定は、具体的なビジネスニーズとデータベースパフォーマンスの最適化を考慮して行う必要があります。さらに、インデックスの作成とメンテナンスは、データベースパフォーマンスへの悪影響を回避するために、データ量、クエリ頻度、更新頻度などの要素を慎重に検討する必要があります。

  • このツールは CentOS 7 と互換性があります。