看了下项目周期只有十几天,然后还是政府项目,一般要求都比较多,所以系统经常崩溃我也不觉得奇怪,正好借着这次的事情想想要是自己遇到了该怎么办。
首先为什么要分库分表?
分表是因为mysql查询的时候会去全表扫描数据,且就算使用索引一般来说数据量上了千万之后就会开始变慢。所以设计表的时候首先一张表中不能有太多字段,且最好把数据量大的字段单独拉出来开一张表。这是因为在ibd文件中,数据其实是以数据页存储的。如果一行数据过大,可能就会跨页存储,影响查询效率。
那么现在分表的理由就知道了:为了避免单表行数过多,以及数量量过大影响查询效率。
分表
那怎么分表呢?因为核酸录入系统的核心数据应该是居民的数据,而且居民数据应该是健康码系统里面直接存储了的,通过身份证信息或者健康码的识别码查询。这次核酸系统崩溃最开始的时候就是身份证系统录入核酸信息崩溃。
如果是要去建立一个身份证信息的表,我想到的方式就是通过出生日期或者月份来分表,以月份为例,每个月份都建一张表,四川加上流动人口将近一个亿,单表数据其实也就一千万左右,查询的压力完全可以承受,如果害怕不能承受就以出生日期分表,分出31张表。分完表之后根据居民身份证的出生日期去查指定表的数据就行了。(记得开启mysql和nginx的最大链接配置!!)
分库
分库的话更多的是为了分担压力,因为服务器的配置有限,不可能无限内存无限算力,所以多搞几台服务器来分担压力。原理的话其实和分表差不多,但是这里可以横向分库,横向分库就可以以出生年份来分,分库之后第一个库只放80年之前出生居民的数据,第二个表就放80后出生居民的数据。当然根据需要也可以分的更细一些,压力大就多分一点多几台服务器分担,这里当然还可以使用缓存,分布式数据库,主从等方式减小压力,不过今天只说分库分表。