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 将支持全文索引)。

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


来自@Dagon 的重新评论:

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

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

于 2012-11-25T18:48:30.637 回答