【发布时间】:2014-03-02 22:40:18
【问题描述】:
我有一个包含大约 100 万个电话号码的表格和另一个包含大约 3000 个 ISD 代码(国家代码)的表格。现在我想将电话号码与所有这些 ISD 代码进行最长前缀匹配。 例如,在 ISD 表中:
1 US
1808 US (Hawaii)
如果电话号码现在是 1223244223,它应该返回美国,但如果它是 1808322353,它应该返回美国(夏威夷)。 以最佳性能实现这一目标的最佳方法是什么?
这是我目前所拥有的。不幸的是,对性能不满意,我想避免使用功能:
DELIMITER $$
CREATE DEFINER=`root`@`localhost` FUNCTION `isd`(telnum varchar(32)) RETURNS int(4)
BEGIN
RETURN (SELECT if(locate(isd, telnum)=1, (locate(isd, telnum)*length(isd)), 0) as score FROM tbl_ref_isd_v1 having score>0 order by score desc limit 1);
END
另外我还有这个不同的功能,好像快一点:
DELIMITER $$
CREATE DEFINER=`root`@`localhost` FUNCTION `isd_new`(telnum varchar(32)) RETURNS int(4)
BEGIN
RETURN (
select isd
from test.tbl_ref_isd_v1
where telnum like CONCAT(isd, '%')
order by length desc LIMIT 1
);
END
【问题讨论】: