Mysql基本原理

MYSQL基本逻辑架构

Mysql Server逻辑架构图

都是英文
解释一下
1.Native C API .Net PHP Pecl Python 等 为服务端脚本语言
2.connection Pool 链接池
 1.authentication 认证
 2.thread reuse 线程重用
 3.nnection limits 链接限制
 4.check Memory 检查存储器
 5.caches 速缓存
3.nagement services & utillties管理服务与利用
4.sql interface SQL接口
 1.DML DDL 读写请求
 2.stored procedures 存储过程
 3.Views 意见
 4.triggers 触发器
 5.etc 等mysql

5.Parser 语法分析器
 Query translation 查询翻译
 Object Privilege 对象特权
6.Optimizer 优化器
 Access Paths 访问路径
 Statistics 统计
7.Caches & Buffers 缓存与缓冲区
 Global and Engine 全局引擎
 Specific Caches 特定缓存
 buffers 缓冲器
8.MYISAM INNODB Memory 等属于各类表引擎
 Pluggable Storage Engines 可插拔存储引擎
 Memory 记忆 Index 索引 Storage Management 存储管理
9.File system Files & Logs
 file system 文件系统 files & log 文件及日志
Redo 重作日志
  1.INE Redo log 在线重作日志(online redo log )主要用于:Oracle数据库所在服务器忽然掉电、忽然重启或者执行shutdown abort等命令使得在服务器从新启动以后,Oracle数据库没有办法正常的启动实例。此时,在线重作日志就派上了用场,Oracle会使用在线重作日志,把数据库恢复到服务器掉电前的那一个时刻,从而使得数据库能正常的启动起来 。
  在Oracle数据库中,默认状况下,至少会有两个重作日志组,并且每一个组里面至少包含了一个重作日志文件。日志组不会自动增长,在一个写满以后,会自动去写下一个。在下一个被写满以后会又从第一个开始写起。
   2.Archive redo log 归档日志(archive log)主要用于硬件级别的错误:磁盘的坏道致使没法读写、写入的失败、磁盘受损致使数据库数据丢失。这就要使用归档日志文件,经过归档日志文件,把数据库恢复到归档日志所在的时间点上而后再经过在线重作日志文件把数据库恢复到当前的时间点上。
  对于归档日志文件,能够理解为在线重作日志文件的备份。即当一个重作日志文件被填满了以后,归档日志文件就会把其备份保留一份。(由于上面说了,在线重作日志文件会自动的覆盖)因此,归档日志文件就是旧的在线日志文件的备份。算法

Undo 回滚数据
 撤销(Undo)数据是反转DML语句结果所需的信息。撤销数据一般被称为“回滚数据”,在过去的Oracle版本中,“回滚数据”和“撤销数据”能够交替使用,但从 9i版本开始,这两个术语有所不一样:功能相同,但管理方式不一样。只要某个事务修改了数据,那么更新前的原有数据就会被写入一个回滚段或撤销段。回滚段在 11g版本中依然存在,但从9i版本开始,Oracle数据库引入了可供选择的撤销段。Oracle强烈建议全部数据库都应当使用撤销段,回滚段只被保留用于向后兼容 。
 管理Undo编辑
  1.与Undo相关的错误条件
  管理撤销的原则十分简单:首先,应当始终存在容许全部事务继续进行的足够撤销空间;其次,应当始终存在保证查询成功的足够撤销数据。若是某个事务耗尽了撤销空间,那么这个事务就会因为Oracle错误“ORA-30036 unable to extend segment in undo tablespace(没法扩展撤销表空间内的撤销段)”而失败。
  2.用于Undo管理与Undo保留保证的参数
  下面3个初始化参数能够控制撤销:
  UNDO_MANAGEMENT:默认为manual,就是不会使用撤销段。默认设置是为了实现向后兼容性,最后不要使用默认。建议设置为 AUTO,启用使用撤销段的自动撤销管理。参数是静态的。
  UNDO_TABLESPACE:若是使用了“UNDO_MANAGEMENT=AUTO”,就必定要指定该参数。该参数指定了一个做为有效撤销表空间的表空间,而且该表空间必须已被建立为一个撤销表空间,同时其内部的全部撤销段都会被自动联机。
  UNDO_RETENTION:可选,以秒为单位进行设置的参数。指定了保留过时撤销数据的目标位置。若是配置了保证撤销保留,那么该参数就不是可选的。针对撤销的默认模式是:对于事务与查询来讲,Oracle更倾向于维护事务。10G版本中存在保证撤销保留的选项,意味着通过 UNDO_RETENTION参数所指定的时间以前,撤销数据决不会被重写。
  3.调整与监视Undo表空间
  撤销表空间应当足够大,算法的话,首先计算在最高工做负荷时生成撤销的速度,而后再乘以耗时最长的查询的时间长度。
  4.删除与缩小Undo表空间
  建立一个撤销表空间时,Oracle会在这个表空间内建立一个撤销段池。
