MySQL LIKE另类

时间:2010-07-20 06:39:40

标签: mysql

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

这是我的mysql代码。

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

1 个答案:

答案 0 :(得分:2)

嗯,MySQL有regular expressions但是我想问你多个LIKE的问题是什么。

我知道当表格真的大时,它不会很好地扩展,但这对于使用MySQL的人来说很少是一个问题(不是意味着在那里贬低MySQL,只是我注意到了很多人似乎将它用于小型数据库,将大型数据库用于Oracle,DB2或SQLServer(或NoSQL,其中ACID属性不那么重要))。

如果你说:

  

我打算将它用于非常大的网站。

然后你应该完全避免使用LIKE。而且,如果您无法使用全文搜索,则需要推出自己的解决方案。

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

  • 评估有问题的字符串;
  • 将其分为单词;
  • 扔掉无关紧要的词(全数字,嘈杂的词语,如'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(将它们合并为一个)对于第三范式是正确的做法但你可能想要如果您了解存储空间的影响,请查看存储空间的速度并将它们组合起来。