mysql - 如何改进 MySQL REGEXP 搜索?

标签 mysql regex performance

问题是,

1.如何使用 REGEXP 提高 mysql 中 SELECT 查询的性能?

表格看起来像

create table `tweets`(
    `id` bigint auto_increment,
    `tweet` varchar(140),
    `time` datetime,
    primary key(`id`)
);

下面的查询大约需要 0.35 秒

select tweet from tweets where tweet regexp '^[abcdef]{1,4}$';
  1. 索引 tweet 会让它更快吗?如果是这样,我应该使用什么类型的索引?
  2. 我的表引擎是InnoDB,还有其他表引擎会变得有用吗?

最佳答案

最好的办法是减少结果集,以便在评估之前根据正则表达式进行评估。就所有意图和目的而言,正则表达式是不可能建立索引的。

如果我必须为此想出一种方法,我会检查通常搜索的模式,并在插入时以某种可索引的方式标记它们。例如,如果您使用 ^[abcdef]{1,4}$ 表达式进行大量搜索,我会制作一个 bool 列 first4AThruF 并在插入/update 触发器,根据是否匹配正则表达式将列更新为 true 或 false。如果我索引了 first4AThruF 列,并且该列具有足够的选择性,我可以编写查询:

select tweet from tweets where first4AThruF = true;

这应该很活泼。

要考虑的其他可能性是全文查询或 LIKE 子句,尽管在上述情况下我不希望它们能很好地工作。

关于mysql - 如何改进 MySQL REGEXP 搜索?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8748272/

相关文章:

php - 如何从多个 MySQL 表生成有效的 json 输出

mysql 在排序时将包含字母的字段视为最低值

python - 在 Python 中将文件名拆分为单词和数字

ruby - Ruby 中奇怪的反斜杠替换

performance - 如何使用 Perl 修剪日志文件?

c# - 在字符串中查找日期

java - 如何为 EnumSet(MySQL SET 类型)编写 jOOQ 转换器

Javascript 将电话号码填充到 3 个输入文本框中,名称相同但没有 id

algorithm - 对于这个练习题,使用嵌套哈希表是否有效?

MySQL 使用某些列,基于其他列