MySQL フルテキスト インデックス、ジョイント インデックス、Like クエリ、JSON クエリのうち、どれが高速ですか?

MySQL フルテキスト インデックス、ジョイント インデックス、Like クエリ、JSON クエリのうち、どれが高速ですか?

クエリの背景

約 100,000 件のレコードを含む tmp_test_course テーブルがあり、そこに 1 対多の関係を格納する outline という JSON フィールドがあります (jy1577683381775 などの複数のコードが保存されます)。

これらの 100,000 件のレコードから特定の種類のデータを取得する必要があります。対象データの合計量は次のとおりです: 2931レコード

SELECT COUNT(*) FROM tmp_test_course WHERE `type`=5 AND del=2 AND is_leaf=1

上記のタイプを制限しながら、以下のコード(つまりORクエリ)も含める必要があります。

1577683381775 翻訳
1577683380808
1577683379178 翻訳
1577683378676 翻訳
1577683377617 翻訳
1577683376672 翻訳
1577683375903 翻訳
1578385720787 翻訳
1499916986208 翻訳
1499917112460 翻訳
1499917093400 翻訳
1499917335579 翻訳
1499917334770 翻訳
1499917333339 1499917333339
1499917331557 翻訳
1499917330833
1499917329615 翻訳
1499917328496 翻訳
1576922006950 翻訳
1499916993558 翻訳
1499916992308 翻訳
1499917003454 1499917003454
1499917002952 1499917002952

以下に、アウトライン フィールドをクエリする 4 つの方法と、対応するクエリ時間とスキャンされた行数を示します。

1. クエリをいいね

248ミリ秒かかりました

tmp_test_course から * を選択 
ここで、`type`=5 かつ del=2 かつ is_leaf=1 
そして (
'%jy1577683381775%' のようなアウトライン
または '%jy1577683380808%' のようなアウトライン
または '%jy1577683379178%' のようなアウトライン
または '%jy1577683378676%' のようなアウトライン
または '%jy1577683377617%' のようなアウトライン
または、「%jy1577683376672%」のようなアウトライン
または '%jy1577683375903%' のようなアウトライン
または '%jy1578385720787%' のようなアウトライン
または '%jy1499916986208%' のようなアウトライン
または '%jy1499917112460%' のようなアウトライン
または '%jy1499917093400%' のようなアウトライン
または '%jy1499917335579%' のようなアウトライン
または '%jy1499917334770%' のようなアウトライン
または、「%jy1499917333339%」のようなアウトライン
または '%jy1499917331557%' のようなアウトライン
または '%jy1499917330833%' のようなアウトライン
または '%jy1499917329615%' のようなアウトライン
または '%jy1499917328496%' のようなアウトライン
または '%jy1576922006950%' のようなアウトライン
または '%jy1499916993558%' のようなアウトライン
または '%jy1499916992308%' のようなアウトライン
または '%jy1499917003454%' のようなアウトライン
または '%jy1499917002952%' のようなアウトライン
)

EXPLAIN分析結果は次のとおりです。フルテーブルスキャン


2. JSON関数クエリ

json公式関数

所要時間は 196 ミリ秒で、わずかに速くなりました。

