作者介绍
刘书浩,“移动云”DBA,负责“移动云”业务系统的数据库运维、标准化等工作;擅长MySQL技术领域,熟悉MySQL复制结构、Cluster架构及运维优化;具有自动化运维经验,负责“移动云”数据库管理平台的搭建 。
前言
随着移动云平台系统业务不断增长,必然需要对各系统进行更新或者发布新版本,以满足用户的需求 。但是在系统更新或者发布新版本时,往往会引起各种的性能隐患,使得系统的稳定性大大降低,这些性能隐患的根本原因大部分都在于软件开发标准不规范引起 。为了加强开发标准规范,提高各系统的稳定性,本文从影响MySQL数据库性能的常见因素入手,重点论述下如何编写高效的SQL语句,并以合适的方式创建表和索引,以达到系统在不断更新和升级时仍能保持良好的稳定性 。
在这之前,首先简单了解一下MySQL的体系结构 。
MySQL的逻辑结构
文章插图
Connectors:用来与客户端应用程序建立连接的数据库接口 。
Management Services & Utilities:系统管理和服务控制相关的辅助工具 。
Connection Pool:负责处理与用户访问有关的各种用户登录、线程处理、内存和进程缓存需求 。
Sql Interface:提供从用户接受命令并把结果返回给用户的机制 。
Parser:对SQL语句进行语法分析和解析,构造一个月来执行查询的数据结构 。
Optimizer:优化查询语句,以保证数据检索动作的效率达到或者非常接近最最优 。使用一种“选取-投影-联结”策略来处理查询,即先根据有关的限制条件进行选取(Select 操作)以减少将要处理的元组个数,再进行投影以减少被选取元组力的属性字段的个数,最后根据连接条件生产最终的查询结果 。
Caches & Buffers:保证使用频率最高的数据或结构能够以最有效率的方式被访问,缓存的类型有:表缓存、记录缓存、键缓存、权限缓存、主机名缓存等 。
Query流程
文章插图
1、查询缓存
检查查询缓存是否打开,检查是否命中缓存中的数据(通过对大小写敏感的HASH查找实现的),若不命中则进行下一阶段的处理 。若命中查询缓存,检查用户权限,若权限没问题,则直接把缓存数据返回给客户端 。
2、语法解析器和预处理器
词法/语法解析器:将会进行语法规则的验证和解析查询(对语法解析),生成语法分析树 。
预处理器:根据MySQL规则进一步检查语法分析树是否合法 。例如检查表或列是否存在,解析名字和别名有没有歧义 。下一步预处理器会验证权限 。
3、查询优化器
优化器的作用就是找到最好的执行计划 。MySQL使用CBO优化器 。MySQL使用很多优化策略生成最优的执行计划,可以分为两类:静态优化(编译时优化)、动态优化(运行时优化) 。
4、查询执行引擎
MySQL只是简单的根据执行计划给出的指令逐步执行 。调用存储引擎实现的接口来完成执行计划 。优化器根据接口可以获取表的相关信息,包括表的所有列名、索引统计信息等 。将结果返回给客户端,或者返回这个查询的一些信息,如查询影响到的行数 。如果查询可以被缓存,那么MySQL会将结果存放到查询缓存中 。
影响MySQL数据库的常见因素
1、服务器硬件
CPU:一般情况下CPU资源不会是性能瓶颈的直接原因;MySQL不支持多cpu对同一SQL并发处理 。
内存:直接影响MySQL缓冲池的大小及MySQL数据库的整体运行稳定性;如内存资源不足,容易造成MySQL的会话拥堵甚至实例重启 。
存储IO:直接影响MySQL的处理性能;在大量数据变更的业务场景下,对存储的IO性能要求往往较高 。
2、数据库存储引擎
MyISAM:不支持事务型查询,在OLTP类型业务场景中不建议使用 。
InnoDB:支持事务型查询,支持行级锁,对并发业务支持较好 。
3、MySQL参数
1)连接请求的参数:max_connections
MySQL的最大连接数,增加该值增加mysqld要求的文件描述符的数量 。连接请求量大时,建议调高此值调的越高,内存开销越大 。
mysql>show variables like 'max_connections';
+-------------------------+----------+
|Variable_name|Value|
+-------------------------+----------+
|max_connections|512 |
+-------------------------+----------+
mysql>show status like 'max%connections';
推荐阅读
- 详解Mysql数据库不同字符集下迁移方法
- Mysql数据库连接查询
- mysql 数据分析如何实现日报、周报、月报和年报?
- MySQL 触发器
- ThinkPHP 5.0添加mysql存session驱动
- Mysql 为什么要选择 B+Tree
- Mysql通讯协议分析
- 分享mysql配置文件my.cnf一键生成器
- Mysql中ACID的原理?
- 从淘宝MySQL数据库经典案例来看innodb如何设计主键索引