如何对数据库进行优化-购够乐网上商城对其进行分析优化,
目录
一、简介
首先我们来看一下,数据库优化可以从那些方面着手:
如上图所示,数据库优化可以从四个维度入手:架构优化、硬件优化、DB优化、SQL优化。
从上到下,位置越高,优化越明显,对数据库的性能提升越高。 我们常说的SQL优化就是对性能提升最少的优化。
接下来,让我们看看每个优化是如何实现的。
2、结构优化
一般来说,优化架构层的效果在高并发场景下最为明显。 常见的优化方式有:分布式缓存、读写分离、分库分表等,每种优化方式都适用于不同的应用场景。
分布式缓存
有句老话说的好,性能不够,缓存可以弥补。 当我们需要在架构层进行优化时,我们会立即将缓存视为神器,在应用程序和数据库之间添加缓存服务,例如 Redis 或 Memcache。
当收到查询请求时,我们首先查询缓存,判断缓存中是否有数据,然后直接将数据返回给应用程序。 如果没有数据,查询数据库,加载到缓存中,大大减少了访问数据库的次数。 自然地,数据库性能也得到了提升。
但是需要注意的是,引入分布式缓存后,系统需要考虑如何应对缓存穿透、缓存击穿、缓存雪崩等问题。
读写分离
一主多从、读写分离、主动同步是常见的数据库架构优化手段。
一般来说,当你的应用读多写少,数据库无法承受读的压力时,可以采用读写分离的方式,通过增加从库的数量来线性提升系统的读性能。
主库提供数据库写入服务; 从库提供数据库读取功能; master和slave之间,通过binlog同步数据。
在准备实现读写分离时,为了保证高可用,需要实现故障的自动转移,而主从架构会存在潜在的主从不一致性。
水平分割
水平分片也是数据库架构优化的常用手段。
当您的应用业务数据量大,单库容量成为性能瓶颈时,水平分片可以降低单库容量,提高数据库写入性能。
在准备实施水平分片时,需要根据实际业务选择合理的分片键(sharding-key)。
架构优化总结
读写分离主要用于解决“数据库读取性能问题”
水平切分主要用于解决“数据库数据量大的问题”
分布式缓存架构可能比读写分离更适合高并发、大数据量的场景。
3、硬件优化
我们在使用数据库的时候,无论是读操作还是写操作,最终都需要访问磁盘,所以磁盘的性能决定了数据库的性能。 PCIE固态硬盘的性能是普通机械硬盘的几十倍。 这里我们可以从吞吐量和IOPS两个维度来看一下机械硬盘、普通固态硬盘和PCIE固态硬盘之间的性能指标。
吞吐率:单位时间内读写的数据量
IOPS:每秒IO操作数
从以上数据我们可以直观的看出,不同规格的硬盘之间的性能差距是非常大的。 当然,性能更好的硬盘价格会更贵。 当资金充足,急需提高数据库性能时,尝试更换数据库硬盘。 这是一个很好的举措,你之前遇到的SQL执行慢的问题在你更换硬盘后可能就不是问题了。
4.数据库优化
有时 SQL 执行缓慢并不一定完全是 SQL 问题。 手动安装数据库,不做任何参数调整,无论SQL再怎么优化,都无法发挥其性能的最大化。 为了让数据库实例充分发挥其性能,首先要优化数据库的实例参数。
数据库实例参数优化遵循三个口头禅:日志不要小,缓存要足够大,连接要足够。
数据库事务提交后,事务对数据页的修改需要刷新(fsync)到磁盘,以保证数据的持久化。 这种磁盘刷新是一种低性能的随机写入。 如果每次事务提交都刷新磁盘,会极大地影响数据库的性能。 数据库架构设计中采用了以下两种优化方法:
所以日志和缓存对于数据库实例来说尤为重要。 如果连接不够如何对数据库进行优化,数据库会直接抛出异常,系统无法访问。
五、SQL优化
SQL优化很容易理解。 就是通过给查询字段加索引或者重写SQL来提高它的执行效率。 总的来说,SQL编写有以下通用技巧:
索引越少,查询就会越慢; 索引过多会占用大量空间,而且在执行增删改查语句时需要动态维护索引,影响性能。 选择率高(重复值少),被where频繁引用,需要建立B树索引; 一般情况下,join列需要建立索引; 复杂文档类型查询使用全文索引效率更高; 索引的建立要在查询和DML性能之间取得平衡; 创建复合索引时,注意基于非前导列查询的情况
UNION ALL的执行效率高于UNION如何对数据库进行优化,因为UNION在执行的时候需要去重;
执行SQL时,优化器需要将*转换成具体的列; 每次查询都要返回表,不能使用覆盖索引。
一般JOIN字段都是预先建立索引的
提高可读性; 避免慢查询的概率; 可以转化为多个短查询,由业务方处理
RAND() 导致数据列被多次扫描
实施计划
如果要优化SQL,必须要看执行计划。 执行计划会告诉你哪里效率低,哪里需要优化。你可以通过explain sql查看执行计划
SQL优化总结
下面总结一下SQL优化套路:
查看执行计划解释sql
如果有警告信息,查看警告信息show warnings;
查看SQL涉及的表结构和索引信息
根据执行计划,思考可能的优化点
根据可能的优化点进行表结构变更、索引添加、SQL重写等操作
查看优化后的执行时间和执行计划
如果优化效果不明显,重复第四步