如何搜索包含子字符串的行?

时间:2010-11-08 08:14:46

标签: mysql odbc

如果我每次用户提交表单时都在我的ODBC数据库中存储HTML TEXTAREA,那么要检索的SELECT语句是什么?1)包含给定子字符串的所有行2)所有不包含给定子字符串的行(并且搜索区分大小写?)


编辑:如果LIKE "%SUBSTRING%"速度变慢,那么获取所有内容会更好吗?用PHP排序?

2 个答案:

答案 0 :(得分:37)

好吧,你可以随时尝试WHERE textcolumn LIKE "%SUBSTRING%" - 但这肯定会很慢,因为你的查询无法进行索引匹配,因为你正在寻找左侧的字符。

它取决于字段类型 - textarea通常不会保存为VARCHAR,而是保存为(某种)TEXT字段,因此您可以使用MATCH AGAINST运算符。

要获取不匹配的列,只需在其前面添加NOT:WHERE textcolumn NOT LIKE "%SUBSTRING%"

搜索是否区分大小写取决于您如何存储数据,尤其是您使用的COLLATION。默认情况下,搜索将不区分大小写。

更新了回答问题更新的答案:

我说如果列字段有索引,那么执行WHERE field LIKE "%value%"WHERE field LIKE "value%"要慢,但这仍然比获取所有值并使用应用程序过滤器快得多。两种情况都是:

1 /如果你执行SELECT field FROM table WHERE field LIKE "%value%",MySQL将扫描整个表,并仅发送包含“value”的字段。

2 /如果你执行SELECT field FROM table然后让你的应用程序(在你的情况下为PHP)过滤掉只有“value”的行,MySQL也将扫描整个表,但是将所有字段发送到PHP ,然后必须做额外的工作。这比案例#1要慢得多。

解决方案:请使用WHERE子句,并使用EXPLAIN查看效果。

答案 1 :(得分:5)

有关MySQL全文搜索的信息。这仅限于MyISAM表,因此如果您想使用不同的表类型,可能不适用。

http://dev.mysql.com/doc/refman/5.0/en/fulltext-search.html

即使WHERE textcolumn LIKE "%SUBSTRING%"速度很慢,我认为让数据库处理它而不是让PHP处理它可能更好。如果可以通过某些其他条件(日期范围,用户等)限制搜索,那么您可能会发现子字符串搜索正常(ish)。

如果要搜索整个单词,可以将所有单个单词拉出到单独的表中,并使用它来限制子字符串搜索。 (因此,当搜索“我的搜索字符串”时,您会查找最长的单词“搜索”,只对包含“搜索”一词的记录进行子字符串搜索)

相关问题