我有一个搜索,通过多个表中的多个列搜索匹配项。问题是我使用的是“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%';
如果用户搜索: 状态和客户端 - 我的查询不会返回任何结果。
另外,我担心这个查询的速度有很多数据。
答案 0 :(得分:3)
你是对的,你正在使用的查询类型将强制进行表扫描,并且无法编制索引。即使您只使用LIKE '%$keyword%'
进行全文搜索的唯一有效方法是使用特殊的全文索引技术。 MySQL内置了这个,但目前仅适用于MyISAM表(MySQL 5.6中的InnoDB将支持全文索引)。
您应该阅读我的演示文稿:Full Text Search Throwdown,以便比较不同的解决方案。从测试中可以清楚地看出,使用LIKE
运行比使用任何类型的文本索引都慢<数百或数千倍。慢多少在很大程度上取决于桌子的大小。
来自@Dagon的评论:
我最初是在2008年做过这个演示,但是我更新了它并在2012年4月重新运行了所有测试。与我2008年的演示文稿的差异是微不足道的。
任何索引解决方案仍然比使用LIKE
获得的昂贵的表扫描要好几个数量级。您的表越大,索引的好处就越大。这个原则不会改变。