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 ダブルピンイン入力方式のインストール手順

推薦する

Vue Element フロントエンドアプリケーション開発 従来の Element インターフェースコンポーネント

目次1. リストインターフェースとその他のモジュールの表示処理2. 従来のインターフェースコンポーネ...

divの適応高さは残りの高さを自動的に埋めます

シナリオ 1: HTML: <div class="outer"> ...

Vue.jsクラウドストレージで画像アップロード機能を実現

序文ヒント:以下はこの記事の主な内容です。以下のケースを参考にしてください。 1. オブジェクトスト...

あるテーブルからバッチデータをクエリし、それを別のテーブルに挿入する MySQL の完全な例

事前に言っておくNodejs はデータベースを非同期操作として読み取るため、データベースがデータを読...

MySQL チュートリアル: サブクエリの例の詳細な説明

目次1. サブクエリとは何ですか? 2. サブクエリはどこに表示されますか? 3. Whereサブク...

Vueのドラッグスクリーンショット機能を実装する簡単な方法

マウスをドラッグしてページのスクリーンショットを撮ります(指定した領域にスクリーンショットをドラッグ...

HTML+JS に基づくシンプルな年齢計算ツールの実装

目次序文デモンストレーション効果HTMLコードCSSコードJavascriptコードデモアドレス序文...

JSはスネークゲームを実装する

目次1. 初期化構造2. 蛇の色のレンダリング3. ヘビの動き4. ヘビの死を判定する方法 ヘビの死...

MySQLトリガーの使用と注意すべき点

目次トリガーについてトリガーの使用トリガーを作成するトリガーを表示トリガーの削除使用上の注意新旧の違...

Macシステムをインストールした後にVMWareがフルスクリーンで表示できない問題を解決する

システム: VMTOOLs ダウンロード:リンク: https://pan.baidu.com/s/...

HTML テーブル マークアップ チュートリアル (42): テーブル ヘッダーの水平方向の配置属性 ALIGN

水平方向では、テーブル ヘッダーの配置を左、中央、右に設定できます。基本的な構文<TH ALI...

JavaScript でドラッグ スライダー パズルの検証機能を実装します (html5、canvas)

導入:スライダー ドラッグ検証は現在、多くの場所で使用されています。週末に 1 つ作成しようと思い、...

js は丸で囲まれた数字のリストのサンプルコードを動的に追加します

1. まず本文にulタグを追加します <!-- 順序なしリスト --> <ul i...

MySqlは指定されたユーザーのデータベースビュークエリ権限を設定します

1. 新しいユーザーを作成します。 1. SQL ステートメントを実行して新しいものを作成します (...

WeChatミニプログラムでトークンの有効期限を処理する方法

目次まず結論から質問解決Promiseを使用してコールバック関数をカプセル化する要約するまず結論から...