MySQLのファジークエリのような遅い速度を解決する方法

MySQLのファジークエリのような遅い速度を解決する方法

質問: インデックスは作成されているのに、Like ファジー クエリがまだ遅いのはなぜですか?

インデックスを使用するかどうかなど?

1. like %keyword インデックスが無効なため、完全なテーブルスキャンが使用されます。ただし、前に flip function + あいまいクエリを使用して、like + flip function index を作成すると、完全なテーブルスキャンの代わりに flip function index を使用できます。

2. キーワード% インデックスが有効です。

3. 類似 %keyword% インデックスが無効であり、逆インデックスは使用できません。

mysql explain を使用した簡単なテストは次のとおりです。

select * from company_info where cname like '%小%' の説明

select * from company_info where cname like '小%' の説明

Oracle のような '%...%' 最適化

1. '%%'のような使い方は避けてください

2. '%'のような(%で始まっていない)場合、Oracleは列にインデックスを適用できます。

3. '%…' のような(% で終わらない)場合は、reverse + 関数インデックスを使用して '%' のように変更できます。

4. '%%' のような関数を使用する必要がある場合は、Oracle 内部関数 INSTR() を使用して解決します。

select * from emp2 where job like '%RE%' and ename like '%A%' and mgr like '%3%' ; --テーブル全体をスキャンするので、時間がかかります select * from emp where instr(job,'RE')>0 and instr(ename,'A')>0 and instr(mgr,'3')>0 ; --フィールドのみを検索するので、高速です

MySQL の INSTR (Oracle のものとは異なります)

INSTR(文字列、部分文字列)

文字列 str 内で substr が最初に出現する位置を返します。これは、引数の順序が逆になっていることを除いて、LOCATE() の 2 つの引数形式と同じです。

INSTR(フィールド名, 文字列)

この関数は、フィールドの内容内の文字列の位置を返します。文字列が見つからない場合は 0 を返し、それ以外の場合は位置 (1 から始まる) を返します。

SELECT * FROM tblTopic ORDER BY INSTR( topicTitle, 'ha' ) > 0 DESC
tblTopicからINSTR( topicTitle, 'ha' )を選択します

その後、テーブルをクエリするための SQL ステートメントを複数の SQL ステートメントに分割し、それらをサーバー上で同時に実行し、最後に結果をマージしようとしました。残念ながら私のスキルが浅すぎるため、実装はそれほど良くありません。

全文インデックスも作成しようとしましたが、データベースではそれができませんでした。

最終的に、需要側は妥協し、いいねキーワード%の形式のインデックスを採用しました。

あいまいな Like クエリの解決策についてアドバイスをいただける方がいらっしゃいましたら、大変ありがたく思います。

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • MySql のファジークエリワイルドカードの使用に関する詳細な紹介
  • MySQL での %% のようなファジークエリの実装
  • MySQLのファジークエリの要約
  • MySQL で遅いファジークエリを最適化する方法

<<:  WeChatアプレットのスクロールビューが左右連動効果を実現

>>:  UA による Web サイトのクロールを防ぐ Nginx のクローラー対策戦略

推薦する

MySQLの文字タイプは大文字と小文字を区別します

デフォルトでは、MySQLの文字タイプは大文字と小文字を区別しません。つまり、name='A...

CSS プロパティ *-gradient の実用的な価値を探る

まず興味深い性質であるconic-gradientを紹介しましょう。円錐グラデーション!円グラフの作...

Windows に Docker をインストールする詳細なチュートリアル

ローカルの MySQL バージョンが比較的低いため、最近 MySQL のバージョンをアップグレードす...

MySQL 8.0 でのチェック制約の実装

みなさんこんにちは。私は技術の話ばかりして髪を切らない先生のトニーです。今回はMySQL 8.0で追...

LeetCode の SQL 実装 (177. 給与が N 番目に高い)

[LeetCode] 177. 最も高い給与従業員テーブルからn番目に高い給与を取得する SQL ...

Raspberry Pi 4b ubuntu19 サーバーへの docker-ce のインストール手順

Raspberry Pi モデルは 4b、1G RAM です。システムはubuntu19.10サーバ...

Vue2は応答性を提供するためにprovide injectを実装しています

1. vue2 での従来の書き方 // 親コンポーネントは 'foo' を提供します...

Docker を使用した war パッケージ プロジェクトのデプロイの実装

Docker で war をデプロイするには、コンテナを使用する必要があります。ここでは tomca...

HTML ヘッドタグの詳細な紹介

HTML のヘッド部分には、ブラウザによる Web ページのレンダリングや SEO などに関連するタ...

Windows 10 での MySQL 8.0.22 のインストールと設定方法のグラフィック チュートリアル

MySQL 8.0.22のインストールと設定方法のグラフィックチュートリアル、参考までに、具体的な内...

例を通してMySQLパーティションテーブルの原理と一般的な操作を学びます

1. パーティションテーブルの意味パーティション テーブル定義は、任意のサイズに設定できるルールに従...

Windows 環境での MYSQL5.7 設定ファイルの場所のグラフィカル分析

1. MYSQLインストールディレクトリ次のようにコードをコピーします。 select @@bas...

MySQL ストアド プロシージャと共通関数のコード分析

mysql ストアド プロシージャの概念:特定のタスク (クエリと更新) を実行できる、データベース...

史上最も簡単な MySQL データのバックアップと復元のチュートリアル (パート 2) (パート 37)

データのバックアップと復元パート3の詳細は次のとおりです基本的な概念:バックアップ、現在のデータまた...

JSX を使用してコンポーネント パーサー開発を構築する例

目次JSX環境の構築プロジェクトの設定NPMを初期化するwebpackをインストールするBabelを...