クエリの背景約 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 ダブルピンイン入力方式のインストール手順
目次フィルター01.とは02. やり方(1)フィルターを定義する(2)使用方法(3)フィルタパラメー...
noscript の定義と使用法noscript 要素は、スクリプトが実行されない場合の代替コンテン...
目次概要フィルターの定義フィルターの使用カスタムグローバルフィルターローカルフィルター予防例1(ロー...
目次概要同一生成元ポリシー (SOP)相同制限クロスドメインをバイパスクロスサイトリクエストフォージ...
MySQL 双方向バックアップはマスター-マスター バックアップとも呼ばれ、両方の MySQL サー...
導入2日前に見た問題について詳細に書きます。バイトコンピューターがバイナリに基づいていることは誰もが...
みなさんこんにちは。私は梁旭です。 Linux を使用しているときに、いくつかのコマンドを連結する必...
エンジニアリング構造プロジェクトは2つの部分に分かれています。bilibili-apiはAPIインタ...
いくつかの記事を読んだ後、ようやく MySQL で row_number() ソートを実装する方法が...
jsを使用して、中国語をピンインに変換するパッケージを作成しました。倉庫のアドレスはpinyin-p...
XHTML には似た機能を持つタグがいくつかあります。もちろん、ここでの類似性とは意味の類似性を指...
このブログは仕事のメモです環境: nginx バージョン: nginx/1.14.0 Centos ...
時間フィールドは、データベースの使用時によく使用されます。よく使われるのは作成時間と更新時間です。し...
Dockerはプライベートレジストリ内のイメージを照会または取得するために、 docker 検索 1...
今日、mysql の公式サイトから mysql-5.7.18-winx64.zip をダウンロードし...