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

  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;

EN

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

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

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