MySQL最適化ツール(推奨)

MySQL最適化ツール(推奨)

序文

今日 GitHub を閲覧していたところ、SQL を最適化および書き換えるための sora という自動化ツールを見つけました。なかなか良いと思ったのでダウンロードして勉強してみました。このツールは多くの機能をサポートしており、日常の開発の補助ツールとして使用できます。今、私はあなたにそれをお勧めします~~~

Githubポータル: https://github.com/XiaoMi/soar

背景

私たちの日々の開発において、SQL の最適化は常に日常的な開発タスクの 1 つです。定期的な SQL 最適化により、プログラムのパフォーマンスが向上するだけでなく、オンライン障害の可能性も低減できます。

現在一般的に使用されている SQL 最適化方法には、ビジネス レイヤーの最適化、SQL ロジックの最適化、インデックスの最適化などがあります。インデックス最適化は通常、インデックスを調整するか、新しいインデックスを追加することによって SQL 最適化の目的を達成します。インデックスの最適化により、短期間で大きな成果が得られることがよくあります。インデックスの最適化をツールベースの標準化されたプロセスに変換し、手動介入の作業負荷を軽減できれば、作業効率が大幅に向上することは間違いありません。

SOAR (SQL Optimizer And Rewriter) は、SQL を最適化および書き換えるための自動化ツールです。 Xiaomi の人工知能およびクラウド プラットフォームのデータベース チームによって開発および保守されています。

業界内の他の優れた製品との比較は次のとおりです。

飛翔sqlチェックpt-クエリアドバイザーSQLアドバイザーインセプションsqlautoreview
ヒューリスティックな提案✔️ ✔️ ✔️ ✔️ ✔️
インデックスの提案✔️ ✔️ ✔️
クエリの書き換え✔️
実行計画の表示✔️
プロファイリング✔️
トレース✔️
SQLオンライン実行 ✔️
データのバックアップ ✔️

上図からわかるように、サポートされている機能は豊富で、その機能的特徴は次のとおりです。

  • クロスプラットフォーム サポート (Linux、Mac 環境をサポートし、理論的には Windows 環境もサポートしますが、完全にテストされていません)
  • 現在、MySQL構文ファミリープロトコルのSQL最適化のみをサポートしています。
  • ヒューリスティックアルゴリズムに基づくステートメント最適化をサポート
  • 複雑なクエリ(UPDATE、INSERT、DELETE、SELECT)に対する複数列インデックスの最適化をサポートします。
  • EXPLAIN情報豊富な解釈をサポート
  • SQLフィンガープリント、圧縮、美化をサポート
  • 同じテーブルに対する複数のALTERリクエストのマージをサポート
  • カスタムルールのSQL書き換えをサポート

一言で言うとこれだけです。SQL最適化ツールなので、ただ語るだけでは意味がありません。まずは使ってみて効果を確かめてみましょう。

インストール

インストールには次の 2 つの方法があります。

バイナリインストールパッケージをダウンロードする

$ wget https://github.com/XiaoMi/soar/releases/download/0.11.0/soar.linux-amd64 -O soar
chmod a+x ソア

最新バージョンを直接ダウンロードすることをお勧めします。そうしないとバグが発生します。

ダウンロードしたバイナリ ファイルを環境変数に追加するだけです (方法がわからない場合は Google で検索してください。ここでは説明しません)。

テストしてみましょう:

$ echo 'select * from user' | soar.darwin-amd64 (バイナリファイル名に応じて入力してください)
# クエリ: AC4262B5AF150CB5
 
★ ★ ★ ☆ ☆ 75 ポイント ```sql
選択
 *
から
 ユーザー
「」
 
## 最も外側のSELECTはWHERE条件を指定していません* **項目:** CLA.001
 
* **重大度:** L4
 
* **内容:** SELECT ステートメントに WHERE 句がないため、予想よりも多くの行が検査される可能性があります (フル テーブル スキャン)。 SELECT COUNT(\*) タイプのリクエストでは、精度が必要ない場合は、代わりに SHOW TABLE STATUS または EXPLAIN を使用することをお勧めします。
 
## SELECT * Type query * **Item:** COL.001 の使用は推奨されません
 
* **重大度:** L1
 
* **コンテンツ:** \* ワイルドカードを使用してすべての列を選択すると、テーブル構造が変更されたときにクエリの意味と動作が変わり、クエリによって返されるデータが増える可能性があります。

ソースのインストール

依存関係:

1. Go 1.10以上
2. ギット

高度な依存関係(開発者のみ)

  • 認証上の理由による接続失敗を回避するために、MySQLクライアントのバージョンはコンテナ内のMySQLのバージョンと同じである必要があります。
  • Docker MySQL Server テストコンテナ管理
  • govendor Go パッケージ管理
  • retoolは外部のコード品質静的チェックツールバイナリファイル管理に依存しています

バイナリファイルを生成します:

github.com/XiaoMi/soar にアクセスしてください
cd ${GOPATH}/src/github.com/XiaoMi/soar && make
生成されたバイナリファイルは上記と同じで、環境変数に入れるだけです。ここでは試していないので、自分で考えてください~~~

使いやすい

0. 事前準備

次のように表を準備します。

テーブル「users」を作成します(
 `id` bigint(20) 符号なし NOT NULL AUTO_INCREMENT,
 `username` varchar(64) NOT NULL DEFAULT ''
 `ニックネーム` varchar(255) デフォルト ''
 `password` varchar(256) NOT NULL DEFAULT ''
 `salt` varchar(48) NOT NULL DEFAULT '',
 `アバター` varchar(128) デフォルト NULL,
 `uptime` 日時 デフォルト NULL、
 主キー (`id`)、
 ユニークキー `username` (`username`)
) エンジン=InnoDB AUTO_INCREMENT=11 デフォルト文字セット=utf8mb4

1. SQL文を直接入力する(実行しない)

$ echo "ユーザーから*を選択" | soar.darwin-amd64
$ # クエリ: 30AFCB1E1344BEBD
 
★ ★ ★ ☆ ☆ 75 ポイント ```sql
選択
 *
