如果我每次用户提交表单时都在我的ODBC数据库中存储HTML TEXTAREA,那么要检索的SELECT
语句是什么?1)包含给定子字符串的所有行2)所有不包含给定子字符串的行(并且搜索区分大小写?)
编辑:如果LIKE "%SUBSTRING%"
速度变慢,那么获取所有内容会更好吗?用PHP排序?
答案 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)。
如果要搜索整个单词,可以将所有单个单词拉出到单独的表中,并使用它来限制子字符串搜索。 (因此,当搜索“我的搜索字符串”时,您会查找最长的单词“搜索”,只对包含“搜索”一词的记录进行子字符串搜索)