我有两个表,一个performer
表和一个redirect
表。 performer
表有一个名为slug
的列。 redirect
表有一个名为source
的列。
source
和slug
列都有唯一的键索引。
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%");
它仍然很慢。
我有办法有效地做到这一点吗?
答案 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")
但在我看来它是相同的