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

カンマ区切り名のMySQL検索クエリ

    はい、可能性がある場合は、両方をlast, firstに置くことができます およびfirst last データベースに組み込む場合、スキーマを適切に設計するのがより良い方法です。

    これまでの場合 パーツを検索したり、操作したりしようとしていることに気づきます。 列の数では、スキーマはほぼ確実に壊れています。ほぼ確実にパフォーマンスが低下します。

    正しい方法は、次のようにテーブルを作成することです。

    T1  FirstName  LastName
    ==  =========  ========
     1  Pax        Diablo
     2  Bob        Smith
     3  George     Jones
    

    そうすれば、データベース内のすべての名前を分割しようとするのではなく、ユーザーが入力した名前を(クエリを実行する前に一度)より効率的に分割できます。

    データベースの場合 常にlast, firstを保持します 、スキーマの変更には実際には必要ない場合があります。

    その場合の問題は、ユーザーが入力した内容を解釈することだけです。

    1つの可能性は、パフォーマンスキラーですが、likeを実行することです。 個別の単語ごとに。したがって、ユーザーがpax diabloと入力した場合 、結果のクエリは次のようになります:

    select T1 from mytable
        where T2 like '%pax%'
          and T2 like '%diablo%'
    

    そうすれば、注文はそれほど気になりません。

    ただし、遅いクエリが嫌いなため、どうしても必要な場合を除いて、それを避けようとします(または、データベースが比較的小さく、そのままの状態を維持する可能性があります)。

    これらの種類のクエリを高速化するには、次のようなさまざまな方法があります。

    • DBMSが持つ全文検索機能を使用します。
    • 挿入/更新トリガー中に単語を抽出して保存する(および削除トリガー中に単語を削除する)ことにより、このような機能をエミュレートします。
    • 前のケースですが、現在の列の小文字の値で使用される追加の列も確保します(速度のため)。
    • ユーザーにlast, firstを使用する必要があることを伝える 検索用のフォーム。
    • %something%を回避しようとしています 可能な限り文字列を検索します(something%を使用) 、インデックスは引き続き使用できます。
    • 前述の「名前を2列に分割する」方法。


    1. Oracleの日付にAD/BCインジケーターを追加する方法

    2. ORA-30076:抽出ソースの抽出フィールドが無効です

    3. 非ASCII文字をチェックするPostgresql制約

    4. Symfony / Doctrine:DoctrineをUnixソケットで動作させる方法は?