gpt4 book ai didi

MySQL - 高效的正则表达式(或类似)查询

转载 作者:行者123 更新时间:2023-11-29 11:46:08 24 4
gpt4 key购买 nike

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

sourceslug 列都有唯一的键索引。

slug 列数据的示例如下:

this-is-a-slug

source 列数据的示例如下:

this-is-a-slug.s12345

我想要一个高效的查询,它可以为我提供 redirect 中具有以 slug 开头的 source 列和“.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%");

还是很慢。

有什么方法可以有效地做到这一点吗?

最佳答案

放弃当前的计划。

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

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

顺便说一句,这是分割字符串的另一种方法:

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 |
+----------------------------------------------------+

关于MySQL - 高效的正则表达式(或类似)查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34914496/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com