繁体   English   中英

MySQL LIKE替代

[英]MySQL LIKE alternative

是否有LIKE的替代方案。 注意我不能使用全文搜索。

这是我的mysql代码。

SELECT * 
FROM question 
WHERE content LIKE '%$search_each%'
OR title LIKE '%$search_each%'
OR summary LIKE '%$search_each%'

好吧,MySQL具有正则表达式,但是我想问你多个LIKE到底出了什么问题。

我知道,当表中得到真正的大,但是这是很少使用的MySQL老百姓关注的问题也不会很好地扩展(没有意思要贬低到MySQL那里,它只是我注意到很多人似乎都使用它的小数据库,将大型数据库留给Oracle,DB2或SQLServer(或ACID属性不太重要的NoSQL)之类的工具。

如您所说:

我打算将其用于大型网站。

那么您应该完全避免喜欢。 而且,如果您不能使用全文本搜索,则需要推出自己的解决方案。

我们过去使用的一种方法是在表上使用插入/更新/删除触发器来填充另一个表。 插入/更新触发器应:

  • 评估相关字符串;
  • 把它分成单词;
  • 丢弃无关紧要的单词(全数字,“ at”,“ the”,“ to”等杂音词); 然后
  • 将这些单词添加到表中,并将标记添加到原始表中的行。

然后使用该表进行搜索,不是多喜欢几乎可以肯定快得多。 从根本上讲,这是一种自卷式的全文搜索,您可以在其中微调和控制实际应索引的内容。

这样的优点是在选择过程中速度很快,而在更新过程中成本较低。 请记住,这对于读取次数多于写入次数(大多数情况下)的表是最好的,因为它会摊销在所有读取操作中索引单个单词的成本。 每次读取都不会产生该成本,最好仅在数据更改时才这样做。

而且,顺便说一句,删除触发器将只删除索引表中所有引用真实记录的条目。

表结构如下所示:

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(将它们合并为一个)是正确的做法,但是您可能要看一下交易如果您了解其中的含义,可以节省存储空间以提高速度并进行组合。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM