2022-09-09 mysql列存储引擎-POC-需求分析

摘要:

对POC提出的需求做分析, 以作为下一步行动的依据。并作为与非开发者沟通的桥梁。

POC项目描述:

DDL:

CREATE TABLE `CUSTOM` (
`USID` varchar(50) NOT NULL COMMENT '????',
`PASSWORD` varchar(32) NOT NULL COMMENT '????',
`LGTP` varchar(2) NOT NULL COMMENT '????',
`USTP` varchar(2) NOT NULL COMMENT '????',
`STATUS` varchar(2) NOT NULL COMMENT '??????',
`USQX` varchar(20) NOT NULL COMMENT '????',
`AUTOFAPIAO` int(11) NOT NULL COMMENT '????????????',
`USDJ` int(11) DEFAULT NULL COMMENT '????',
`ISZHIFUSELF` int(11) DEFAULT NULL COMMENT '?????????',
`ZHIFUID` varchar(50) DEFAULT NULL COMMENT '????????',
`ISAUDITSELF` int(11) DEFAULT NULL COMMENT '?????????',
`AUDUSID` varchar(50) DEFAULT NULL COMMENT '????????',
`TTLB` varchar(2) DEFAULT NULL COMMENT '????',
`SUSID` varchar(50) DEFAULT NULL COMMENT '?????????',
`CORPNAME` varchar(100) DEFAULT NULL COMMENT '????',
`TOURLICENSECODE` varchar(50) DEFAULT NULL COMMENT '???????',
`BUSINESSLICENSESCODE` varchar(50) DEFAULT NULL COMMENT '??????',
`TOURLICENSEUPID` int(11) DEFAULT NULL COMMENT '????????',
`BUSINESSLICENSESUPID` int(11) DEFAULT NULL COMMENT '??????',
`LNAME` varchar(50) DEFAULT NULL COMMENT '?????',
`ZJLB` varchar(2) DEFAULT NULL COMMENT '???????',
`ZJHM` varchar(50) DEFAULT NULL COMMENT '????',
`IREGIONALID` int(11) DEFAULT NULL COMMENT '???',
`BANK` varchar(100) DEFAULT NULL COMMENT '????',
`ACCOUNT` varchar(50) DEFAULT NULL COMMENT '????',
`BNAME` varchar(100) DEFAULT NULL COMMENT '???',
`ADDR` varchar(200) DEFAULT NULL COMMENT '??',
`TELNO` varchar(50) DEFAULT NULL COMMENT '????',
`MOBILE` varchar(50) DEFAULT NULL COMMENT '????',
`FAXNO` varchar(50) DEFAULT NULL COMMENT '????',
`QQ` varchar(50) DEFAULT NULL COMMENT 'QQ??',
`MSN` varchar(50) DEFAULT NULL COMMENT 'MSN??',
`POSTNO` varchar(6) DEFAULT NULL COMMENT '????',
`EMAIL` varchar(50) DEFAULT NULL COMMENT 'email??',
`LDATE` varchar(20) NOT NULL COMMENT '????',
`LASTDATE` varchar(20) DEFAULT NULL COMMENT '??????',
`LOGTIMES` varchar(50) DEFAULT NULL COMMENT '??????',
`NOTEA` varchar(100) DEFAULT NULL,
`NOTEB` text,
`TIMES` int(11) DEFAULT NULL COMMENT '??????',
`LMDATE` varchar(20) DEFAULT NULL COMMENT '??????????',
`LPDATE` varchar(20) NOT NULL COMMENT '????????',
`CDATE` varchar(20) DEFAULT NULL COMMENT '??????',
`MMQT` varchar(4) DEFAULT NULL COMMENT '??????',
`MMDA` varchar(100) DEFAULT NULL COMMENT '??????',
`NOTE1` varchar(100) DEFAULT NULL,
`NOTE2` varchar(100) DEFAULT NULL,
`NOTE3` varchar(100) DEFAULT NULL,
`NOTE4` varchar(100) DEFAULT NULL,
`NOTE5` varchar(100) DEFAULT NULL,
`NOTE6` varchar(100) DEFAULT NULL,
`NOTE7` varchar(100) DEFAULT NULL,
`NOTE8` varchar(100) DEFAULT NULL,
`NOTE9` varchar(100) DEFAULT NULL,
`NOTE10` varchar(100) DEFAULT NULL,
`INOTE1` int(11) DEFAULT NULL,
`INOTE2` int(11) DEFAULT NULL,
`INOTE3` int(11) DEFAULT NULL,
`INOTE4` int(11) DEFAULT NULL,
`INOTE5` int(11) DEFAULT NULL,
`INOTE6` int(11) DEFAULT NULL,
`INOTE7` int(11) DEFAULT NULL,
`INOTE8` int(11) DEFAULT NULL,
`INOTE9` int(11) DEFAULT NULL,
`INOTE10` int(11) DEFAULT NULL,
`IBUSINESSID` int(11) NOT NULL COMMENT '??ID',
`DAOYOUNO` varchar(50) DEFAULT NULL COMMENT '????',
`DTMAKEDATE` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`PAYPASSWORD` varchar(32) DEFAULT NULL,
`AGENTID` decimal(18,0) DEFAULT NULL,
`OPENUSERID` varchar(100) DEFAULT NULL,
`OPENID` varchar(100) DEFAULT NULL,
`QRCODEURL` varchar(100) DEFAULT NULL,
`PROMOTERID` varchar(100) DEFAULT NULL,
PRIMARY KEY (`USID`) USING BTREE
) ENGINE=TIANMU DEFAULT CHARSET=utf8;

