数据库14——数据库优化4

126 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

数据库结构的优化

什么情况下需要分库分表?

数据库角度看,数据库出现瓶颈时:

(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.分表