我需要在数据库中搜索一些用户输入模式
在Mysql SELECT
语句的where子句中使用Regex是否有效(在索引列上以10000行的比例)?
我的搜索是关于日期的,可以采用以下三种形式:
2012
应匹配2012
,2012/*
& 2012/*/*
2012/10
应该匹配2012/10
& 2012/10/*
2012/10/3
应仅匹配2012/10/3
注意:我有三列应该分别检查这种类型的匹配。
答案 0 :(得分:2)
虽然我在MySQL文档中找不到明确的引用,但由于索引结构,正则表达式匹配不能使用索引查找。
他们可以使用正则表达式扫描索引而不是扫描整个表,但任何正则表达式搜索都或多或少等同于全表扫描。
如果你的正则表达式以常量字符串开头,你可能想要将查询结构为;
SELECT * FROM TableA WHERE field LIKE 'tr%' AND field RLIKE 'tr[uae].*'
从LIKE获得一些索引帮助 - 如果从字符串的开头匹配 - 可以使用索引来获得它的优势。
编辑:由于您的选择非常简单并且从字符串的开头匹配,您可以使用LIKE使它们工作,将很好地利用索引;
SELECT * FROM TableA WHERE field1='2012' OR field1 LIKE '2012/%'
SELECT * FROM TableA WHERE field1='2012/10' OR field1 LIKE '2012/10/%'
SELECT * FROM TableA WHERE field1='2012/10/3'
将比较分成两部分的原因是为了避免搜索与2012/1
匹配的2012/10
只有一个涵盖两种情况的LIKE(即LIKE '2012/1%'
)。
答案 1 :(得分:0)
这是因为LIKE不应该接受正则表达式作为参数。这些事情有REGEXP
WHERE field NOT REGEXP '%_[0-9]+'