MySQL LIKE 替代方案

标签 mysql

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/

相关文章:

mysql - 内连接 m/n 关系表和某一列的总和

php - 如何从具有相同日期的表中获取最后一个和最后一个(查询)?

php - 使用 fopen、mysql 查询、include/require 检索字符串值的速度如何

mysql - 如何为 MySQL 变量设置时间戳?

php - 将数组存储在sql数据库中

php - 最后一个事件早于 X 天的 Mysql 返回 ID

mysql - 使用 NodeJS 和 MySql 的 jQuery 数据表

php - Drupal 8.5.1 升级错误 - 在哪里查找故障排除?

java - 尝试打开一个简单的 JSP 文件会产生 HTTP Status 500

mysql - 使用mysql连接两个子查询语法错误