クエリの背景約 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. リストインターフェースとその他のモジュールの表示処理2. 従来のインターフェースコンポーネ...
シナリオ 1: HTML: <div class="outer"> ...
序文ヒント:以下はこの記事の主な内容です。以下のケースを参考にしてください。 1. オブジェクトスト...
事前に言っておくNodejs はデータベースを非同期操作として読み取るため、データベースがデータを読...
目次1. サブクエリとは何ですか? 2. サブクエリはどこに表示されますか? 3. Whereサブク...
マウスをドラッグしてページのスクリーンショットを撮ります(指定した領域にスクリーンショットをドラッグ...
目次序文デモンストレーション効果HTMLコードCSSコードJavascriptコードデモアドレス序文...
目次1. 初期化構造2. 蛇の色のレンダリング3. ヘビの動き4. ヘビの死を判定する方法 ヘビの死...
目次トリガーについてトリガーの使用トリガーを作成するトリガーを表示トリガーの削除使用上の注意新旧の違...
システム: VMTOOLs ダウンロード:リンク: https://pan.baidu.com/s/...
水平方向では、テーブル ヘッダーの配置を左、中央、右に設定できます。基本的な構文<TH ALI...
導入:スライダー ドラッグ検証は現在、多くの場所で使用されています。週末に 1 つ作成しようと思い、...
1. まず本文にulタグを追加します <!-- 順序なしリスト --> <ul i...
1. 新しいユーザーを作成します。 1. SQL ステートメントを実行して新しいものを作成します (...
目次まず結論から質問解決Promiseを使用してコールバック関数をカプセル化する要約するまず結論から...