我有以下两个表,api\U analytics\U data和telecordia。
CREATE TABLE `api_analytics_data` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`upload_file_id` bigint(20) NOT NULL,
`partNumber` varchar(100) DEFAULT NULL,
`clei` varchar(45) DEFAULT NULL,
`description` varchar(150) DEFAULT NULL,
`processed` tinyint(1) DEFAULT '0',
PRIMARY KEY (`id`),
KEY `idx_aad_clei` (`clei`),
KEY `idx_aad_pn` (`partNumber`),
KEY `id_aad_processed` (`processed`),
KEY `idx_combo1` (`partNumber`,`clei`,`upload_file_id`)
) ENGINE=InnoDB CHARSET=latin1;
CREATE TABLE `telecordia` (
`tid` int(11) NOT NULL AUTO_INCREMENT,
`ProdID` varchar(50) DEFAULT NULL,
`Mfg` varchar(20) DEFAULT NULL,
`Pn` varchar(50) DEFAULT NULL,
`Clei` varchar(50) DEFAULT NULL,
`Series` varchar(50) DEFAULT NULL,
`Dsc` varchar(50) DEFAULT NULL,
`Eci` varchar(50) DEFAULT NULL,
`AddDate` date DEFAULT NULL,
`ChangeDate` date DEFAULT NULL,
`Cost` float DEFAULT NULL,
PRIMARY KEY (`tid`),
KEY `telecordia.ProdID` (`ProdID`) USING BTREE,
KEY `telecordia.clei` (`Clei`),
KEY `telecordia.pn` (`Pn`),
KEY `telcordia.eci` (`Eci`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
用户使用excel/csv文件通过web界面将数据上传到api分析数据中。数据包含零件号或CLEI。然后通过连接telecordia表来更新api\u analytics\u data表。telecordia表是partnumber和cleis的主列表。
因此,如果用户上传一个cleis文件,我使用的update/join是:
update api_analytics_data aad
inner join telecordia t on aad.clei = t.Clei
set aad.partNumber = t.Pn
where aad.partNumber is null
and aad.upload_file_id = 5;
它工作很快,但不是很彻底。我的问题是,上传的clei可能只是telecordia表中clei的子字符串。
例如,上传的clei可以是“5sc1dx0”。在telcordia表中,正确的匹配行是:
tid: 184324
ProdID: 472467
Mfg: PLSE
Pn: AUA58-2-REV-E
Clei: 5SC1DX04AA
Series: null
Dsc: DL SGL-PTY POTS CU RT
Eci: 205756
AddDate: 1994-03-18
ChangeDate: 1998-04-13
Cost: null
所以很明显我的更新在这种情况下不起作用,即使5sc1dx0和5sc1dx04aa是同一部分。
我需要的是通配符搜索。然而,当我尝试这个,它是疯狂的缓慢。大约有4500行上传到api\u analytics\u data表中,它运行了大约10分钟,然后失去了与服务器的连接。
update api_analytics_data aad
inner join telecordia t on aad.clei like concat(t.Clei,'%')
set aad.partNumber = t.Pn
where aad.partNumber is null
and aad.upload_file_id = 5;
有没有一种方法可以优化它,让它快速运行?
1条答案
按热度按时间dm7nw8vv1#
正确答案是“不”。更好的做法是在
telecordia
使用正确的Clei
值,一个可用于连接表的值。在mysql的最新版本中,它甚至可以是一个计算列并被索引。也就是说,如果匹配的部分总是相同的长度,您就可以做一些事情。如果是,请尝试以下操作:
对于这个查询,您需要一个索引
api_analytics_data(upload_fiel_id, partNumber, clei)
以及telecordia(clei, pn)
.