MySQL 5.7 中优化 `getPhone` 函数性能:无需使用 REGEXP_INDEX
该函数可以通过以下方式进行优化:
-
使用 LIKE 操作符替换 REGEXP 操作符,因为 LIKE 操作符比 REGEXP 操作符更快。例如,将
SELECT f_string REGEXP '[1][35678][0-9]{9}' INTO isPhone;替换为SELECT f_string LIKE '1[35678]%' INTO isPhone; -
使用 SUBSTRING_INDEX 函数来查找电话号码,而不是使用循环和 SUBSTR 函数。例如,将
SELECT SUBSTR(f_string, ipos, 11) INTO phone;替换为SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(f_string, '1', -1), ' ', 1) INTO phone; -
将变量定义为更适当的类型,例如将
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
原文地址: https://www.cveoy.top/t/topic/ok6B 著作权归作者所有。请勿转载和采集!