から
 ユーザー
「」
## 最も外側のSELECTはWHERE条件を指定していません* **項目:** CLA.001
 
* **重大度:** L4
 
* **内容:** SELECT ステートメントに WHERE 句がないため、予想よりも多くの行が検査される可能性があります (フル テーブル スキャン)。 SELECT COUNT(\*) タイプのリクエストでは、精度が必要ない場合は、代わりに SHOW TABLE STATUS または EXPLAIN を使用することをお勧めします。
 
## SELECT * Type query * **Item:** COL.001 の使用は推奨されません
 
* **重大度:** L1
 
* **コンテンツ:** \* ワイルドカードを使用してすべての列を選択すると、テーブル構造が変更されたときにクエリの意味と動作が変わり、クエリによって返されるデータが増える可能性があります。

現在、MySQL への接続がないため、分析は完全に SQL ステートメントに基づいて実行されます。ご覧のとおり、提供されるレポートも非常に詳細ですが、それは単なる空っぽのシェルです。SQL ステートメントのみで提供される分析は正確ではないため、次のアプリケーションを開始します。

2. MySQLに接続してEXPLAIN分析レポートを生成する

構成ファイルで、mysql 関連の構成を次のように構成できます。

vi soar.yaml
# yaml 形式の設定ファイル
オンライン DSN:
  アドレス: 127.0.0.1:3306
  スキーマ: asong
  ユーザー: ルート
  パスワード: root1997
  無効: false
 
テスト-dsn:
  アドレス: 127.0.0.1:3306
  スキーマ: asong
  ユーザー: ルート
  パスワード: root1997
  無効: false

設定が完了したら、実際に実行してみましょう。

$ echo "SELECT id,username,nickname,password,salt,avatar,uptime FROM users WHERE username = 'asong1111'" | soar.darwin-amd64 -test-dsn="root:[email protected]:3306/asong" -allow-online-as-test -log-output=soar.log
$ # クエリ: D12A420193AD1674
 