tmp_test_course から * を選択 
ここで、`type`=5 かつ del=2 かつ is_leaf=1
そして 
(
JSON_SEARCH(アウトライン、'one'、'jy1577683381775') は NULL ではないか、
JSON_SEARCH(アウトライン、'one'、'jy1577683380808') は NULL ではないか、
JSON_SEARCH(アウトライン、'one'、'jy1577683379178')はNULLではないか、
JSON_SEARCH(アウトライン、'one'、'jy1577683378676') は NULL ではないか、
JSON_SEARCH(アウトライン、'one'、'jy1577683377617')はNULLではないか、
JSON_SEARCH(アウトライン、'one'、'jy1577683376672')はNULLではないか、
JSON_SEARCH(アウトライン、'one'、'jy1577683375903')はNULLではないか、
JSON_SEARCH(アウトライン、'one'、'jy1578385720787')はNULLではないか、
JSON_SEARCH(アウトライン、'one'、'jy1499916986208')はNULLではないか、
JSON_SEARCH(アウトライン、'one'、'jy1499917112460') は NULL ではないか、
JSON_SEARCH(アウトライン、'one'、'jy1499917093400') は NULL ではないか、
JSON_SEARCH(アウトライン、'one'、'jy1499917335579')はNULLではないか、
JSON_SEARCH(アウトライン、'one'、'jy1499917334770') は NULL ではないか、
JSON_SEARCH(アウトライン、'one'、'jy1499917333339')はNULLではないか、
JSON_SEARCH(アウトライン、'one'、'jy1499917331557')はNULLではないか、
JSON_SEARCH(アウトライン、'one'、'jy1499917330833') は NULL ではないか、
JSON_SEARCH(アウトライン、'one'、'jy1499917329615')はNULLではないか、
JSON_SEARCH(アウトライン、'one'、'jy1499917328496')はNULLではないか、
JSON_SEARCH(アウトライン、'one'、'jy1576922006950') は NULL ではないか、
JSON_SEARCH(アウトライン、'one'、'jy1499916993558')はNULLではないか、
JSON_SEARCH(アウトライン、'one'、'jy1499916992308')はNULLではないか、
JSON_SEARCH(アウトライン、'one'、'jy1499917003454')はNULLではないか、
JSON_SEARCH(アウトライン、'one'、'jy1499917002952') は NULL ではありません  
)

EXPLAIN分析の結果は次のようになります。または、テーブル全体のスキャン


3. 共同インデックスクエリ

次に、テーブルのジョイントインデックスを作成します(当初はtype-del-is_leaf-outlineのインデックスを作成したかったのですが、アウトラインフィールドが長すぎるため、type-del-is_leafのジョイントインデックスのみを追加しました)。

ALTER TABLE tmp_test_course に `type-del-is_leaf` キーを追加します (`type`,`del`,`is_leaf`)

インデックスを追加すると、like および json クエリが大幅に高速化されます。
実行には136ミリ秒かかり、jsonクエリには82.6ミリ秒かかりました。これは、json関数クエリをjson型に使用すると、likeよりも高速であることを示しています。



EXPLAIN 分析結果は次のとおりです。両方のクエリでスキャンされる行数は 2931 行に制限されています。



4. 全文インデックスクエリ

フルテキスト インデックスは CHAR、VARCHAR、TEXT のみをサポートしているため、JSON フィールド定義を変更する必要があります。

ALTER TABLE tmp_test_course MODIFY `outline` VARCHAR(1024) NOT NULL DEFAULT '[]'

全文インデックスを追加する

ALTER TABLE tmp_test_course に FULLTEXT INDEX outline (outline) を追加します。

それでは、フルテキストインデックスを使って検索してみましょう

tmp_test_course から * を選択 
ここで、`type`=5 かつ del=2 かつ is_leaf=1
そして 
一致(アウトライン)と( 'JY157683381775 JY157777683380808 JY15777683378676 JY15777776837617 JY1577737767672 20787 jy1499916986208 jy1499917112460 jy1499917093400 jy149999917335579 jy14999917334770 jy1499917333333399999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999997 49917329615 jy1499917328496 jy1576922006950 jy14999916993558 jy1499916992308 jy1499917003454 jy1499991777002952 ')

所要時間は 11.6 ミリ秒で、速度が大幅に向上しており、フルテキスト インデックスの威力がわかります。

EXPLAIN分析の結果は以下の通りで、1行のみがスキャンされたことが分かります。


結論は

以下は4つのケースの実行結果です

全文インデックス: 11.6ms
ジョイントインデックス: 82.6ms (json)、136ms (like)
json 関数クエリ: 196 ミリ秒
いいねクエリ: 248ms

結論: 全文インデックス > 結合インデックス > JSON 関数クエリ > Like クエリ

