LIKE 有替代方案吗?请注意,我无法使用全文搜索。
这是我的 mysql 代码。
SELECT *
FROM question
WHERE content LIKE '%$search_each%'
OR title LIKE '%$search_each%'
OR summary LIKE '%$search_each%'
最佳答案
嗯,MySQL 有 regular expressions但我想问一下,多次点赞有什么问题。
我知道当表变得非常时它不会很好地扩展,但这对于使用MySQL的人来说很少是一个问题(并不是要贬低MySQL,只是我注意到很多人似乎将它用于小型数据库,而将大型数据库留给诸如 Oracle、DB2 或 SQLServer(或 NoSQL,其中 ACID 属性不太重要)之类的数据库。
如果,如你所说:
I plan to use it for really large sites.
那么你应该完全避免使用 LIKE。而且,如果您无法使用全文搜索,则需要推出自己的解决方案。
我们过去使用的一种方法是在表上使用插入/更新/删除触发器来填充另一个表。插入/更新触发器应该:
- 评估有问题的字符串;
- 将其分成单词;
- 扔掉无关紧要的单词(全数字、干扰词,如“at”、“the”、“to”等);那么
- 将这些单词添加到表格中,并在原始表格中的行上添加标记。
然后使用该表进行搜索,几乎肯定比多个 LIKE 快得多。它基本上是一种您自己的全文搜索,您可以在其中微调和控制实际应该索引的内容。
这样做的优点是选择过程中的速度快,而更新过程中的成本很小。请记住,这对于读取次数多于写入次数(大多数)的表来说是最好的,因为它可以分摊在所有读取中对单个单词进行索引的成本。每次读取都产生这种成本是没有意义的,最好只在数据发生变化时才这样做。
顺便说一句,删除触发器将简单地删除索引表中引用真实记录的所有条目。
表结构类似于:
Comments:
id int
comment varchar(200)
-- others.
primary key (id)
Words:
id int
word varchar(50)
primary key (id)
index (word)
WordsInComments:
wordid int
commentid int
primary key (wordid,commentid)
index (commentid)
将多对多关系设置为 id-id(即单独的 Words 和 WordsInComments 表)而不是 id-text(将它们组合成一个)是第三范式的正确做法,但您可能想要如果您了解其中的含义,请考虑权衡存储空间以换取速度并将它们结合起来。
关于MySQL LIKE 替代方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3287587/