★ ★ ★ ★ ★ 100ポイント ```sql
選択
 ID、ユーザー名、ニックネーム、パスワード、ソルト、アバター、稼働時間
から
 ユーザー
どこ
 ユーザー名 = 'asong1111'
「」
 
## 情報の説明 | id | select_type | table | partities | type | possible_keys | key | key_len | ref | rows | filtered | scalability | Extra |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | SIMPLE | *users* | NULL | const | username | username | 258 | const | 1 | ☠️ **100.00%** | ☠️ **O(n)** | NULL |
 
### 情報解釈の説明 #### SelectType 情報解釈* **SIMPLE**: 単純な SELECT (UNION やサブクエリなどは使用しません)。
 
#### 型情報の解釈* **const**: const は、定数値を使用して PRIMARY KEY を比較するために使用されます。クエリ テーブルに行が 1 つしかない場合は、system を使用します。例: SELECT * FROM tbl WHERE col = 1。

今回は結果にEXPLAIN情報分析レポートが含まれています。これは、Explain によって解析されるフィールドに慣れていない初心者にとって使いやすいものです。これを使用すると、SQL の問題を完璧に分析できます。すばらしいと思いませんか?

3. 文法チェック

soar ツールは SQL 文を分析できるだけでなく、SQL 構文をチェックして問題を見つけることもできます。例を見てみましょう。

$ echo "select * from users" | soar.darwin-amd64 -only-syntax-check
SQL 1: 行 1、列 5、"select * from users" 付近 (合計長さ 18)

ここでは、select キーワードに t がありません。このコマンドを実行すると、問題をすぐに特定できます。SQL ステートメントが非常に長い場合は、このコマンドを使用して、SQL ステートメントが正しいかどうかを確認できます。

4. SQLの美化

私たちは日々の開発で、他の人が書いたコードをよく見ています。レベルの違いにより、一部の SQL 文は非常に乱雑に書かれているため、このツールが役立ちます。SQL 文をより美しく、理解しやすいものにすることができます。

$ echo "SELECT id,username,nickname,password,salt,avatar,uptime FROM users WHERE username = 'asong1111'" | soar.darwin-amd64 -report-type=pretty
 
選択
 ID、ユーザー名、ニックネーム、パスワード、ソルト、アバター、稼働時間
から
 ユーザー
どこ
 ユーザー名 = 'asong1111';

こちらのほうが直感的に分かりやすいと思いませんか?

結論

このツールを使い始めたばかりなので、まだ他の遊び方を発見できていませんが、今後さらに追加する予定です。自分でゲームプレイをさらに学ぶには、github ポータル: https://github.com/XiaoMi/soar を参照してください。公式ドキュメントは実は非常に粗雑で、より多くのメソッドをアンロックするには独自の調査に頼る必要があります。結局のところ、ソースコードは提供されており、Go の学習にも役立ちます。小さなプロジェクトとして扱い、ゆっくりと最適化していく方が良いのではないでしょうか。

これで、MySQL 最適化ツール (推奨) に関するこの記事は終了です。MySQL 最適化に関するより関連性の高いコンテンツについては、123WORDPRESS.COM の以前の記事を検索するか、以下の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySQL パフォーマンス最適化ベスト 20 体験共有
  • MySQL Order by ステートメントの使用法と最適化の詳細な説明
  • MySQL の最適化のために調整する必要がある 10 の設定
  • MySQL パフォーマンス最適化のための max_connections 構成パラメータの分析
  • MySQL は SQL ステートメントの最新のレコードをクエリします (最適化)
  • MySQL データベースを最適化する 8 つの方法
  • MYSQL最適化の一般的な方法
  • MYSQL パフォーマンス最適化共有 (データベースとテーブルのシャーディング)

<<:  docker で mysql に接続できない場合の解決策

>>:  JavaScriptのonclickとclickの違いの詳細な説明

ブログ    

推薦する

Vue のプラグインとコンポーネントの違いと使い方のまとめ

このチュートリアルの動作環境: Windows 7 システム、vue 2.9.6 バージョン、DEL...

Vueプロジェクトのフロントエンドを最適化およびパッケージ化するための必須のボーナスアイテム

目次序文1. ルーティングの遅延読み込み1. ルートの遅延読み込みが必要なのはなぜですか? 2. ル...

CSSファイルをインポートする3つの方法の詳細な説明

CSS を導入する方法には、インライン スタイル、内部スタイル シート、外部スタイル シートの 3 ...

Linux で Bash 環境変数を設定する方法

Shell は C 言語で書かれたプログラムであり、ユーザーが Linux を使用するための橋渡しと...

時点に基づくMySQLクイックリカバリソリューション

なぜこのような記事を書いたかというと、数日前の夜、仕事が終わろうとしていたときに、業務側で突然、テー...

複数ページ通信を実現する JavaScript の sharedWorker の詳細な例

こんなことがありました。今日はGitHubで遊んでいました。最初はログインせずにいくつかのページを閲...

Java は Excel から MySQL にデータをインポートします

実際の業務では、Excel からデータベースにデータをインポートする必要がある場合があります。データ...

CSS3 を使用して 3D テキスト ホバー効果を実装するサンプル コード

この記事では、3D テキストのホバー変更効果を実現するための CSS3 のサンプル コードを紹介しま...

MySQLトリガーの詳細な説明と簡単な例

MySQLトリガーの簡単な例文法CREATE TRIGGER <トリガー名> -- トリ...

ネイティブ JS でスネーク ゲームを書く

この記事では、参考までに、JSでスネークゲームを書くための具体的なコードを紹介します。具体的な内容は...

jQueryはキャンバスタグを使用して検証コードを描画します

<canvas> 要素は、クライアント側のベクター グラフィックス用に設計されています。...

Tomcat セキュリティ仕様 (Tomcat セキュリティ強化と仕様)

tomcat はオープンソースの Web サーバーです。Tomcat ベースの Web は実行効率...

HTML リスト ボックス、テキスト フィールド、ファイル フィールドのサンプル コード

ドロップダウンボックス、テキストフィールド、ファイルフィールド 上半分はデモンストレーション効果、下...

仕事でよく使うLinuxコマンドまとめ

仕事では、docker や kubernetes などのオープンソース ツールをさらに活用しましょう...

Linux (Ubuntu 18.04) に Anaconda をインストールする詳細な手順

Anaconda は、大規模なデータ処理、予測分析、科学計算のための最も人気のある Python デ...