-
mysql调优策略
- 硬件优化
- 增加内存,让数据库能有更多的数据加载到内存,从而减少与磁盘间的io
- 增加快速存储设备,如固态硬盘(ssd)以替代传统机械硬盘,读取速度要更快
- 提升网络速度,减少因网络原因造成的传输延迟
- 使用RAID(独立磁盘冗余阵列技术):通过数据分布和冗余来提高磁盘的读写性能和可靠性。RAID技术即通过组合多个物理盘,形成一个逻辑上的单一磁盘,但是该逻辑磁盘可以提供比任意一个单一磁盘更高的容量和读写性能及数据冗余
- 其中数据分布指的是数据虽然是在一个逻辑磁盘中,但实际上分布在多个物理盘中,在进行数据读写的时候可以并行执行,io性能极强,例如RAID 0数据成条带分布在不同的磁盘中,虽然没有冗余但是读写性能极佳。
- 而冗余指的是RAID系统使数据免受磁盘故障的影响的特性。通过在多个磁盘上存储镜像(副本)或者奇偶校验(校验和)等校验信息,RAID能够在其他磁盘故障时恢复数据。
- 其中RAID 1(镜像),所有数据都在第二个磁盘上镜像,提供了最高级别的数据保护,但成本也高,需要双倍的存储空间
- RAID 5(校验信息),使用条带化和奇偶校验来实现数据冗余,但是有一个单独的磁盘存储校验信息,在其他磁盘故障时,可以从通过其他磁盘和校验磁盘中的校验信息恢复数据
- RAID 6和5类似,只是有两个存储校验信息的磁盘,可以容忍两个磁盘故障
- 配置优化
- 可以调整innodb的缓冲池大小(innnodb_buffer_pool_size):这是InnoDB存储引擎中最重要的配置参数之一,通常设置为系统内存的60%~80%。作用:在进行批量数据操作时可等待多批次数据存满缓冲池再和数据库交互,减少和数据库交互次数。而参数最大数据包max_allow_packet表示一次批量操作允许的最大数据量,日志缓冲区innodb_log_buffer_size,如果执行大量小事务,并且发现重做日志写入成为性能瓶颈
- 调整myisam缓冲区(key_buffer_size),一边一次性可以加载更多的索引到内存中,减少与磁盘间的io次数
- 设置最大连接数(
max_connections
):合理的设置最大连接数,过多的连接会大量挤占系统的CPU和内存,是的系统性能下降;而过少的连接会导致系统CPU、内存等资源的浪费,确定设置连接数量的因素主要有:- 系统CPU利用率,尤其是在高并发情况下CPU的利用率会成为瓶颈。
- 可用内存大小,每个数据库连接都会占用内存,所以从剩余可用内存可以估算最大连接数
- 磁盘io性能考虑,在高并发的情况下往往也伴随着高频率的磁盘io,此时磁盘io的性能也会成为一个瓶颈
- 在设置了新的最大连接数后,仍需监控观察数据库的CPU利用率、内存使用情况和查询响应时间等等
- 针对读多写少的场景可以启用或调整查询缓存(
query_cache_size
),但是对于写多的场景查询缓存往往会是一个负担 - 调整临时表大小(
tmp_table_size
和max_heap_table_size
),设置合理的临时表大小,在查询过程中往往需要创建临时表(例如,在GROUP BY、ORDER BY或子查询等操作中)如果临时表参数太小会导致,需要将临时表从内存中移动到磁盘中,通过磁盘io访问临时表,很影响性能。
- sql使用优化,更快速的响应请求
- 避免使用SELECT ***:只查询需要的列,避免扫描整个表。
- 避免网络传输不必要的数据
- 减少内存的使用
- 提高查询效率,有明确的列数据库的查询优化会选择高效的路径,而查询全字段的话则效率没有这么高
- 确保使用索引,使用索引可以提示搜索效率
- 使用join连表替代子查询
- join连表只需要一次全表扫描,而子查询由于多次嵌套可能需要多次扫描表,从效率上而言,join要更高一些
- 数据库优化器对join的优化效果要更好,而子查询的优化相对要复杂的多;join连表在使用索引上也更具有优势
- join连表的可读性和可维护性也要更好
- 使用类似limit等手段限制,返回的查询结果条数,尤其是查询结果是一个大数据集的时候
- 增量查询:在分页查询或者滚动加载数据时,使用增量查询(即不一次性查出所有的数据,而是在原来的基础上递增查询)
- 避免使用SELECT ***:只查询需要的列,避免扫描整个表。
- 架构设计优化
- 读写分离,减轻主库压力
- 数据库分片,提高并行访问的处理能力,也有助于拓展
- 使用缓存,减少与数据库交互的次数
- 其他优化
- 监控和日志分析(CPU利用率、内存的使用情况、IO等待时间等),分析日志找出潜在的瓶颈
- 使用性能分析工具:如MySQL Workbench、Percona Toolkit等,这些工具可以帮助识别和解决性能问题。
- 硬件优化
-
sql优化
- 索引优化:在经常查询的字段上建立索引,和联合索引
- 建立索引字段的选择:经常用来做where、join on连表、groupby分组、orderby排序条件的字段;在数据类型上选择小字段如(int、varchar、char等)而不是大文本字段;索引类型可以选择单列和复合索引;索引维护,检查和优化索引,定期删除无用的索引;特殊情况不适合建立索引的字段,频繁更新的以及包含大量重复值的字段(这种情况下索引提升效果不明显,反而可能会导致性能下降)
- 查询优化
- 尽量避免select *方式查询,只查需要的字段
- 尽量使用表连接代替子查询,子查询(多的情况)会进行多次扫描全表
- 避免出现在索引字段上计算、使用函数等导致索引失效的问题,包括其他如使用!=或<>比较,使用like "%egg"方式,使用复合索引时的顺序原则(和索引建立时顺序一致)和前缀原则(只支持索引的从左到右查询,如果索引是
(A, B, C)
,那么它可以支持A
、A, B
、A, B, C
的查询,但无法有效支持仅B
或B, C
的查询) - 在判断是否返回查询结果时使用exist替代in是个很好的选择
- 通过limit等手段,控制返回结果集的大小,在结果集较大的情况下尤其有效
- 索引优化:在经常查询的字段上建立索引,和联合索引
-
jvm调优
- 堆内存调优
- 调整堆内存大小(-xms和xmx设置初始大小和最大堆内存大小),防止堆内存过小导致垃圾回收频繁,或者内存溢出影响系统性能
- 调整新生代和老年代的比例:通过-XX:NewRatio参数调整新生代与老年代的比例,优化垃圾回收的效率和频率。如果程序中创建了大量的短生命周期的对象,可以适当增大新生代的比例。即年轻代使用的更多,需要更多的空间
- 永久代/元空间大小:Java 8以前使用永久代来存储类的元数据,Java 8及以后使用元空间。根据程序加载的类数量和反射操作的数量,可能需要调整永久代大小(-XX:MaxPermSize)或元空间大小(-XX:MaxMetaspaceSize)。类和反射出来的代理类比较多的情况会考虑调整
- 垃圾回收调优
- 根据自己的项目选择合适的垃圾回收器,依据硬件环境(多核)和项目对吞吐和停顿时间的不同需要选择不同的垃圾收集器
- 调整垃圾回收器参数:确定垃圾回收的时机和回收时间,平衡吞吐和停顿时间
- 调整堆内存占用率:
-XX:InitiatingHeapOccupancyPercent
:设置触发GC的堆内存占用率阈值。默认值可能因JVM版本而异,但通常设置为45%左右。即堆容量达到多少 时开始gc - 老年代空间使用率:对于CMS GC
-XX:CMSInitiatingOccupancyFraction
参数设置了老年代空间使用率达到多少比例时开始CMS收集。 - 控制回收时间:设置最大暂停时间-XX:MaxGCPauseMillis,即在gc过程中允许的停顿时间
- gc时间占总时间的比重:
-XX:GCTimeRatio
:这个参数设置了垃圾回收时间占总时间的比率(即吞吐量的倒数)。 - 自适应调整大小:
-XX:+UseAdaptiveSizePolicy
:对于Parallel GC和G1 GC,这个参数启用自适应大小调整功能。当启用时,JVM会根据应用的运行情况和性能监控信息动态调整新生代和老年代的大小,以优化停顿时间和吞吐量。 - 并行gc线程数:
-XX:ParallelGCThreads
:设置并行GC的线程数。这个值通常设置为与CPU核心数相等或稍大一些,以提高GC的并行处理能力。
- 调整堆内存占用率:
- 分析gc日志,包括回收次数、耗时等,进而进行针对性的调优。
- 线程调优:由于线程的性能和调度策略以及锁的性能和正确使用对jvm性能影响较大
- 线程池调优:合理的线程池参数,jvm通过调整
-Xss
参数调整线程栈大小,开启偏向锁优化 - 锁调优:在不必要使用锁的情况减少锁的使用,如使用无锁结构,使用乐观锁等,合理的锁粒度,通过读写锁和分段锁优化锁的使用
- 线程池调优:合理的线程池参数,jvm通过调整
- JIT编译器调优
- 编译阈值调整:通过-XX:CompileThreshold参数调整JIT编译器的触发时机,控制热点方法的编译时机。因为一个方法被调用多次后会以解释模式运行,而这通常比编译后的代码运行要慢,当你想提前享受热点方法编译后的性能,可以调整阈值;但这可能会增加JVM在编译期间的负载。
- 编译器选择:JVM提供了C1和C2两种JIT编译器。C1编译器注重启动速度和局部性优化,C2编译器注重峰值性能。根据程序的特点和需求选择合适的编译器。
- io调优
- 优化I/O操作:通过使用缓冲区、选择合适的I/O库、减少I/O操作次数等方式提高I/O操作的效率。需要jvm来分配io资源内存
- 类加载调优
- 优化类加载过程:通过预加载和缓存常用的类、延迟加载不必要的类等方式来优化类加载的性能。可以减少系统的启动的启动时间
- 监控和调优工具
- 使用监控和调优工具:如JProfiler、VisualVM、JConsole等,这些工具可以帮助实时监控JVM的运行状态、内存使用情况、垃圾回收情况等,并进行性能分析和调优。
- 堆内存调优
日常学习--20240806
最新推荐文章于 2024-08-07 21:56:36 发布