本文已参与「新人创作礼」活动,一起开启掘金创作之路。
数据库结构的优化
什么情况下需要分库分表?
从数据库角度看,数据库出现瓶颈时:
(1)高并发场景下,大量数据库操作的请求被阻塞。
(2)SQL操作变慢时,若当数据量非常大,查询没有命中索引会全表扫描,非常耗时。
(3)单机存储出现问题,业务量剧增时,单库数据量越来越大,给存储造成巨大压力。
从机器角度看,性能瓶颈在CPU、内存、磁盘等。
优化:SQL调优、表结构优化、分库分表、数据库集群+读写分离、提高机器性能等;
表结构优化:
- 尽量选择简单的数据类型(int, varchar/ text)
- 尽量不要存储NULL值;
- 在合适的地方创建索引(小字段、不要null)
分表:
(1)表的水平切分(Sharding,同库水平拆分):将同一个表中的记录拆分到多个结构相同的表中(策略:哈希取模、ID范围、日期划分)。当一个表的数据不断增多时,Sharding 是必然的选择,优点:减小单张表的索引树,提高查询效率;减小大表更新时的锁等待;缓解单个数据库的压力;
(2)表的垂直切分:将一张表按列切分成多个表。经常使用的(关系密切的)字段放在一张表中。将不常用的字段放在一张表中;大字段放在一张表中;优点:使业务更清晰,数据维护更简单。
分库:
将服务的表放到不同的数据库,甚至将一个系统拆分为多个子系统,例如微服务架构。
单库拆分:将不同服务的表放到不同的库。(单库也有瓶颈)
多库拆分:一张表拆分到多个库,减小单张表的大小。
问题:(1)跨库关联问题(冗余字段、全局表)、(2)分布式事务问题(MQ)、(3)分布式ID(UUID)(4)排序与分页与函数问题(单表计算后汇合)。
系统配置的优化
- 操作系统:增加TCP支持的队列数;
- MySQL配置文件优化:缓存池大小和个数设置
硬件的优化
- 磁盘性能:固态硬盘;
- CPU:多核且高频;
- 内存:增大内存
表中包含几千万条数据该怎么办?
1.优化SQL和索引,使用limit查询必要的行(Id连续增加时,指定偏移量Between and;连接查询优化),
查大数据量时(不查询不需要的列)
2.增加缓存,如memcached、redis;
3.读写分离,可以采用主从复制,也可以采用主主复制;
4.分表