现在假设有一个14亿人(条)的数据库,保守估计数据库50G
每条数据存放着个人的基本信息,姓名,性别,出生年月日,籍贯,身份证号码这五个信息。
检索时只检索身份证号码,以什么方式存储检索时效率最高?要求1秒以内
想法1,存放MSSQL数据库中,对身份证号码建立索引。
想法2,存放在MYSQL数据库中。
想法3,以文本形式存放在硬盘中。
特别对于第三条我们研究比较多,于是就想:
每条信息以文本形存放在一个文件夹中,文本文件的名字就是身份证号码,比如:101512198212088445.txt
检索时,直接根据身份证号码读取文本,并将本文中的信息显示出来。
因为没有经验,所以这种方法也有几个问题,
首先就是计算机读取小文件较慢,速度是否比读取数据的数据来得快?有经验的朋友可以说说?
其次就是,一个文件夹中存放14亿条信息,计算机读取时速度跟得上吗?
有网友认为一个文件夹中存放这么多,速度肯定不行,比如要读取第10亿零1条文本,得先看前面10亿条。速度不行。
又有网友讲,必须分文件夹才能提高效率。
于是又想,按省市来存建立文件夹,比如:101512198212088445,这个身份证号,就先建立一个1015121文件夹,再在该文件夹下面存放101512198212088445.txt 这样是不是读取更快些?
最后有人指出,硬盘的扇区一般是4K,存放一个512B字节的文本,也得占用4K,需要的磁盘空间比存放在数据库中大得多。
现在搞得我们都不知道如何存放这里数据了。
------解决思路----------------------
mysql没啥研究,不多说,存文件的话,14亿个文件检索起来估计快不了哪里去,经常我在C盘搜带有某个词的文件,通常都要好几分钟。如果放到SQL Server,假设下面几个前提都满足:
1、SQL Server 2012/2014 企业版
2、14亿数据几乎是固定,不存在增删改操作。
3、纯查询身份证号,并且返回的数量不多,比如即使是in xxxx个身份证号,这些也不多的情况下。
那我建议你对身份证这列加列存储索引。1秒内查出来应该没问题,身份证号极度唯一(除非数据出错),但是不是很适合做分区,因为范围不好定。所以我觉得分区就算了,光列存储索引应该就够了
------解决思路----------------------
有网友认为一个文件夹中存放这么多,速度肯定不行,比如要读取第10亿零1条文本,得先看前面10亿条。速度不行。
又有网友讲,必须分文件夹才能提高效率。
于是又想,按省市来存建立文件夹,比如:101512198212088445,这个身份证号,就先建立一个1015121文件夹,再在该文件夹下面存放101512198212088445.txt 这样是不是读取更快些?
这不就是索引的思想么,数据库替你做好了,并且“不可能”比你自己做的差(一定比你分文件夹什么玩意的要好的多),干嘛还要存储在文件中呢
14亿数据也没试过, 根据聚集索引查询的话,因为B树结构的高度也不过是6层,最多6次Io,估计不会太慢
------解决思路----------------------
分区/分表存储,身份证号前六位 是省市县的代码,通过前六位找到在哪个分区,然后再查找
县级数据还很多的话,可以县内再分区
7-14为为出生日期,按出生年月进行分区,如5年建一个分区
就相当于建立一个多层级的目录,然后再找就很简单了
------解决思路----------------------
用数据库。
将身份证号拆分成:地区代码+出生日期+序号和校验码,
用 (出生日期,地区代码,序号和校验码) 做聚集索引(主键)。
出生日期、地区代码可以用 int 型。
又:基本信息的出生年月日、性别都在身份证号中,建议省略。
------解决思路----------------------
这个肯定用数据库呀,用文件肯定非常慢,加大内存,肯定会快的。
------解决思路----------------------
这肯定用数据库啊,索引都是现成的,你用文件夹为了提高检索效率肯定也需要索引的概念,既然数据都是现成的,为何不用数据库捏!
------解决思路----------------------
1、感觉得用数据库
2、分表,一个省一个表
3、分区,一个表再分区
4、分物理磁盘存放
数据在千万级别上了,查询应该不是问题
------解决思路----------------------
用MSSQL OR MYSQL是正道
按身份证号建聚集索引即可
没必要做分区,若无特别管理需求的话,潮流的概念很多,但不一定适合你用
用文本文件也行,其实也就是个二分法查找而已
但做其他处理就太麻烦
杀猪杀屁股也能杀死,方法不同而已
------解决思路----------------------
只需要做一次预处理而已:
新建的表以身份证号码为主键。
用游标遍历有重复的记录,可以检查新表中是否已经存在身份证号码,不存在就插入。
最后将旧表删除。