该函数可以通过以下方式进行优化:

  1. 使用 LIKE 操作符替换 REGEXP 操作符,因为 LIKE 操作符比 REGEXP 操作符更快。例如,将 SELECT f_string REGEXP '[1][35678][0-9]{9}' INTO isPhone; 替换为 SELECT f_string LIKE '1[35678]%' INTO isPhone;

  2. 使用 SUBSTRING_INDEX 函数来查找电话号码,而不是使用循环和 SUBSTR 函数。例如,将 SELECT SUBSTR(f_string, ipos, 11) INTO phone; 替换为 SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(f_string, '1', -1), ' ', 1) INTO phone;

  3. 将变量定义为更适当的类型,例如将 ipos 定义为 INT(11) UNSIGNED,因为它不可能为负数。

优化后的函数如下:

CREATE DEFINER=`ioc`@`%` FUNCTION `getPhone`(f_string varchar(3000) CHARACTER SET utf8mb4) RETURNS varchar(11) CHARSET utf8
BEGIN

DECLARE isPhone INT(1) DEFAULT 0;

DECLARE ipos INT(11) UNSIGNED DEFAULT 1;

DECLARE phone VARCHAR(11) DEFAULT '';

SELECT f_string LIKE '1[35678]%' INTO isPhone;

IF (isPhone=1) THEN

SET phone = SUBSTRING_INDEX(SUBSTRING_INDEX(f_string, '1', -1), ' ', 1);

END IF;

RETURN phone;

END
MySQL 5.7 中优化 `getPhone` 函数性能:无需使用 REGEXP_INDEX

原文地址: https://www.cveoy.top/t/topic/ok6B 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录