MySQL搜索多列匹配

时间:2012-11-25 18:40:55

标签: php mysql full-text-search

我有一个搜索,通过多个表中的多个列搜索匹配项。问题是我使用的是“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%';  

如果用户搜索: 状态和客户端 - 我的查询不会返回任何结果。

另外,我担心这个查询的速度有很多数据。

1 个答案:

答案 0 :(得分:3)

你是对的,你正在使用的查询类型将强制进行表扫描,并且无法编制索引。即使您只使用LIKE '%$keyword%'

搜索单个列,这仍然是正确的

进行全文搜索的唯一有效方法是使用特殊的全文索引技术。 MySQL内置了这个,但目前仅适用于MyISAM表(MySQL 5.6中的InnoDB将支持全文索引)。

您应该阅读我的演示文稿:Full Text Search Throwdown,以便比较不同的解决方案。从测试中可以清楚地看出,使用LIKE运行比使用任何类型的文本索引都慢<数百或数千倍。慢多少在很大程度上取决于桌子的大小。


来自@Dagon的评论:

我最初是在2008年做过这个演示,但是我更新了它并在2012年4月重新运行了所有测试。与我2008年的演示文稿的差异是微不足道的。

任何索引解决方案仍然比使用LIKE获得的昂贵的表扫描要好几个数量级。您的表越大,索引的好处就越大。这个原则不会改变。