# DML 事务 隔离级别 存储引擎对比

##DML    

insert into


  第一种:

    insert into tb_name [(col1,col2,....)]{values|value}(val1,val2,...)[,(val21,val22,....),....]

  第二种:

    insert into tb_name set col_name=val1,col2=val2,....

  第三种(将一个表中的数据插入到另外一张表中)

    insert into tb_name select clause          

  

       <!--replace的工作机制: Insert相同,除了在新插入的数据与表中的主键或唯一索引定义的数据相同会替换老的行;-->



update 更新数据

    

    UPDATE [LOW_PRIORITY] [IGNORE] table_reference

    SET col_name1=val1 [, col_name2={val2] ...

    [WHERE where_condition]

    [ORDER BY ...]

    [LIMIT row_count]

   

      update通常情况下,必须要使用where字句,或者使用limit限制要修改的行数

    

    --safe-updates:启动时应该带选项  


delete:删除数据

   

    DELETE [LOW_PRIORITY] [QUICK] [IGNORE] FROM tbl_name

    [WHERE where_condition]

    [ORDER BY ...]

    [LIMIT row_count]

    

     truncate tb_name 重置表的内容 

 

 

##MYSQL基本架构


wKioL1cbO7Ci15eaAADx00KLbkA807.jpg

连接池 与用户请求建立连接

   

    连接连接池用到的协议:文本或者二进制

    二进制的协议高效一些


核心功能层 查询解析,分析,优化,内置函数 

跨存储引擎的功能

   

     query cache 缓存,只保存select查询


存储引擎层 数据的存入和提取  


**explain:分析语句,索引的使用**



##MySQL


执行操作时施加的锁的模式 

  

  1.读锁:用户在读的时候施加的锁,为防止别人修改,但是用户可以读,还被称为共享锁

 

  2.写锁:独占锁,排它锁。其他用户不能读,不能写


锁粒度: (数据量)


   

  表锁:table lock

      锁定了整张表

行锁:row lock

      锁定了需要的行

     

     粒度越小,开销越大,但并发性越好:

     粒度越大,开销越小,但并非性越差;


锁的实现位置:

      

       MySQL锁:可以手动使用,可以使用显示锁

       存储引擎锁:自动进行的(隐式锁)

       

       显示锁:

          lock tables:施加锁

          LOCK TABLES

          tbl_name lock_type

          [, tbl_name lock_type] ...

          

          锁的类型 lock_type

          (READ | WRITE)

          

          unlock tables:解锁

InnoDB存储引擎也支持另外一种显示锁(锁定挑选出的部分行,行级锁)

         select .... lock in share mode

         select .... for update

 

    <!--做备份时要手动施加读锁-->


##事务:Transaction


 事务就是一组原子性的查询语句,也即将多个查询当作一个独立的工作单元


 ACID测试:能够满足ACID测试就表示其支持事务,或兼容事务

    

    AAtomicity,原子性,都执行或者都不执行

    CConsistency,一致性,从一个一致性状态转到另外一个一致性状态

    IIsolaction,隔离性。一个事务的所有修改操作在提交前对其他事务时不可见的

    D: Durability, 持久性,一旦事务得到提交,其所做的修改会永久有效


安全性越高,并发性越低


隔离级别:

   

  READ UNCOMMITTEND(读未提交),脏读,不可重复读,幻读

  READ COMMITTEND(读提交)  不可重读

  REPEATABLE READ (可重读)   

  SERIALIZABLE(可串行化)强制事务的串行执行避免了幻读;性能极低


启动事务

      

       start transaction

事务提交

     

          commit

事务回顾

   

          rollback


savepoint 控制回滚的位置


  SAVEPOINT identifier

  ROLLBACK [WORK] TO [SAVEPOINT] identifier

   


**如何没有显式启动事务,每个语句都会当作一个默认的事务,其执行完成会被自动提交

  1.select @@global.autocommit

  set global autocommit = 0

  2.cimmication:注意 关闭自动提交,请记得手动启动事务,应记得手动提交**


查看mysql的事务隔离级别

  

  show global  variables like 'tx_isolation'

  select @@global.tx_isolation  

   

设置mysql的事务隔离级别


    set global tx_isolation= 级别  READ UNCOMMITTEND| READ COMMITTEND| REPEATABLE READ | SERIALIZABLE


**建议:对事物要求不特别严格的场景下,可以使用读提交**


MVCC:多版本并发控制


    每个事务启动时,InnoDB会为每个启动的事务提供一个当下时刻的快照

      为实现此功能,InnoDB会为每个表提供两隐藏的字段,一个用于保存行的创建时间,一个用于保存行的失效时间,(其实里面存储的是系统版本号 system version number

       旨在两个隔离级别下有效:read committedrepeatable read



##MySQL 的存储引擎

 定义:存储引擎也通常被称作表类型

 

 查看存储引擎

 

  mysql> show engines;

  mysql> show table status  [{FROM | IN} db_name] [LIKE 'pattern' | WHERE expr]

    

      比如 :   mysql> show table status in hellodb;

      mysql> show table status in hellodb where Name='class'\G

***************************************

    Name 表名

    Engine 存储引擎

    Version:版本

    Row_format:行格式

      {DEFAULT|DYNAMIC|FIXED|COMMPRESSED|REDUNDANT|COMPACT}

    Rows:表中的行数

    Avg_row_length:平均每行包含的字节数

    Data_length:表中数据总体大小,单位为字节

    Max_data_length:表能够占用的最大空间,单位为字节,0表示么有上限

    Index_length:索引的大小,单位为字节

    Data_free:对于MyISAM表,表示已经分配但尚未使用的空间,其中包含此前删除行之后腾出来的空间

    Auto_increment:下一个AUTO_INCREMENT的值

    Create_time:表的创建时间

    Update_time: 表数据的最后一次修改时间

    Check_time: 使用CHECK TABLEmyisamchk最近一次检查表的时间

    Collation:排序规则

    Checksum:如果启动,则为表的checksum

    Create_options:创建表时指定使用的其他选项

    Comment:表的注释信息



MySQL数据文件

  

  InnoDB

  

          1.innodb_file_per_table=OFF,即是用共享表空间

             每个表一个独有的格式定义文件:tb_name.frm

             还有一个默认位于数据目录下的共享的表空间文件:ibdata#

          2.innodb_file_per_table=ON,即是用独立表空间

            每个表在数据库目录下存储两个文件

              tb_name.frm

              tb_name.ibd

              

        <!--表空间: table space ,由InnoDB管理的特有格式数据文件,内部可同时存储数据和索引-->

  

  MyISAM

  

       每个表都在数据库目录下存储三个文件

           tb_name.frm

           tb_name.MYD

           tb_name.MYI

       

**修改默认存储引擎:通过default_storage_engine服务变量实现**


##各存储引擎的特性

InnoDB

      

      支持事务,有事务日志

      ib_logfile0

      ib_logfile1

      支持外键约束

      支持MVCC(多版本并发控制)

  支持聚簇索引

           聚簇索引之外的其他索引,通常称之为辅助索引

       行级锁:间隙锁

       支持使用辅助索引

       支持自使用hash索引

       支持热备份 


MyISAM:

   

  全文索引

      支持表压缩存放:做数据仓库,能节约存储空间并提升性能

      支持空间索引

      表级锁

      延迟更新索引


         不支持事务、外键和行级锁

         崩溃后无法安全恢复数据


      使用场景:只读数据,表较小,能够忍受崩溃后的修复操作和数据丢失


ARCHIVE

    

        仅支持INSERTSELECT,支持很好压缩功能

        应用于存储日志信息,或其他按照时间序列实现的数据采集类的应用 


CSV

      

        将数据存储为CSV格式,不支持索引,仅使用与数据交换场景 

 

BLACKHOLE

 

        没有存储机制,任何发往次引擎的数据都会丢弃,其会记录二进制日志,因此,常用于多级复制架构中作中转服务器

 

 MEMORY

  

        保存数据在内存中,内存表;常用于保存中间数据,如周期性的聚合数据等,也用于实现临时表

        支持hash索引,使用表级锁,不支持BLOBTEXT数据类型

 

 MRG_MYISAM:

 

       MYISAM的一个变种,能够将多个MyISAM表合并成一个虚表

 

 NDB 

 

       MySQL CLUSTER中专用的存储引擎、          

    

 

 第三方的存储引擎


  XtraDB:增强的InnoDB,有Percona提供

      

      编译安装时,下载XtraDB的源码替代MySQL存储引擎中的InnoDB的源码

     

  PBXTMariaDB自带此存储引擎

       

        支持引擎级别的复制、外键约束,对SSD磁盘提供适当支持

       支持事务、MVCC

 

 TokuDB

       

       使用 Fractal Trees索引,适用存储大数据,拥有很好的压缩比,已经被引入MariaDB  


##列式数据存储引擎:

     Infobright:目前较有名的列式引擎,适用于海量数据存储场景,如PB级别,专为数据分析和数据仓库设计

     InfiniDB

     MonetDB

     LucidDB   

##开源社区存储引擎:

     Aria:前身为Maria,是增强版的MyISAM(支持崩溃后安全恢复,支持数据缓存)

     Groona:全文索引引擎

     Mroonga:是基于Groona的二次开发版

     OQGraph:由open query研发,支持图(网状 )结构的存储引擎

     SphinxSE:为Sphinx全文搜索服务器提供了SQL接口

     Spider:能将数据切分成不同的分片,比较高效透明的实现了分片(shared),并支持在分片上支持并行查询   

       

  ***如何选择存储引擎

      是否需要事务

      备份的类型的支持

      崩溃后的恢复

      特有的特性***

                 

##索引类型:

   

   

  聚簇索引 

  辅助索引

  B树索引

  R树索引

  hash索引

  全文索引