Data 数据
Index 索引
Binary 二进制
Error 错误
Query and Slow 慢查询sql


1.最上层是一些客户端和链接服务,包含本地sock通讯和大多数基于客户端/服务端工具实现的相似于tcp/ip的通讯。主要完成一些相似于链接处理、受权认证、及相关的安全方案。在该层上引入了线程池的概念,为经过认证安全接入的客户端提供线程。一样在该层上能够实现基于SSL的安全连接。服务器也会为安全接入的每一个客户端验证它所具备的操做权限。数据库

2.第二层架构主要完成大多少的核心服务功能,如SQL接口,并完成缓存的查询,SQL的分析和优化及部份内置函数的执行。全部跨存储引擎的功能也在这一层实现,如过程、函数等。在该层,服务器会解析查询并建立相应的内部解析树,并对其完成相应的优化如肯定查询表的顺序,是否利用索引等,最后生成相应的执行操做。若是是select语句,服务器还会查询内部的缓存。若是缓存空间足够大,这样在解决大量读操做的环境中可以很好的提高系统的性能。缓存

3.存储引擎层,存储引擎真正的负责了MySQL中数据的存储和提取,服务器经过API与存储引擎进行通讯。不一样的存储引擎具备的功能不一样,这样咱们能够根据本身的实际须要进行选取。安全

4.数据存储层,主要是将数据存储在运行于裸设备的文件系统之上,并完成与存储引擎的交互。服务器

3.并发控制和锁的概念
 当数据库中有多个操做须要修改同一数据时,不可避免的会产生数据的脏读。这时就须要数据库具备良好的并发控制能力,这一切在MySQL中都是由服务器和存储引擎来实现的。
 解决并发问题最有效的方案是引入了锁的机制,锁在功能上分为共享锁(shared lock)和排它锁(exclusive lock)即一般说的读锁和写锁。当一个select语句在执行时能够施加读锁,这样就能够容许其它的select操做进行,由于在这个过程当中数据信息是不会被改变的这样就可以提升数据库的运行效率。当须要对数据更新时,就须要施加写锁了,不在容许其它的操做进行,以避免产生数据的脏读和幻读。锁一样有粒度大小,有表级锁(table lock)和行级锁(row lock),分别在数据操做的过程当中完成行的锁定和表的锁定。这些根据不一样的存储引擎所具备的特性也是不同的。
 MySQL大多数事务型的存储引擎都不是简单的行级锁,基于性能的考虑,他们通常都同时实现了多版本并发控制(MVCC)。这一方案也被Oracle等主流的关系数据库采用。它是经过保存数据中某个时间点的快照来实现的,这样就保证了每一个事务看到的数据都是一致的。详细的实现原理能够参考《高性能MySQL》第三版。架构

相关内容

4.事务
 1.简单的说事务就是一组原子性的SQL语句。能够将这组语句理解成一个工做单元,要么所有执行要么都不执行。
 2.事务具备ACID的特性:
  原子性(atomicity):事务中的全部操做要么所有提交成功,要么所有失败回滚。
  一致性(consistency):数据库老是从一个一致性状态转换到另外一个一致性状态。
  隔离性(isolation):一个事务所作的修改在提交以前对其它事务是不可见的。
  持久性(durability):一旦事务提交,其所作的修改便会永久保存在数据库中。
 3.事务的隔离级别:在SQL标准中定义了四种隔离级别:   READ UNCOMMITTED(读未提交):事务中的修改即便未提交也是对其它事务可见
  READ COMMITTED(读提交):事务提交后所作的修改才会被另外一个事务看见,可能产生一个事务中两次查询的结果不一样。
  REPEATABLE READ(可重读):只有当前事务提交才能看见另外一个事务的修改结果。解决了一个事务中两次查询的结果不一样的问题。
  SERIALIZABLE(串行化):只有一个事务提交以后才会执行另外一个事务。
