sql >> データベース >  >> RDS >> Mysql

REGEXPのMySQL最適化

    正規表現スタイルのWHEREを使用する必要がある場合 句、あなたは間違いなく遅いクエリの問題に悩まされるでしょう。正規表現スタイルの検索を機能させるには、MySQLで名前列のすべての値を正規表現と比較する必要があります。また、ユーザー名の列も確認することで、クエリの問題が2倍になりました。

    これは、MySQLがインデックスを利用できないことを意味します。これは、すべてのDBMSが大きなテーブルのクエリを高速化する方法です。

    試すことができることがいくつかあります。それらはすべて、REGEXPに別れを告げることを含みます。

    1つはこれです:

    WHERE name LIKE CONCAT('jack', '%') OR username LIKE CONCAT('jack', '%')
    

    名前とユーザー名の列にインデックスを作成する場合、これはかなり高速である必要があります。 'jack'で始まるすべての名前/ユーザー名を検索します。

    に注意してください
    WHERE name LIKE CONCAT('%','jack') /* SLOW!!! */
    

    'jack'で終わる名前を検索しますが、正規表現スタイルの検索のように遅くなります。

    もう1つできることは、アプリケーションが名前またはユーザー名の一部を検索できる必要がある理由を理解することです。この機能をアプリケーションから削除するか、それを処理するためのより良い方法を見つけることができます。

    考えられるより良い方法:

    1. ユーザーに、名前を名前と名前のフィールドに分割し、別々に検索するように依頼します。
    2. ユーザーが必要とする場合にのみ使用される個別の「すべてのユーザーを検索」機能を作成して、低速の正規表現スタイルのクエリの頻度を減らします。
    3. ある種の前処理プログラムを使用して、自分で名前を別の名前-単語テーブルに分割します。正規表現なしで名前と単語のテーブルを検索します。
    4. この機能にMySQL全文検索を使用する方法を理解してください。

    これらはすべて、プログラミング作業を伴います。



    1. SQL Server:データベースが復元状態でスタックしている

    2. Mysql 1050エラーテーブルはすでに存在しますが、実際には存在しません

    3. MySQLからJavaコードを呼び出す方法は?

    4. MySQLでロールを使用して特権を管理する方法