MySQL57中 不使用REGEXP_INDEX函数来优化该函数 CREATE DEFINER=ioc FUNCTION getPhonef_string varchar3000 CHARACTER SET utf8mb4 RETURNS varchar11 CHARSET utf8BEGINDECLARE isPhone INT1 DEFAULT 0;DECLARE ipos INT11 DE
该函数可以通过以下方式进行优化:
-
使用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;
EN
原文地址: https://www.cveoy.top/t/topic/fFeM 著作权归作者所有。请勿转载和采集!