MySQL是一个可移植的数据库,几乎能在当前所有的操作系统上运行,如Unix/Linux、Windows、Mac和Solaris。各种系统在底层实现方面各有不同,但是MySQL基本上能保证在各个平台上的物理体系结构的一致性。

MySQL由以下几部分组成:
MySQL区别于其他数据库的最重要的特点就是其插件式的存储引擎。MySQL插件式的存储引擎架构提供一系列标准的管理和服务支持。
1、 Connection:不同语言与SQL的交互

max_connections 就是整个MySQL实例的最大连接数限制
max_user_connections 是单个用户的最大连接数,这里未指明是哪个用户,是任意一个用户。
2、Management Serveices &Utilities :系统管理和控制工具
备份和恢复的安全性,复制,集群,管理,配置,迁移和元数据
3、Connection Pool:连接池
进行身份验证、线程重用,连接限制,检查内存,数据缓存;管理用户的连接,线程处理等需要缓存的需求。
4、SQL Interface:SQL接口
进行DML、DDL,存储过程、视图、触发器等操作和管理;用户通过SQL命令来查询所需结果。
5、Parser:解析器
查询翻译对象的特权;SQL命令传递到解析器的时候会被解析器验证和解析。
6、Optimize:查询优化器
访问路径的统计数据;

在MySQL优化语句过程中,可以通过设置optimize_switch控制优化行为。在生产环境上,某时间段mysql服务器压力特别大,load一度达到了100,查询发现数据 库中有大量的sql语句state 状态result sorting ,result sorting这种排序特别消耗cpu和内存资源。抽取其中的一条sql查看执行计划。
7、Cache和Buffer:查询缓存
全局和引擎特定的缓存和缓冲区;

- have_query_cache 表示是否支持query cache;
- query_cache_limit 表示query cache存放的单条query最大结果集,默认值为1M,结果集大小超过该值的query不会被cache;
- query_cache_min_res_unit 表示query cache 每个结果集存放的最小内存大小,默认4k;
- query_cache_size 表示系统中用于query cache的内存大小;
- query_cache_type 系统是否打开了query cache功能;
- query_cache_wlock_invalidate 针对myisam存储引擎,设置当有write lock在某个table上面的时候,读请求是要等待write lock释放资源之后再查询还是允许直接从query cache中读取结果,默认是OFF,可以直接从query cache中取得结果。
8、Pluggable Storage Engine:插件式存储引擎

MySQL5.6版本默认存储引擎为InnoDB,InnoDB支持事务,并且提供行级的锁定(行锁是通过索引来实现的如果没有索引,innodb还是会使用表锁)。
mysql体系结构有了大概了解,那么我们思考一下一个sql在mysql中是怎么执行的:
1.sql语句通过连接池中的连接传递至sql_interface
2、mysql查看query_cache中是否有此语句的缓存信息,如果有则直接读取缓存返回给用户,如果没有则进入解析器。
3、mysql解析器根据关键字对sql进行解析,并生成解析树,解析器将使用mysql的语法规则验证和解析查询。主要判断语法、关键字等是否正确。
4、解析树传递至预处理器,进一步检查解析树是否合法,这里会验证表、字段是否存在,还会解析名字和别名看它们是否有歧义,下一步会验证权限。
5、解析树传递给查询优化器,优化器根据解析树生成执行计划,并找出最佳的执行计划发送给engine。(mysql优化器是基于成本的)
该状态的值表示上次执行的语句需要的成本。越小越快。
6、按照执行计划调用engine的API接口获取数据。
7、将数据存储值query_cache并返回给用户。