自定义函数:

DELIMITER ;;
CREATE DEFINER=`root`@`%` FUNCTION `FIND_TOP_USID`(PUSID VARCHAR(1000)) RETURNS varchar(1000) CHARSET utf8
BEGIN
DECLARE FINALVAR VARCHAR(100);
WHILE LENGTH(PUSID) > 0 DO
SET FINALVAR = PUSID;
SELECT SUSID INTO PUSID FROM CUSTOM WHERE USID = FINALVAR;
IF FINALVAR = PUSID
THEN SET PUSID = '';
END IF;
END WHILE;
RETURN FINALVAR;
END ;;
DELIMITER ;

查询SQL:

SELECT C.SUSID,
C2.CORPNAME AS SCORPNAME,
C2.BNAME,
C.USID,
C.CORPNAME,
C.IBUSINESSID,
C.TTLB
FROM (SELECT USID,
CORPNAME,
IBUSINESSID,
TTLB,
FIND_TOP_USID(USID) AS SUSID
FROM CUSTOM
WHERE LGTP = '02'
AND USTP = '01'
AND IBUSINESSID = 2) C
LEFT JOIN CUSTOM C2
ON C2.USID = C.SUSID;

需求:

一. 在列存储引擎中支持动态函数的调用功能

二. 使用自定义动态函数功能的查询语句, 查询性能逼近SQL重写后的语句(毫秒级)

SELECT FIND_TOP_USID(C.USID) AS SUSID,
C2.CORPNAME AS SCORPNAME,
C2.BNAME,
C.USID,
C.CORPNAME,
C.IBUSINESSID,
C.TTLB
FROM CUSTOM C
LEFT JOIN CUSTOM C2
ON C2.USID = C.SUSID
WHERE C.LGTP = '02'
AND C.USTP = '01'
AND C.IBUSINESSID = 2

现有代码支持评估:

一. 不支持自定义动态函数的调用功能

二. 使用自定义动态函数功能需开启tianmu_ini_allowmysqlQuerypath 参数, 但是开启后大量SQL查询结果是错误的

开发影响评估:

一. 是否在列存储引擎中开发自定义动态函数的调用功能

1.1 走开发流程, 工期多少?是否能在工期内有足够的人力完成? 对代码的熟悉程度?

二. 如果利用tianmu_ini_allowmysqlQuerypath 参数, 经过定位后, 需要涉及的代码范围过大,如何处理

2.1 是否有人对tianmu_ini_allowmysqlQuerypath 参数开启对代码逻辑影响有了解?

2.2 如果没人了解, 那么了解清楚这些逻辑, 需要耗费多少人月?

2.3 即使了解清楚了影响的逻辑, 如果涉及修改的代码量巨大, 无法快速在一两天内完成, 该如何处理?

2.4 即使搞加强版的加班, 天天搞到凌晨两点, 但是大脑激素分泌耗尽毒素持续毒害影响对逻辑的推进,该如何进行?