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の違いの詳細な説明

推薦する

LinuxにNginxをインストールする詳細な手順

1. Nginxのインストール手順1.1 公式サイトの紹介http://nginx.org/en/d...

CentOS システムでの JDK のインストールと設定の概要

目次序文OpenJDKの確認とアンインストールダウンロードした圧縮パッケージを使用してJDKをインス...

...

Vue で eslint 検出をオフにする方法 (複数の方法)

目次1. 問題の説明2. 問題解決1. 問題の説明Vue プロジェクトを開発する場合、作成時に誤って...

カレンダー効果を実現するJavaScript

この記事では、カレンダー効果を実現するためのJavaScriptの具体的なコードを参考までに紹介しま...

HTML に埋め込まれた Flash HTML ウェブページ コードに Flash ファイルを埋め込むソリューション (パート 1)

中国の習慣では、旧暦の1月15日より前に新年を祝います。ここで、庭にいる友人たちに新年の幸せを祈りた...

Ubuntuデュアルシステムが起動時に停止する問題の解決方法の詳細な説明

起動時に Ubuntu デュアル システムが停止する問題の解決方法 (Ubuntu 16.04 およ...

MySQLのslave_exec_modeパラメータの詳細な説明

今日、slave_exec_modeというパラメータを偶然見ました。マニュアルの説明から、このパラメ...

MySQL 8.0.12 クイックインストールチュートリアル

MySQL 8.0.12 のインストールには 2 日かかり、さまざまな問題が発生しました。以下にまと...

MySQL バッチ挿入ループの詳細なサンプルコード

背景数日前、MySql でページングを行っていたときに、ページングに制限 0,10 を使用するとデー...

アルバムと写真をアルバムに保存するためのWeChatアプレット

私は現在、Xiao Nian Gao に似たビデオおよびツール アプリを開発しています。ユーザーが作...

JSは星を消すケースを実現する

この記事の例では、星を消すためのJSの具体的なコードを参考までに共有しています。具体的な内容は次のと...

VUE無限レベルツリーデータ構造表示の実装

目次コンポーネントの再帰呼び出しレンダリングメソッドの使用プロジェクトに取り組んでいると、左側のメニ...

Vue でメニュー権限制御を実装するためのサンプルコード

バックエンド管理システムで作業している場合、通常、メニュー権限制御に関連する問題に遭遇します。もちろ...

nginx アンチホットリンクおよびアンチクローラー設定の詳細な説明

新しい設定ファイルを作成します (たとえば、nginx インストール ディレクトリの下の conf ...