插件式存储引擎mysql
客户端请求连接线程进行处理,先查看数据库的缓存,若缓存有直接返回,没有经过分析器,优化器 ,在存储引擎中查询数据,返回,sql
如图 c端是客户端,经过相应连接器连接数据库数据库
s端是服务器端,mysql是有单进程多线程进程管理的缓存
链接池:负责连接,认证,控制等安全
链接池下面是mysql的主体服务器
Sql interface:sql接口session
Paraser: 语法分析多线程
Optimizer:优化器来优化并发
caches: 缓存器函数
Piuggable storage engines: 插件式存储引擎,负责这么存储数据经常使用的5.0以前是myisam
5.0以后是innodb
最后将数据转存在磁盘上的文件,有日志文件(错误日志,二进制日志,慢查询日志)和数据(数据,索引)文件
插件式存储引擎:innodb是功能最完善的引擎了
>SHOW ENGINES; 查看所支持引擎
S>HOW table status where Engine=’InnoDB ’; 显示表状态信息
Innodb 的延伸版 xtradb
Myisam -------------- aria myisam多用于读多写少的场景
InnoDB:InnoBase存储引擎
数据存储于“表空间(table space)"中:
(1) 全部数据库中的全部类型为InnoDB的表的数据和索引存储于同一个表空间中;
表空间文件:datadir定义的目录中文件:ibdata1, ibdata2, ...但这种不支持InnoDB
高级功能
(2) innodb_file_per_table=ON,意味着每表使用单独的表空间文件;(支持高级功能如单表的导入导出)
每表的数据文件(数据和索引,存储于数据库目录)存储于本身专用的表空间文件中,并存储于数据库目录下: tbl_name.ibd
如我建立的是数据库mydata
在/data/mysql下自动建立mydata目录将数据存放在目录下 mydata.ibd
表结构的定义:在数据库目录,tbl_name.frm
重启:systemctl restart mysql
这样建立的表就是一个单独的表空间在对应的库中如用的mydb这个库下存放
特性:
1 是事物引擎但不能大事物,比较适用小事物
2 使用汇集索引:把索引和数据存储在一处,经过索引能直接找到数据,辅助索引指向汇集索引
3 支持自适应hash索引,用户不能建立是有mysql自动维护的
4 锁粒度:行级锁,间隙锁
innodb总结:
1数据存储:表空间;
2并发:MVCC,间隙锁,行级锁;
3索引:汇集索引、辅助索引;
4性能:预读操做、内存数据缓冲、内存索引缓存、自适应Hash索引、插入操做缓存区;
5 备份:支持热备;
MyISAM:
1支持全文索引(FULLTEXT index)但性能比较差、压缩、空间函数(GIS);
2不支持事务()
3锁粒度:表级锁
4适用场景:只读或读多写少的场景、较小的表(以保证崩溃后恢复的时间较短);
5文件:每一个表有三个文件,存储于数据库目录中
tbl_name.frm:表格式定义;
tbl_name.MYD:数据文件;
tbl_name.MYI:索引文件;
特性:
1加锁和并发:表级锁;
2修复:手动或自动修复、但可能会丢失数据;
3索引:非汇集索引;
4延迟索引更新;
5表压缩;
其它的存储引擎:
CSV:将CSV文件(以逗号分隔字段的文本文件)做为MySQL表文件;
MRG_MYISAM:将多个MyISAM表合并成的虚拟表;
BLACKHOLE:相似于/dev/null,不真正存储数据;
MEMORY:内存存储引擎,支持hash索引,表级锁,经常使用于临时表;
FEDERATED: 用于访问其它远程MySQL服务器上表的存储引擎接口;
SHOW ENGINE Innondb status 查看引擎本身的状态数据
事物:
并发控制:
锁:Lock 机制
锁类型 :
读锁:共享锁,可被多个读操做共享;
写锁:排它锁,独占锁;
锁粒度:
表锁:在表级别施加锁,并发性较低;每次读写都需锁定整张表
行锁:在行级别施加锁,并发性较高;维持锁状态的成本较大;
锁策略:在锁粒度及数据安全性之间寻求一种平衡机制;
存储引擎:级别以及什么时候施加或释放锁由存储引擎自行决定;
MySQL Server:表级别,可自行决定,也容许显式请求; 显式锁
锁类别:
显式锁:用户手动请求的锁;
隐式锁:存储引擎自行根据须要施加的锁;
显式锁的使用:能够同时锁多个
(1) LOCK TABLES
LOCK TABLES tbl_name read|write, tbl_name read|write, ...
UNLOCK TABLES 解锁
如:use mydb
LOAK TABLE tbl2 read ; 读锁是另外一个线程能够读不可写
(2) FLUSH TABLES 刷写全部表 (把表中数据都写到磁盘中去,并关闭这个表) 锁定整个库
FLUSH TABLES tbl_name,... [WITH READ LOCK];
UNLOCK TABLES; 解锁
FLUSH TABLES with read lock; 把全部表在缓存中数据都写入磁盘,并库中
事务
锁机制:
1锁类型:
读锁:共享锁哦能够被多个读操做共享
写锁:排他锁,独占锁
2锁的粒度:
表锁:在表级别施加锁,并发性较低;每次读写都需锁定整张表
行锁:在行级别施加锁,并发性较高;维持锁状态的成本较大;
3锁策略:在锁粒度及数据安全性之间寻求一种平衡机制;
存储引擎:级别以及什么时候施加或释放锁由存储引擎自行决定 自动的;
MySQL Server(数据库):表级别,可自行决定,也容许显式请求; 显式锁
4锁类别:
显式锁:用户手动请求的锁 ,mysql级别的锁都是显示锁;
隐式锁:存储引擎自行根据须要施加的锁 自动的;
显式锁的使用方法:
(1) LOCK TABLES
LOCK TABLES tbl_name read|write, tbl_name read|write, ...
UNLOCK TABLES 解锁,一下解全部表的锁
use mydb 用mydb这个库为列 >LOcK TABLE tbl2 read ; 读锁是另外一个线程能够读不可写 >lock table tabl2 write : >unlock tables: 解锁
(2) FLUSH TABLES 刷写全部表 (把表中数据都写到磁盘中去,并关闭这个表) 锁定整个库
>FLUSH TABLES tbl_name with read lock; #把全部表都刷写一次,并读锁
>UNLOCK TABLES; 解锁
这个命令通常用在备份的时候,把全部表都读锁,别人可读不可写,这种备份叫温备
别人不能读不能写叫冷备
别人既能够读也能够写叫热备
事物:一组原子性的SQL查询、或者是一个或多个SQL语句组成的独立工做单元;
如银行的一个帐户加,与减, 先后数据要一致的
看是否支持一个事物须要满住ACID测试
ACID测试:
A:AUTOMICITY,原子性;整个事务中的全部操做要么所有成功执行,要么所有失败后回滚;这都是基于事物日志进行的
C:CONSISTENCY,一致性;数据库老是应该从一个一致性状态转为另外一个一致性状态;
I:ISOLATION,隔离性;一个事务所作出的操做在提交以前,是否能为其它事务可见;出于保证并发操做之目的,隔离有多种级别; 事物之间隔离,隔离性高低取决于你的风险偏好,
D:DURABILITY,持久性;事务一旦提交,其所作出的修改会永久保存
事物日志:是磁盘上一段连续的空间
1把修改的操做先放在在日志中
2 日志上的记录会实时的同步到数据文件中
3能够利用里面的记录操做进行回滚
4为了避免让在回滚或同步时间太长,通常事务日志不要太大,不要暂存太多,
5事物日志都是按组出现的,一组至少2个当第一个写满,写第二个,第一个赶快同步到数据文件中
6 把事务日志放在有冗余的磁盘上最好,防止磁盘故障
事务有自动提交和手动提交,最好不要自动提交,容易形成单语句事
通常不建议自动提交事物
>select @@session.auto_commit # 查看自动提交功能 1 为启用
Innodb_flush_log_at_trx_commit 1 #表在事务提交后要刷写日志,因一个为自动的每一个语句都是一个事务,每一个语句结束都要刷写磁盘,这样io压力会很大
>Set @@ session.auto_commit=0 修改成手动的,之后启动事务要手动起了
手动控制事务:
>Start transactiom ; 启动一个事务
> Insert into tbl2 values (2,’jerry’);
> Update tbl2 set name = ‘Tom’ where id = 1;
>Select * from tbl2;
>Rollback; 滚回事务 每提交前回滚
> Select * from tbl2
>Savepoint first; 设定保存点,方便滚回指定点
> Rollback to first 回滚第一个保护点
>Commit; 提交
事务隔离级别:
READ-UNCOMMITTED:读未提交 --> 脏读;隔离级过低 别人没有提交的数据能够看到
READ-COMMITTED:读提交--> 不可重复读;没提交以前是不可读
REPEATABLE-READ:可重复读 --> 幻读;在对方提交以前看不到修改的数据,在对方提交以后仍是看不到,只要本身没有作什么修改,但本身执行rollback后才能看到
SERIALIZABLE:串行化;当一个没有提交或回滚以前,是操做阻塞的,只有当多方结束了,才能够操做
如SELECT @@session.tx_isolation; 查看
SET @@sessio.tx_isolation=’READ-UNCOMMITTED’ 修改级别
两个用户分别开启一个事务,用户1在修改没提交,用户2是能够看到1的修改的 用户1 Start transaction; Use mydb Insert into tbl2 values (3,’lucy’) Select * from mydb.tbl2; 用户2 >start transaction; > Select * from mydb.tbl2;
事务日志中参数:
Innodb_log_files_in_group # 一组中有几个文件
Innodb_log_group_home_dir # 事务日志放哪,通常在数据目录下 ib_logfile0,ib_logfile1
Innodb_log_file_size #日志文件多大 ,最好不要太大
Innodb_mirrires_log_groups #镜像日志组
> SHOW GLOBAL VARIABLES LIKE ‘innodb%log%’; 查看