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

推薦する

vxe-table を使用して vue で編集可能なテーブルを作成するプロセス

プロジェクトには、オンラインで編集する必要があるテーブルがあります。最初は、要素の el-table...

React-Dropzone をベースにアップロードコンポーネント機能を開発する (サンプルデモ)

今回はReact-Flaskフレームワーク上でアップロードコンポーネントを開発するスキルについてお話...

React-Native スクリーンショットコンポーネント react-native-view-shot の紹介と使い方のまとめ

目次1. 現象2. 解決策3. 要約: 1. 現象1. 要件: 特定の表示ページをキャプチャしてアル...

VirtualBox は CentOS7 仮想マシンと拡張ツールをインストールします (画像とテキスト)

コンピュータシステム: win7この記事は主に写真に基づいており、多くの写真が含まれていますCent...

MySQL データベースのインデックス順序の詳細な説明

目次事件の原因解剖学ファイルの並べ替えファイルのソートが非常に遅いのですが、他に解決策はありますか?...

DockerにMySQLをインストールする方法

最近 Django を導入しましたが、MySQL を手動でインストールしたくなかったので、Docke...

docker cp ファイルをコピーしてコンテナに入る

実行中のコンテナに入る # コンテナに入り、新しいターミナルを開きます# docker exec -...

Gogs+Jenkins+Docker による .NetCore ステップの自動デプロイ

目次環境説明DockerのインストールゴグのインストールDocker で .NetCore サービス...

Centos7.3は起動時に自動的に起動または指定されたコマンドを実行します

Centos7では、/etc/rc.d/rc.localファイルの権限が削減されており、実行権限があ...

HTML コード例: ハイパーリンクの詳細な説明

ハイパーリンクは、Web サイト上のすべてのページがハイパーリンクで接続され、ページ間を移動できるた...

知っておくべき 18 の Web ユーザビリティの原則

世界最高のビジュアル デザイン スキルを持っていたとしても、訪問者がページ間やアイテム間を快適に移...

TSで最も一般的な宣言マージ(インターフェースマージ)

目次1. マージインターフェース1.1 非関数メンバー1.2 関数メンバー序文:今日お話ししたいのは...

MySQL がテーブルを読み取れないエラー (MySQL 1018 エラー) の解決方法

1. エラーの再現MySQL データベースにはアクセスできますが、データベース テーブルを読み取るこ...

CocosCreator で http と WebSocket を使用する方法

目次1. HTTPGET 2. HTTP POSTウェブソケット4. Egretのhttpとwebs...

MySQLにおけるテーブルインデックスの定義方法と導入

概要インデックスは、テーブル内の 1 つ以上の列に基づいて DBMS によって特定の順序で作成される...