mysql存储引擎,事务

 

插件式存储引擎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%’;     查看

相关文章
相关标签/搜索