由图,可以看出MySQL最上层是连接组件。下面服务器是由连接池、管理工具和服务、SQL接口、解析器、优化器、缓存、存储引擎、文件系统组成。
—> 连接池:由于每次建立建立需要消耗很多时间,连接池的作用就是将这些连接缓存下来,下次可以直接用已经建立好的连接,提升服务器性能。
—>SQL接口:接受用户的SQL命令,并且返回用户需要查询的结果。比如select * from就是调用SQL Interface
—>解析器: SQL命令传递到解析器的时候会被解析器验证和解析。解析器是由Lex和YACC实现的,是一个很长的脚本。其功能是:
a.将SQL语句分解成数据结构,并将这个结构传递到后续步骤,以后SQL语句的传递和处理就是基于这个结构的。
b.如果在分解构成中遇到错误,那么就说明这个sql语句是不合理的。
—>优化器:查询优化器,SQL语句在查询之前会使用查询优化器对查询进行优化。他使用的是“选取-投影-联接”策略进行查询。举一个例子:
select * from users where uname='admin';
1.这个select查询先根据where语句进行选取,而不是先将表全部查询出来以后再进行uname过滤。(选取)
2.这个select查询先根据*进行属性投影,而不是将属性全部取出以后再进行过滤。(投影)
3.将这两个查询条件联接起来生成最终查询结果。(联接)
—>缓存器: 查询缓存,如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。通过LRU算法将数据的冷端溢出,未来得及时刷新到磁盘的数据页,叫脏页。这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等
简而言之, 服务层执行过程:sql语句通过sql接口,服务器如果缓存cache有命中查询结果,直接读取数据。如果没有命中查询结果,由解析器进行sql语句的解析,预处理,经过优化器进行优化后提交给引擎层。通俗地说—>服务层告诉引擎层要做什么。
创建新表时如果不指定存储引擎,那么系统就会使用默认存储引擎,MySQL5.5 之前的 默认存储引擎是 MyISAM,5.5 之后改为了 InnoDB。 MySQL 中同一个数据库,不同的表格可以选择不同的存储引擎。
全局内存:缓冲池里面有数据缓存、索引缓存、锁信息、插入缓存等等。此外还有重做日志缓存、额外的内存池。线程内存:Master Thread、IO Thread、Purage Thread、Page Cleaner Thread。
CheckPoint技术:缓冲池的设计目的为了协调CPU速度与磁盘速度的鸿沟。因此跟新或者删除的时候直接操作的是内存的数据,先写入重做日志,然后再修改内存池里面的数据,最后定时刷新到磁盘上。
表空间可以在逻辑上管理多个数据文件,而这些数据文件又可以分布在不同磁盘中这就使得一个表的数据、索引等信息可以被记录在多个磁盘中。
(1)共享表空间:共享表空间文件以.ibdata*来命名; 共享表空间下,innodb所有数据保存在一个单独的表空间里面,而这个表空间可以由很多个文件组成,一个表可以跨多个文件存在,所以其大小限制不再是文件大小的限制,而是其自身的限制。从Innodb的官方文档中可以看到,其表空间的最大限制为64TB,也就是说,Innodb的单表限制基本上也在64TB左右了,当然这个大小是包括这个表的所有索引等其他相关数据。共享表空间主要存放double write、undo log(undo log没有独立的表空间,需要存放在共享表空间)
(2)独立表空间:每个表拥有自己独立的表空间用来存储数据和索引。
(3)查看数据库是否启用独立表空间:show variables like ‘innodb_file_per_table’;查看,innodb_file_per_table=ON,表示启用了独立表空间;
(4)使用独立表空间的优点:a.如果使用软链接将大表分配到不同的分区上,易于管理数据文件b.易于监控解决IO资源使用的问题;c.易于修复和恢复损坏的数据;d.相互独立的,不会影响其他innodb表;e.导出导入只针对单个表,而不是整个共享表空间;f.解决单个文件大小的限制;g.对于大量的delete操作,更易于回收磁盘空间;h.碎片较少,易于整理optimize table;i.易于安全审计;j.易于备份如果在innodb表已创建后设置innodb_file_per_table,那么数据将不会迁移到单独的表空间上,而是续集使用之前的共享表空间。只有新创建的表才会分离到自己的表空间文件。
(5)共享表空间的数据文件配置:innodb_data_file_path参数:设置innoDB共享表空间数据文件的名字和大小,例如innodb_data_file_path=ibdata1:12M:autoextend(初始大小12M,不足自增)innodb_data_home_dir参数:innodb引擎的共享表空间数据文件的存放目录目前主要是使用独立表空间,但是共享表空间也是需要的,共享表空间主要存放double write、undo log等。
表空间∶表空间可看做是InnoDB存储引擎逻辑结构的最高层。
段 :表空间由各个段组成,常见的段有数据段、索引段、回滚段等。
区 :由64个连续的页组成,每个页大小为16kb,即每个区大小为1MB。页:每页16kb,且不能更改。常见的页类型有∶数据页、Undo页、系统页、事务数据页、插入缓冲位图页、插入缓冲空闲列表页、未压缩的二进制大对象页、压缩的二进制大对象页。
行 :InnoDB存储引擎是面向行的(row-oriented),每页最多允许存放7992行数据。
a.每页=16Kb(页类型:数据页、undo页、系统页、事务数据页、插入缓冲位图页、插入缓冲空闲列表页、未压缩的二进制大对象页、压缩的二进制大对象页)
b.区=64个连续的页=64*16Kb=1MB
作者:#YF#
来源:http://22j.co/cPZR