《性能测试》读书笔记_数据库优化

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
日志服务 SLS,月写入数据量 50GB 1个月
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 《性能测试》读书笔记_数据库优化

数据库配置常用参数

  • innodb_buffer_pool_size:InnoDB 缓存数据、索引、锁、插入缓冲、数据字典等
  • innodb_log buffer size:InnoDB日志缓存区的大小
  • innodb log file size:InnoDB 重做日志的大小

innodb_log_files ingroup:InnoDB重写日志文件组

  • innodb_file_per_table:设置为0表示使用共享表空间,设置为1表示启用InnoDB的独立表空间,便于管理
  • innodb_temp_data file path:设置临时表最大空间
  • innodb_status_file:可启用InnoDB的状态文件,便于管理员查看以及监控
  • innodb_flush_log_at_trx_commit: 当设置为0时,该模式速度最快,但不太安全mysqld 进程的崩溃会导致上一秒所有事务数据的丢失。当设置为1时,该模式是最安全的,但是速度最慢。在 mysqld 服务崩溃或者服务器主机宕机的情况下,二进制日志最多只可能丢失一个语句或者一个事务。当设置为2时,该模式速度较快,也比0安全,只有在操作系统崩溃或者系统断电的情况下,截至上一秒的所有事务数据才可能丢失
  • max_connections:将所有的账号的所有的客户端并行连接到MySOL服务的最大数量,简单说是指 MySQL 服务能够接受的最大并行连接数
  • max_user_connections:将某一个账号的所有客户端并行连接到 MySQL服务的最大数量,简单说是指同一个账号能够同时连接到 MySOL服务的最大连接数。设置为0表示不限制
  • max_connect_errors:指某一个IP 主机连续连接失败的次数,如果超过这个值,这个IP 主机将会阻止自身发送出去的连接请求
  • tmp_table_size:设置临时表内存最大值,每个线都要分配该空间,不宜设置过大max_heap_table_size和tmp_table_size 建议设置一样大
  • sort_buffer_size:排序缓冲区大
  • join_buffer_size:表连接缓冲区大小
  • read_buffer_size:读取缓冲区大小。
  • read_rnd_buffer_size:随机读取缓冲区大小
  • query_cache_size:查询缓存,建议关闭。设置为0表示关闭,设置为1表示开启
  • key_buffer_size:索引块使用的缓冲大小。如果是InoDB引擎,key buffer size可以设置较小。如果是以 MyISAM引擎为主,则可设置较大。
  • interactive_timeout:交互式连接的超时时间,例如使用MySQL客户端连接数据库
  • wait_timeout:非交互式连接的超时时间,例如使用JDBC 连接数据库。
  • innodb_read_io_threadsInnoDB & innodb_write_io_threads:读写O线程数,建议等于CPU核数,值的允许范围是 1~64。如果读操作比写操作多,可适度调大读线数,调小写线程数。
  • long_query_time:设置慢查询值,单位为秒。
  • slow_query_log:是否开启MySQL慢 SQL的日志,设置为0表示关闭,设置为1表示开启
  • log_output:设置日志输出是写表还是写日志文件,为了便于程序去统计,建议写表
  • slow_query log file:设置慢查询日志存放的路径。
  • log_throttle_queries_not_using_indexes:该参数用来限制相同慢查询语句每分钟被记录到慢查询日志中的次数,防止慢查询日志的过快增大。
  • log_queries_not_using indexes: 是否检查未使用索引的 SQL,设置为0表示关设置为1表示开启。
  • innodb_buffer_pool_dump_at_shutdown & innodb_buffer_pool load_at_startup: 重启MySQL 服务时,快速预热缓冲池,设置为0表示关闭,设置为1表示开启。
  • innodb_print_all_deadlocks:是否打印死锁日志,设置为0表示关闭,设置为1表示开启

SQL 及索引优化

避免全表扫描

  • 避免不写where 条件导致全面扫描以及返回结果量过大的情况
  • 对查询频次较高且数据量比较大的表,在where查询条件、order by 排序、group by分组等操作的列上建立索引。
  • 避免使用模糊匹配(全模糊和左模糊),会导致索引无法使用,引起全表扫描
  • 避免列运算(在建有索引的列上使用函数或表达式),会导致索引无法使用,引起全表扫描。
  • 尽量避免使用!=或<>运算。
  • 尽量避免在where 子句中对字段进行 null值判断,尽可能使用not null填充数据库字段,备注、描述、评论之类的可以设置为 null,其他的字段最好不要使用 null。
  • 尽量避免在 where 子句中使用or 来连接条件,如果一个字段有索引,另一个字段没有索引,则将进行全表扫描。
  • in和not in 也要慎用,否则会导致全表扫描。对于连续的数值,能用between 就不要用in。用exists 代替in是一个好的选择。
  • 使用联合索引时,必须使用该索引中的第一个字段作为条件才能保证系统使用该索引,应尽可能让字段顺序与索引顺序相一致。
  • 避免使用 select count(*),应使用 count(1)或 count(具体列名),否则会引起全表扫描

