0

我需要在数据库中搜索一些用户输入模式。
在 Mysql 语句的 where 子句中使用正则表达式是否有效SELECT(索引列上的 10000 行规模)?
我的搜索是日期,可以是这三种形式:

  • 2012应该匹配20122012/*&2012/*/*
  • 2012/10应该匹配2012/10&2012/10/*
  • 2012/10/3应该只匹配2012/10/3

注意:我有三列应该分别检查这种类型的匹配。

4

2 回答 2

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'

将比较分成两部分的原因是为了避免搜索只与涵盖两种情况的 LIKE2012/1匹配2012/10(即LIKE '2012/1%')。

于 2012-10-02T21:00:24.030 回答
0

发生这种情况是因为 LIKE 不应该接受正则表达式作为参数。这些事情有REGEXP

WHERE field NOT REGEXP '%_[0-9]+'
于 2012-10-02T20:57:11.677 回答