我有一张2000W数据的表 就一列都是手机号。(将来有可能过亿)
现在有人提交1W个号码,怎么才能快速判断出手机号是否在这张表中 现在这样 直接迭代1W次共花费掉12000毫秒,我用IN了但是每次只能1K个号耗时100毫米 要是十次那就是1000毫秒 效率已经有了提供 希望能控制在100毫秒,另手机号字段已经建立了主键,如果在建立索引,会起作用吗?会提高效率吗?
用内存的SET当然可以,有弊端,当过大时,效率也会降低,不利于维护,共享数据!测试本地5000KW,JVM暴了,只能加大JVM内存! 1000KW不是问题,但不能不考虑以后!
最好MYSQL 或 oracle 数据库啊 太复杂的我不会!大家发的解决方案,我一定好好测试
采用分区1W个手机号要查询好几次 去每个分区差 最后效率没有提高
通过建立索引还没有解决 现在能达到500毫秒
表分割的后果 按号段来存储134,135 带来后果,1W个号要查询多个表,按性能要求,平均下来查一个表要10毫秒搞定 有点难
我只要能控制在100毫秒 就心满意足了
请量化你的“快速”的含义。并给出目前的查询性能状况,不然无法进行优化。如果是相对手工,那么怎么都算快的。
下面列出可能用得到的优化
1.给手机号这列增加索引
2.因为手机号是有号段的。比如134 135 139等等。可以先把1W条记录分拆成几个部分。比如开头3位,其实总数并不多。可以先提取出来进行排查。这样很快1W条就过滤掉不少了。然后继续几位几位逐渐过滤。还可以考虑给手机号字段增加函数索引,更加加快速度。
3合理规划表和索引的表空间
一般来说,对手机号建立索引就可以了,索引是很快的。
如果要求性能更高,在比较极端的情况下,可以直接把1千万手机号都放到内存里作为HashSet或HashMap,这样查询更快,不过维护内存中数据和表中一致要额外做些工作。
1.一万号码写入临时表
2.再调用merge语句(DB2,ORACLE都有该语法,其他数据库不清楚)