索引建立原则

  • 索引可以提高 select效率,但同时降低了insert 及 update效率,因为insert 或 update有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。
  • 对查询频次较高且数据量比较大的表,建立索引。
  • 在排序字段上,因为排序效率低,添加索引能提高查询效率。
  • 在多表连接的字段上需要建立索引,这样可以极大提高表连接的效率
  • 对可以扩展已有索引的情况,就不要新建索引
  • 需要建索引的字段长度不宜过大,越短检索性能越好。例如只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对数字型而言只需要比较一次就够了。
  • 使用前级索引,对于TEXT 和 BLOG 等关的字段,全文检索性能不高,使用前缀匹配可以大大提高检索速度。

其他方面

  • 尽量避免多表关联,不建议进行三表及以上的关联查询。
  • 尽量避免返回结果集过大。有些场景需要业务需要返回超大结果集,有些场景下则没有必要。尽量不要使用 select *,而是指定列进行查询;通过where 条件做精确限制减小返回结果集大小,从而减轻应用服务端处理大型结果集的消耗。
  • 尽量避免大事务操作,提高系统并发能力。
  • 分库分表。分库分表的核心目的是将单点资源瓶颈,尤其是磁盘IO 瓶颈,分散给多个节点来共同承担。
目录
相关文章
|
10月前
|
人工智能 搜索推荐 数据管理
探索软件测试中的自动化测试框架选择与优化策略
本文深入探讨了在现代软件开发流程中,如何根据项目特性、团队技能和长期维护需求,精准选择合适的自动化测试框架。
390 11
|
4月前
|
关系型数据库 MySQL 数据库连接
Django数据库配置避坑指南:从初始化到生产环境的实战优化
本文介绍了Django数据库配置与初始化实战,涵盖MySQL等主流数据库的配置方法及常见问题处理。内容包括数据库连接设置、驱动安装、配置检查、数据表生成、初始数据导入导出,并提供真实项目部署场景的操作步骤与示例代码,适用于开发、测试及生产环境搭建。
142 1
|
11天前
|
机器学习/深度学习 人工智能 自然语言处理
如何让AI更“聪明”?VLM模型的优化策略与测试方法全解析​
本文系统解析视觉语言模型(VLM)的核心机制、推理优化、评测方法与挑战。涵盖多模态对齐、KV Cache优化、性能测试及主流基准,助你全面掌握VLM技术前沿。建议点赞收藏,深入学习。
190 8
|
16天前
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
208 4
|
3月前
|
机器学习/深度学习 SQL 运维
数据库出问题还靠猜?教你一招用机器学习优化运维,稳得一批!
数据库出问题还靠猜?教你一招用机器学习优化运维,稳得一批!
104 4
|
6月前
|
Java 测试技术 数据库
使用benchmarksql测试数据库处理能力
传统的OLTP业务,应用系统使用 java 开发,并且不建议使用存储过程,使用 benchmarksql 压测数据库最公平,既可以测试数据库性能,也可以测试JDBC驱动
400 88
|
6月前
|
JSON 测试技术 API
优化你的 REST Assured 测试:设置默认主机与端口、GET 请求与断言
REST Assured 是一个强大的 Java 库,用于简化 RESTful API 测试。本文详解了其核心功能:设置默认主机和端口以减少代码重复、发起 GET 请求并验证响应结果,以及通过断言确保接口行为符合预期。同时推荐 Apipost 工具,助力开发者提升 API 测试效率,实现更高效的接口管理与团队协作。掌握这些技巧,可显著优化测试流程与代码质量。
|
7月前
|
缓存 JavaScript 中间件
如何测试中间件优化后的 Pinia 状态管理?
如何测试中间件优化后的 Pinia 状态管理?
192 64
|
10月前
|
定位技术 开发者
游戏开发者如何使用独享静态代理IP进行测试与优化
随着互联网技术的发展,使用代理IP的人数逐渐增加,特别是在业务需求中需要使用静态代理IP的情况越来越多。本文探讨了独享静态代理IP是否适用于游戏行业,分析了其优势如稳定性、不共享同一IP地址及地理位置选择等,同时也指出了需要注意的问题,包括可能的延迟、游戏兼容性和网络速度等。总体而言,选择合适的代理服务并正确配置,可以有效提升游戏体验。
178 2