2

複数のテーブルの複数の列から一致するものを検索する検索があります。問題は、「OR」を使用していることですが、ユーザーが複数の列を検索した場合、これは機能しません。

これが私の質問です:

    SELECT clients.clientName,
       projects.Client_ID,
       projects.projectNumber,
       projects.projectName,
       projects.projectManager,
       projects.expectedDate,
       projects.address,
       projects.CreationDate,
       projects.custom1,
       projects.custom2,
       projects.custom3,
       projects.custom4,
       projects.custom5,
       projects.custom6,
       projects.custom7,
       projects.custom8,
       projects.custom9,
       projects.Status_ID,
       statuses.status
FROM projects
JOIN clients ON projects.Client_ID = clients.Client_ID
JOIN statuses ON  projects.Status_ID = statuses.Status_ID
WHERE clientName LIKE '%$keyword%'
  OR projectNumber LIKE '%$keyword%'
  OR projectName LIKE '%$keyword%'
  OR address LIKE '%$keyword%'
  OR area LIKE '%$keyword%'
  OR status LIKE '%$keyword%'
  OR custom1 LIKE '%$keyword%'
  OR custom2 LIKE '%$keyword%'
  OR custom3 LIKE '%$keyword%'
  OR custom4 LIKE '%$keyword%'
  OR custom5 LIKE '%$keyword%'
  OR custom6 LIKE '%$keyword%'
  OR custom7 LIKE '%$keyword%'
  OR custom8 LIKE '%$keyword%'
  OR custom9 LIKE '%$keyword%';  

ユーザーが次を検索した場合:ステータスとクライアント--myクエリは結果を返しません。

また、大量のデータを含むこのクエリの速度が心配です。

4

1 に答える 1

3

おっしゃるとおり、使用しているクエリのタイプによってテーブル スキャンが強制され、インデックスを作成できません。これは、単一の列のみを検索する場合でも当てはまります。LIKE '%$keyword%'

全文検索を行う唯一の効率的な方法は、特別な全文索引付けテクノロジーを使用することです。MySQL にはこれが組み込まれていますが、現在は MyISAM テーブルに対してのみです (フルテキスト インデックスは MySQL 5.6 の InnoDB でサポートされます)。

さまざまなソリューションの比較については、私のプレゼンテーション「全文検索のスローダウン」をお読みください。私が行ったテストから、どのタイプのテキスト インデックス作成を使用する場合よりも、LIKE実行速度が数百倍または数千倍遅いことが明らかです。どの程度遅くなるかは、テーブルのサイズに大きく依存します。


@Dagon からの再コメント:

最初にこのプレゼンテーションを行ったのは 2008 年でしたが、更新して 2012 年 4 月にすべてのテストを再実行しました。2008 年のプレゼンテーションとの違いは重要ではありませんでした。

インデックス作成ソリューションは、.NET で得られるコストのかかるテーブル スキャンよりも桁違いに優れていますLIKE。テーブルが大きいほど、インデックス作成のメリットが大きくなります。この原則は変わることはありません。

于 2012-11-25T18:48:30.637 に答える