JAVA学习文档
数据库优化方法了解
优先级:
架构优化 > 硬件优化 > DB优化 > SQL优化
架构优化:
种类:分布式缓存,读写分离,分库分表
分布式缓存:
类比一下操作系统,在读写速度差距很大的两个区之间设置一个缓冲区(A区读写速度远高于B区),首先A区请求数据时,先看缓冲区是否有请求数据,没有的话将B区数据加载到缓冲区钟,有的话直接将数据从缓冲区中取出。
注意点:需要考虑缓存穿透、缓存击穿和缓存雪崩
读写分离:
部署多台数据库,选择其中一台作为主数据库(Master),其他一台或多台作为从数据库(Slave)。主数据库负责处理写请求,从数据库负责处理读请求,可以提高数据库的并发性,但是会存在Master在同步数据时的延迟问题
水平切分:
当应用业务数据量很大,单库容量成为性能瓶颈后,采用水平切分,可以降低数据库单库容量,提升数据库写性能。
DB优化:
要让一台数据库实例完全发挥其性能,首先我们就得先优化数据库的实例参数。
数据库实例参数优化遵循三句口诀:日志不能小、缓存足够大、连接要够用。
数据库事务提交后需要将事务对数据页的修改刷( fsync)到磁盘上,才能保证数据的持久性。这个刷盘,是一个随机写,性能较低,如果每次事务提交都要刷盘,会极大影响数据库的性能。数据库在架构设计中都会采用如下两个优化手法:
- 先将事务写到日志文件RedoLog(WAL),将随机写优化成顺序写
- 加一层缓存结构Buffer,将单次写优化成顺序写
SQL优化:
-
合理使用索引:
索引少了查询慢;索引多了占用空间大,执行增删改语句的时候需要动态维护索引,影响性能 选择率高(重复值少)且被where频繁引用需要建立B树索引;一般join列需要建立索引;复杂文档类型查询采用全文索引效率更好;索引的建立要在查询和DML性能之间取得平衡;复合索引创建时要注意基于非前导列查询的情况 -
使用UNION ALL替代UNION
UNION ALL的执行效率比UNION高,因为UNION执行时需要排重; -
避免select * 写法
执行SQL时优化器需要将 * 转成具体的列;每次查询都要回表,不能走覆盖索引。 -
JOIN字段建议建立索引
一般JOIN字段都提前加上索引 -
避免复杂SQL语句
提升可阅读性;避免慢查询的概率;可以转换成多个短查询,用业务端处理 -
避免where 1=1写法
-
避免order by rand()类似写法
RAND()导致数据列被多次扫描
硬件优化:
略