求一个高性能模糊查询电话号码的设计!请有经验的同志说说思路吧!!
有个电话号码的库,数据量其实并不大,只有80-100万,但是号码特别的不规范,类似于:
01088888888
010-88888888
(010)88888888
010_88888888
010 88888888
01088888888-888
(+86)01088888888
013888888888
13888888888
8613888888888
138 8888 8888
1388 888 8888
13888888888
013888888888
手机13888888888
本人电话13888888888
(以上并不全)
目前的服务器直接用like '%138%'查询的话,需要2-3s,我们现在想将查询响应时间降低到1s。我想通过分表的方法提高性能,可怎么分呢?按常用/不常用分不了,所有电话都是可能近期回电的,按号段又发现,136的特别多,158的特别少,总是分不很均匀。请教大伙了!有好的建议吗?
快过年了,祝大家马上有大的年终奖!!!
------解决方案--------------------试试全文索引
------解决方案--------------------因为你永远无法穷举会有多少种情景
------解决方案--------------------原始数据问题较多。先整理下数据,然后做好索引, 百十来万,1s查找不是问题。
------解决方案--------------------
可以考虑试试用全文检索:
SQLserver2008全文检索使用方法
http://wenku.baidu.com/link?url=uBQ2bLQQL2RQr6v0hYNvXWE520bwtOhfkrOt8czhYD5kRL5eMUO9bsZwFHzh6_7MSV40muSf-iQJLQOqLWaYRHgYmZCsPuRbfw42cmtPyl_
------解决方案--------------------碰到过类似的需求。当时使用的是一种折中方案。
太久记不起来了,大致如下
建立2个用于查询的中转表:固定电话、手机。
其中的数据规范化处理后再批量导入。
1、固定电话子表
ID,主键
ID_TRUE,用于指定母表(原始信息)的主键
区号,聚集索引
号码
2、手机号码子表
ID,主键
ID_TRUE,用于指定母表(原始信息)的主键
前7位号码,聚集索引。(因为前7位可以用于判断手机号码所属区域)
后4位号码。
业务处理流程,以查询固定电话为例
查询固定电话子表——得到ID_TRUE(也就是母表的主键)——再查询母表的详细信息。
大概这样吧,有点远的事,忘记细节了。