クエリの背景約 100,000 件のレコードを含む tmp_test_course テーブルがあり、そこに 1 対多の関係を格納する outline という JSON フィールドがあります (jy1577683381775 などの複数のコードが保存されます)。 これらの 100,000 件のレコードから特定の種類のデータを取得する必要があります。対象データの合計量は次のとおりです: SELECT COUNT(*) FROM tmp_test_course WHERE `type`=5 AND del=2 AND is_leaf=1 上記のタイプを制限しながら、以下のコード(つまりORクエリ)も含める必要があります。
以下に、アウトライン フィールドをクエリする 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 クエリが大幅に高速化されます。 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つのケースの実行結果です
結論: 全文インデックス > 結合インデックス > JSON 関数クエリ > Like クエリ データ量が多いほど、フルテキスト インデックスの速度は速くなります。10 万個のデータ ポイントを持つテーブルの場合、クエリ速度は直接クエリよりも約 20 倍速くなります。テーブルに数百万または数千万のデータ ポイントがある場合は、改善はさらに大きくなります。したがって、可能な場合はフルテキスト インデックスを使用してください。 これで、MySQL フルテキスト インデックス、複合インデックス、Like クエリ、JSON クエリのどれが速いかという記事は終わりです。MySQL フルテキスト インデックス、複合インデックス、Like クエリ、JSON クエリの詳細については、123WORDPRESS.COM の以前の記事を検索するか、次の関連記事を引き続き参照してください。今後とも 123WORDPRESS.COM をよろしくお願いいたします。 以下もご興味があるかもしれません:
|
<<: Ubuntu 20.04 ベスト設定ガイド (初心者向け)
>>: Ubuntu 20.04 ダブルピンイン入力方式のインストール手順
目次コンポーネントの基本概念オブジェクトとコンポーネントの違い成分属性属性とプロパティ属性:財産:ク...
1. MySQLをダウンロードする公式サイトのダウンロードアドレス https://dev.mys...
CSSとは# CSS (Cascading Style Sheets の略) は、「カスケーディング...
MYSQLは大文字と小文字を区別します言葉を見れば信じられます。タイトルを見れば内容がわかります。 ...
方法1: cmdコマンドを使用するまず、DOS ウィンドウを開き、スタート、実行、cmd と入力しま...
この記事では、フォントサイズを調整するためのjQueryの具体的なコードを参考までに紹介します。具体...
目次現象:ポートの使用:ファイルにスペルミスがあります:現象: Tomcat がインストールされ、W...
目次父から息子へ:息子から父へ: Vuex を使用せずにコンポーネント間で値を渡す方法は、親から子、...
今日は、サンダーファイタータイピングゲームを実装します。ゲームプレイは非常に簡単です。それぞれの「敵...
この記事では、ネイティブ JS で実装されたブラインドの特殊効果を紹介します。効果は次のとおりです。...
Web ページのアクセシビリティは、フロントエンドでのみ評価および実装できるもののようです。ユーザビ...
MySQL の導入現在、会社ではプラットフォーム運用を通じてMySQLを導入しています。金曜日、プラ...
yumを使用してcentos7.3にDocker V1.13.1をインストールしましたしかし、doc...
序文「大規模なフロントエンド プロジェクト向け」に設計されたフロントエンド フレームワークである A...
目次概要1. DOM要素をアニメーション化する方法2. 現在のブラウザでサポートされている変換互換の...