目前在人工智能、大数据、电商等领域,几乎所有平台都免不了与数据库打交道。随着业务的发展和数据量的不断增加,用户对于系统的响应速度的要求越来越高,于是性能问题逐渐成为了数据库中最重要,也是最迫切要解决的问题之一。
随着云时代的到来,以及自动化智能化运维的发展,我们应该从哪几方面入手,来优化数据库的性能呢?
数据库的优化通常分三个方面:
- 数据库的硬件载体优化
- 数据库语句的优化
- 数据库架构设计的优化
数据库的硬件载体优化
以前的数据库常运行在不同物理服务器的不同平台上,且设备普遍比较老旧。此外各数据库之间往往版本不统一,且普遍版本过旧、漏洞多、性能低下、维护成本较高。
随着硬件技术的进步,使数据库的硬件载体成为优化的选择之一。所有数据库可共用同一套服务器、数据库系统和存储设备,高性能的服务器能够处理更多的工作负载,在安全方面也使得所有的安全防护设备能被统一部署。
例如,无论数据库是否已被载入内存,都需要使用快速存储来处理写入操作,并且避免在数据库启动后(重启之后)出现性能问题,这里的快速存储就是指固态硬盘。因此,我们可以用SSD固态硬盘代替SAS机械硬盘,将RAID级别调整为RAID1+0,其相对于RAID1和RAID5有着更好的读写性能,毕竟数据库的压力主要来自磁盘I/O方面。
此外,物理备份是对数据库的物理文件(数据文件、控制文件、参数文件、归档日志文件)进行转储,一旦数据库发生故障,可以利用这些文件恢复到数据库的失效点。在相应的服务器数量和存储空间扩展后,就能实现数据库的防灾备份。
数据库语句的优化
1、为数据字段选择合适类型
在创建库和数据表时,就应该考虑每张表的数据类型大小。为每个表的数据字段选择合适的类型会减少数据表每一行的存储大小。
2、创建正确的索引
程序对数据库的操作,绝大部分来自查询,因此查询的优化至关重要,而大部分情况下,查询的优化在于索引命中率。索引基本上是一个数据结构,正确的索引有助于加快整个数据检索过程。
3、仅检索相关数据
当数据源非常庞大时,指定所需要用的数据集将节省大量检索时间。
4、摆脱相关的子查询
相关子查询基本上取决于父查询或外部查询。这种搜索是逐行完成的,这意味着它会降低整个过程的速度。所以子查询完全可以拆分出来,先生成临时表,再做关联查询。
5、根据要求使用临时表
以简单的方式书写临时表代码,不要让其复杂化。
6、避免编码循环
避免编码循环,因为它会拖慢整个序列。
7、避免频繁和数据库连接
当需要批量插入数据、查询多个表信息时,在条件允许情况下,尽量一次性执行完。
数据库架构设计的优化
一个成熟的数据库架构并不是一开始设计就具备高可用、高伸缩等特性的,它是随着用户量的增加,其架构才逐渐完善。
数据库设计阶段的优化非常重要,当后期数据库表里面已经有了大量数据,且有大量的程序对此表有操作时,再对其进行修改的话,就会难上加难。慢查询(低效的查询语句)、没有适当建立索引、数据库堵塞(锁)等问题会直接影响到用户访问速度和体验度。因此,我们要在架构设计方面未雨绸缪,提前做好准备。
数据库架构设计方面的优化手段包括有:读写分离、主从配置、双机热备、分库分表等等。
例如在生产环境中,业务系统通常读多写少,因此可部署一主多从架构,主数据库负责写操作,并做双机热备,多台从数据库做负载均衡,负责读操作,在代码层面或通过代理程序实现读写分离。
分库是根据业务将数据库中相关的表分离到不同的数据库中,如果业务量很大,还可将分离后的数据库做主从复制架构,进一步避免单库压力过大。若能把复杂单表拆分成多个小表,来减轻单个表的压力,也将提高处理效率。
另外,还可以通过分解单台数据库负载来突破磁盘I/O性能;或将热数据存放缓存中,以降低磁盘I/O访问频率。