在日常的项目开发过程中,大部分的业务都会涉及到数据的存储和读取,而 mysql 作为开发过程中常用的存储设备,了解清楚才能进行更好的开展业务。今天就从 mysql 性能优化作为切入点,了解一下 mysql 新能优化的主要关注点,在日常的工作以及面试过程中都可以展示自己扎实的基础知识。 mysql 性能优化的关注点 其实,mysql 性能优化不是简单的知道和使用 explain 和 show profile 就天下无敌了,这两个只是重要的方面,何况作为资深的 CRUD 工程师还未必经常使用,任何的知识都是 了解->熟悉->精通,当真正的了解原理或者系统的掌握才是真正的悟道。接下来开始进入正题,mysql 又能优化主要为 4 个方面:
1 硬件资源和操作系统方面的优化
2 架构设计方面的优化
3 mysql 服务配置项的优化
4 sql 执行层面的优化
硬件和操作系统方面的优化 硬件和操作系统就是指 mysql 服务所运行的服务器硬件资源情况,影响 mysql 性能的主要因素分为 cpu 、内存大小、磁盘读写速度、网络带宽,硬件是指操作系统的网络配置和系统文件句柄数设置(linux 系统中,一切皆文件,了解过 ES 搭建的同学都知道,ES 的搭建就需要修改系统最大打开的文件数) ,这部分的优化一般由运维工程师和 DBA 联合完成,在项目开发伊始,可以根据业务需要承载的数据量和 TPS 要求根据经验,考虑后续的业务扩展性,选择与业务相适配的 mysql 服务。 架构设计方面的优化 mysql 是一个磁盘 io 访问频繁的关系型数据库,在高并发和高性能的应用场景中会承受巨大的压力,可以采取以下措施来应对:
1 搭建 mysql 主从集群,单个 mysql 服务一旦宕机,将会导致依赖 mysql 服务的应用无法响应导致服务不可用,可以采用采用主从集群或者主主集群避免单点故障,保障 mysql 服务的高可用性。
2 读写分离设计,在读多写少的场景中,可以采用读写分离的方案避免读写冲突导致的性能问题。
3 采用分库分表的设计。通过分库可以降低单个 mysql 服务器的 io 压力,通过分表的机制可以降低单表数据量,提高 sql 的查询效率。
4 热点数据引入 Nosql。引入 Redis 或者 MongoDB 等非关系型数据库,可以缓解 mysql 的访问压力,提升数据的检索性能。
mysql 程序配置优化。 mysql 配置文件的优化,一般通过 mysql 配置文件 my.cnf 来设置。配置项一般包括:
mysql 的最大连接数 max_connections (注意这里说的不是项目中设置的数据库连接池的连接数)