我需要在数据库中搜索一些用户输入模式。
在 Mysql 语句的 where 子句中使用正则表达式是否有效SELECT
(索引列上的 10000 行规模)?
我的搜索是日期,可以是这三种形式:
2012
应该匹配2012
,2012/*
&2012/*/*
2012/10
应该匹配2012/10
&2012/10/*
2012/10/3
应该只匹配2012/10/3
注意:我有三列应该分别检查这种类型的匹配。
我需要在数据库中搜索一些用户输入模式。
在 Mysql 语句的 where 子句中使用正则表达式是否有效SELECT
(索引列上的 10000 行规模)?
我的搜索是日期,可以是这三种形式:
2012
应该匹配2012
,2012/*
&2012/*/*
2012/10
应该匹配2012/10
&2012/10/*
2012/10/3
应该只匹配2012/10/3
注意:我有三列应该分别检查这种类型的匹配。
虽然我在 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'
将比较分成两部分的原因是为了避免搜索只与涵盖两种情况的 LIKE2012/1
匹配2012/10
(即LIKE '2012/1%'
)。
发生这种情况是因为 LIKE 不应该接受正则表达式作为参数。这些事情有REGEXP
WHERE field NOT REGEXP '%_[0-9]+'