似乎我有一个占用 CPU 使用率的查询。我想知道使用正则表达式是否会更快:
GROUP_CONCAT(
CASE
WHEN b.column_1 LIKE '%Principal%' THEN CONCAT(a.start_date, ' ~ ' , a.end_date, ' ', REPLACE(b.column_1, 'School Principal of', 'Principal') , ';', CHAR(10 using utf8) )
ELSE ''
END
ORDER BY a.start_date ASC SEPARATOR '') AS roles
这个想法是有一个类似于“2021-01-01 ~ 2022-01-01 Principal”的输出,其中column_1
就像“School Principal of”或“Company Principal of”。
column_1
的正则表达式类似于“^.(principal).$”。是的,基本上只是抓取“Principal”(如果存在),如果不存在,则完全删除整个字符串。
有什么想法吗?谢谢!
答案 0 :(得分:1)
由于您知道匹配时所需的输出的固定格式,因此我认为甚至不需要在 column_1
上进行替换。使用这个版本:
GROUP_CONCAT(
CASE WHEN b.column_1 LIKE '%Principal%'
THEN CONCAT(a.start_date, ' ~ ' , a.end_date, ' Principal')
ELSE '' END
ORDER BY a.start_date ASC SEPARATOR '') AS roles
请注意,您可以在此处使用 REGEXP
来匹配 Principal
,但除非您真的担心单词边界,否则我可能会坚持使用 LIKE
方法您目前正在使用。
答案 1 :(得分:1)
LIKE
通常比等效的 REGEXP
快。LIKE
没有前导通配符可以使用索引;我不相信 REGEXP
也是如此。REGEXP
(RLIKE
) 具有更丰富的模式匹配功能。REGEXP 'Principal'
相当于 LIKE '%Principal%'
.
只匹配一个字符。[[:<:]]
和 [[:>:]]
作为单词边界;在 8.0 中使用 \\b
。您查询的上下文是什么?如果您正在扫描表仅以获得此信息,那么将 LIKE
移到外部 WHERE
将比检查 CASE
内的每一行更快。< /p>