求一个高性能模糊查询电话号码的设计!请有经验的同志说说思路吧!!

一只熊猫 2014-01-20 04:37:07
有个电话号码的库,数据量其实并不大,只有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的特别少,总是分不很均匀。请教大伙了!有好的建议吗?

快过年了,祝大家马上有大的年终奖!!!
...全文
728 39 打赏 收藏 转发到动态 举报
写回复
用AI写文章
39 条回复
切换为时间正序
请发表友善的回复…
发表回复
绿蚂蚁 2014-02-14
  • 打赏
  • 举报
回复
pborvb 2014-02-01
  • 打赏
  • 举报
回复
规则是必须有的,否则甲乙丙丁都出来
lifefamily11 2014-01-29
  • 打赏
  • 举报
回复
建议先寻找数据规律,批量进行数据规整。然后再建索引就快了。今后新添加数据,进新增数据前,过滤一下
白云任去留 2014-01-29
  • 打赏
  • 举报
回复
入库时就应该严格规范校验数据的格式!
hgwyl 2014-01-28
  • 打赏
  • 举报
回复
碰到过类似的需求。当时使用的是一种折中方案。 太久记不起来了,大致如下 建立2个用于查询的中转表:固定电话、手机。 其中的数据规范化处理后再批量导入。 1、固定电话子表 ID,主键 ID_TRUE,用于指定母表(原始信息)的主键 区号,聚集索引 号码 2、手机号码子表 ID,主键 ID_TRUE,用于指定母表(原始信息)的主键 前7位号码,聚集索引。(因为前7位可以用于判断手机号码所属区域) 后4位号码。 业务处理流程,以查询固定电话为例 查询固定电话子表——得到ID_TRUE(也就是母表的主键)——再查询母表的详细信息。 大概这样吧,有点远的事,忘记细节了。
lg314 2014-01-28
  • 打赏
  • 举报
回复
导入的时候做数据清洗是必要的,但我想这样的系统,如果需要即时查询(0.1s以内的响应速度,返回pv值最高的10条),应该要怎么实现?
jackylongchen 2014-01-28
  • 打赏
  • 举报
回复
KeepSayingNo 2014-01-21
  • 打赏
  • 举报
回复
想用户资料表单至少应该分为座机和手机吧,把这个分开录入然后查的时候都可以减少很多开销,另外号码前端验证,这个是最基本,建议还是弄上,怎么都不会出现“本人电话13888888888”奇葩的输入,呵呵
jason131203 2014-01-21
  • 打赏
  • 举报
回复
where charindex('133',字段)>0 比like ‘%133%’要高,试一下,看行不行
Yole 2014-01-21
  • 打赏
  • 举报
回复
录入的时候客户的既然不让动,你们就自己加一个规范后的号码,然后查询的时候用这个规范后的号码。
發糞塗牆 2014-01-21
  • 打赏
  • 举报
回复
核心还是要规范列中数据类型,不然任何技术都是低效的(大量数据的前提下)
引用 19 楼 Going1981 的回复:
[quote=引用 17 楼 yupeigu 的回复:] [quote=引用 16 楼 Going1981 的回复:] [quote=引用 15 楼 DBA_Huangzj 的回复:] 把时间分摊在插入的过程中,比你在查询的过程中处理会好很多
谢谢!我就按这个思路解决![/quote] 你的意思是在插入数据的时候,通过正则表达式等方式,来实现分类?[/quote] 是的,不一定用正则,反正是分类储存,使查询范围尽可能小。[/quote]
一只熊猫 2014-01-21
  • 打赏
  • 举报
回复
引用 17 楼 yupeigu 的回复:
[quote=引用 16 楼 Going1981 的回复:] [quote=引用 15 楼 DBA_Huangzj 的回复:] 把时间分摊在插入的过程中,比你在查询的过程中处理会好很多
谢谢!我就按这个思路解决![/quote] 你的意思是在插入数据的时候,通过正则表达式等方式,来实现分类?[/quote] 是的,不一定用正则,反正是分类储存,使查询范围尽可能小。
Hope_f 2014-01-21
  • 打赏
  • 举报
回复
看走眼了,估计不会是吧。
Hope_f 2014-01-21
  • 打赏
  • 举报
回复
马萨嘎,难道那些垃圾短信制造者正在此地?...
jackylongchen 2014-01-21
  • 打赏
  • 举报
回复
HaoYuan 2014-01-21
  • 打赏
  • 举报
回复
先把数据进行归一化处理吧
發糞塗牆 2014-01-21
  • 打赏
  • 举报
回复
这个问题实际上是规则问题,不是查询问题,塞内存就可以解决?呵呵
三断笛 2014-01-21
  • 打赏
  • 举报
回复
先把数据整理好.要有规范.固话,手机规范好格式. 再建立索引,分区,分表,塞内存,怎么搞都不慢.
武江伟 2014-01-21
  • 打赏
  • 举报
回复
学习了
引用 14 楼 DBA_Huangzj 的回复:
[quote=引用 楼主 Going1981 的回复:] 有个电话号码的库,数据量其实并不大,只有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的特别少,总是分不很均匀。请教大伙了!有好的建议吗? 快过年了,祝大家马上有大的年终奖!!!
或者你做一个前端程序,导入过程中过滤一些不符合要求的数据,或者用前端语言的正则表达式来查找有用的信息,存到表里面,这样查询的时候估计可以秒杀[/quote] 学习了
七神之光 2014-01-21
  • 打赏
  • 举报
回复
加内存吧 都放内存里
加载更多回复(19)

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