show variables like 'tx_isolation'; 查看事务级别
set tx_isolation = ‘READ-COMMITTED' 设置事务级别
 4.死锁:两个或多个事务在同一资源上相互占用并请求锁定对方占用的资源,从而致使恶性循环的现象。MySQL的部分存储引擎可以检测到死锁的循环依赖并产生相应的错误。InnoDB引擎解决死锁的方案是将持有最少排它锁的事务进行回滚。并发


Mysql 储存引擎及应用方案
 mysql采用插件式的存储引擎架构,能够根据不一样的需求为不一样的表设置不一样的存储引擎。
show table status like demo\G 查看表引擎
 Name:显示的是表名
 Engine:显示存储引擎,该表存储引擎为MyISAM
 Row_format:显示行格式,对于MyISAM有Dynamic、Fixed和Compressed三种。非别表示表中有可变的数据类型,表中数据类型为固定的,以及表是压缩表的环境。
 Rows:显示表中行数
 Avg_row_length:平均行长度(字节)
 Data_length:数据长度(字节)
 Max_data_length:最大存储数据长度(字节)
 Data_free:已分配但未使用的空间,包括删除数据空余出来的空间
 Auto_increment:下一个插入行自动增加字段的值
 Create_time:表的建立时间
 Update_time:表数据的最后修改时间
 Collation:表的默认字符集及排序规则
 Checksum:若是启用,表示整个表的实时校验和
 Create_options:建立表示的一些其它选项
 Comment:额外的一些注释信息,根据存储引擎的不一样表示的内容也不胫相同。tcp

Mysql 各类表引擎
INNODB 引擎
 1.将数据存储在表空间中,表空间由一系列的数据文件组成,由InnoDB管理;
 2.支持每一个表的数据和索引存放在单独文件中(innodb_file_per_table);
 3.支持事务,采用MVCC来控制并发,并实现标准的4个事务隔离级别,支持外键;
 4.索引基于聚簇索引创建,对于主键查询有较高性能;
 5.数据文件的平台无关性,支持数据在不一样的架构平台移植;
 6.可以经过一些工具支持真正的热备。如XtraBackup等;
 7.内部进行自身优化如采起可预测性预读,可以自动在内存中建立hash索引等

MyISAM 引擎
 1.MySQL5.1中默认,不支持事务和行级锁;
 2.提供大量特性如全文索引、空间函数、压缩、延迟更新等;
 3.数据库故障后,安全恢复性差;
 4.对于只读数据能够忍受故障恢复,MyISAM依然很是适用;
 5.日志服务器的场景也比较适用,只需插入和数据读取操做;
 6.不支持单表一个文件,会将全部的数据和索引内容分别存在两个文件中;
 7.MyISAM对整张表加锁而不是对行,因此不适用写操做比较多的场景;
 8.支持索引缓存不支持数据缓存。

Archive引擎
 1.只支持insert和select操做;
 2.缓存全部的写数据并进行压缩存储,支持行级锁但不支持事务;
 3.适合高速插入和数据压缩,减小IO操做,适用于日志记录和归档服务器。

Blackhole引擎  1.没有实现任何存储机制,会将插入的数据进行丢弃,但会存储二进制日志;
 2.会在一些特殊须要的复制架构的环境中使用。

CSV 引擎  1.能够打开CSV文件存储的数据,能够将存储的数据导出,并利用excel打开;
 2.能够做为一种数据交换的机制,一样常用。

Memory 引擎
 1.将数据在内存中缓存,不消耗IO;
 2.存储数据速度较快但不会被保留,通常做为临时表的存储被使用。

Federated引擎
 可以访问远程服务器上的数据的存储引擎。可以创建一个链接连到远程服务器。

Mrg_MyISAM引擎
 将多个MYISAM表合并为一个。自己并不存储数据,数据存在MyISAM表中间。

NDB集群引擎
 MySQL Cluster专用。


5.存储引擎选取参考因素
 1.是否须要事务支持 INNODB
 2.是否有备份操做需求 热备份 INNODB
 3.故障恢复需求 在对恢复要求比较好的场景中推荐使用InnoDB,由于MyISAM数据损坏几率比较大并且恢复速度比较慢。
 4.性能上的需求 有些业务需求只有某些特定的存储引擎才可以知足,如地理空间索引也只有MyISAM引擎支持。因此在应用架构需求环境中也须要管理员折衷考虑,固然从各方面比较而言,InnoDB引擎仍是默认应该被推荐使用的。

6.表引擎修改方法
 alter table demo engine = InnoDB

7.Mysql 导入导出  mysqldump

相关文章
相关标签/搜索