MySQL - 高效的regexp(或类似)查询

时间:2016-01-21 02:44:45

标签: mysql regex

我有两个表,一个performer表和一个redirect表。 performer表有一个名为slug的列。 redirect表有一个名为source的列。

sourceslug列都有唯一的键索引。

slug列数据的示例如下:

this-is-a-slug

source列数据的示例如下:

this-is-a-slug.s12345

我想要一个高效的查询,它为redirect中的所有行提供source列,其中以slug开头,而#34; .s"字符,后跟数字。

我试过了:

select source from redirect
join performer on
source regexp concat('^', slug, '.s[0-9]+$');

非常慢。所以我决定减少限制并尝试这个:

select source from redirect
join performer on
source like concat(slug, ".s%");

它仍然很慢。

我有办法有效地做到这一点吗?

2 个答案:

答案 0 :(得分:1)

放弃目前的计划。

redirect添加一列slug。这是对表的一次性更改,以及更改代码以插入它。

如果您运行的是5.7或MariaDB,请使用虚拟列,可能还有物化索引。

BTW,这是分割字符串的另一种方法:

mysql> SELECT SUBSTRING_INDEX('this-is-a-slug.s12345', '.', 1);
+--------------------------------------------------+
| SUBSTRING_INDEX('this-is-a-slug.s12345', '.', 1) |
+--------------------------------------------------+
| this-is-a-slug                                   |
+--------------------------------------------------+

如果's'是关键的,那么研究这些:

mysql> SELECT SUBSTRING_INDEX('this-is-a-slug.s12345', '.s', 1);
+---------------------------------------------------+
| SUBSTRING_INDEX('this-is-a-slug.s12345', '.s', 1) |
+---------------------------------------------------+
| this-is-a-slug                                    |
+---------------------------------------------------+

mysql> SELECT SUBSTRING_INDEX('this-is-a-slug.invalid', '.s', 1);
+----------------------------------------------------+
| SUBSTRING_INDEX('this-is-a-slug.invalid', '.s', 1) |
+----------------------------------------------------+
| this-is-a-slug.invalid                             |
+----------------------------------------------------+

答案 1 :(得分:0)

也许

join performer on left(source,length(slug)+2)=concat(slug, ".s")

但在我看来它是相同的