データ量が多いほど、フルテキスト インデックスの速度は速くなります。10 万個のデータ ポイントを持つテーブルの場合、クエリ速度は直接クエリよりも約 20 倍速くなります。テーブルに数百万または数千万のデータ ポイントがある場合は、改善はさらに大きくなります。したがって、可能な場合はフルテキスト インデックスを使用してください。

これで、MySQL フルテキスト インデックス、複合インデックス、Like クエリ、JSON クエリのどれが速いかという記事は終わりです。MySQL フルテキスト インデックス、複合インデックス、Like クエリ、JSON クエリの詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。

以下もご興味があるかもしれません:
  • MySql ファジークエリ JSON キーワード取得ソリューションの例
  • Mysql クエリの結果セットを JSON データに変換するサンプル コード
  • MySQL で JSON 形式のフィールドをクエリする詳細な説明
  • MySQL json 形式のデータクエリ操作
  • MysqlクエリJSON結果に関連する関数の概要
  • MySQL クエリ フィールド タイプが json の場合の 2 つのクエリ メソッド
  • Python クエリ mysql、json インスタンスを返す
  • mysql5.6 以前のデータベースで json をクエリする方法
  • Mysqlは保存されたJSON文字列内のデータを直接クエリします

<<:  Ubuntu 20.04 ベスト設定ガイド (初心者向け)

>>:  Ubuntu 20.04 ダブルピンイン入力方式のインストール手順

推薦する

IISMonitor を使用して Web ページを監視し、IIS を自動的に再起動します。

目次1. ツールの紹介2. ワークフロー3. 操作インターフェースとパラメータ設定(1)監視と再起動...

Enterキーを押すとフォームが自動的に送信されます。予期せぬ発見

コードをコピーコードは次のとおりです。 <!DOCTYPE html> <html...

iframeを透明にするパラメータ

<iframe src="./ads_top_tian.html" all...

MySQL開発標準と使用スキルの概要

1. 命名規則1. データベース名、テーブル名、フィールド名には小文字を使用し、アンダースコアで区切...

Dockerコンテナ間で通信する3つの方法

Docker コンテナは互いに分離されており、相互にアクセスできないことは誰もが知っていますが、依存...

MySQLを監視するためのbinlogログ解析ツールの詳しい説明:Canal

Canal は、Java を使用して開発された Alibaba のオープンソース プロジェクトです...

MySQL で B+ ツリー インデックスを使用する利点は何ですか?

この問題を理解する前に、まず MySQL テーブルのストレージ構造を確認し、次にバイナリ ツリー、マ...

MySQLにインデックスを追加しても効果がないいくつかの状況について簡単に説明します。

インデックスを追加すると、クエリの効率が向上します。インデックスを追加するということは、ドキュメント...

コンパイル/サーバーなしでブラウザにCommonJSモジュールを実装する

目次導入1. one-click.jsとは2. パッケージングツールはどのように機能しますか? 3....

CSSでできるならJavaScriptは使わない

序文JavaScript で記述できるアプリケーションは、最終的には JavaScript で記述さ...

Linux で XFS パーティション形式のルート ディレクトリを縮小する方法

目次序文システム環境現在のシステムパーティションレイアウトデータのバックアップレスキューモードに入る...

SQL ROW_NUMBER() および OVER() メソッドのケーススタディ

構文フォーマット: row_number() over(partition by grouping ...

MySQL の nvl() 関数に似た ifnull() 関数についての簡単な説明

IFNULL(式1,式2) expr1 が NULL でない場合、IFNULL() は expr1 ...

Vue プロジェクトで addRoutes を使用する際の問題の解決策

目次序文1. 404 ページ1. 原因2. 解決策2.白い画面を更新する1. 原因2. 解決策3. ...

vue2.x の徹底研究 - h 関数の説明

目次解決、要約: vue プロジェクト。 .vue ファイルのテンプレート内に記述されたコードは、w...