zoukankan      html  css  js  c++  java
  • MySQL存储引擎

    MySQL常用的存储引擎

    事务:MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你既需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务! Innodb 数据库引擎的数据库或表才支持事务。事务用来管理 insert,update,delete 语句。

    MyISAM存储引擎
    由于该存储引擎不支持事务、也不支持外键,所以访问速度较快。因此当对事务完整性没有要求并以访问为主的应用适合使用该存储引擎。

    InnoDB存储引擎(MySQL默认存储引擎)
    由于该存储引擎在事务上具有优势,即支持具有提交、回滚及崩溃恢复能力等事务特性,所以比MyISAM存储引擎占用更多的磁盘空间。
    因此当需要频繁的更新、删除操作,同时还对事务的完整性要求较高,需要实现并发控制,建议选择。

    一般来说,事务是必须满足4个条件(ACID):原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。

    原子性:一个事务(transaction)是一个整体,它里面的所有的操作要么都做,要么都不做,是不可再分割的。

    一致性:  事务开始前和结束后,数据库的完整性约束是一致的。在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。(比如A向B转账,不可能A扣了钱,B却没有收到)

    隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致;同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰;

    持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

    MySQL数据库为我们提供的四种隔离级别(查自https://blog.csdn.net/m0_37962600/article/details/81005191):

    a、Serializable(串行化):可避免脏读、不可重复读、幻读的发生;

    b、Repeatable read(可重复读):可避免脏读、不可重复读的发生;

    c、Read committed(读已提交):可避免脏读的发生;

    d、Read uncommitted(读未提交):最低级别,任何情况都无法保证;

    从a----d隔离级别由高到低,级别越高,执行效率越低

    InnoDB支持行级锁。行级锁可以最大程度的支持并发,行级锁是由存储引擎层实现的。

    锁:锁的主要作用是管理共享资源的并发访问,用于实现事务的隔离性

            类型:共享锁(读锁)、独占锁(写锁)         

            MySQL锁的力度:表级锁(开销小、并发性低),通常在服务器层实现

                                        行级锁(开销大、并发性高),只会在存储引擎层面进行实现

    InnoDB是为处理巨大数据量的最大性能设计。它的CPU效率可能是任何基于磁盘的关系型数据库引擎所不能匹敌的

    InnoDB存储引擎完全与MySQL服务器整合,InnoDB存储引擎为在主内存中缓存数据和索引而维持它自己的缓冲池。InnoDB将它的表和索引在一个逻辑表空间中,表空间可以包含数个文件(或原始磁盘文件);

    InnoDB支持外键完整性约束,存储表中的数据时,每张表的存储都按照主键顺序存放,如果没有显示在表定义时指定主键。InnoDB会为每一行生成一个6字节的ROWID,并以此作为主键

    InnoDB被用在众多需要高性能的大型数据库站点上

    InnoDB中不保存表的行数(eg:select count(*)from table时,InnoDB需要扫描一遍整个表来计算有多少行);清空整个表时,InnoDB是一行一行的删除,效率非常慢;

    InnoDB不创建目录,使用InnoDB时,MySQL将在MySQL数据目录下创建一个名为ibdata1的10MB大小的自动扩展数据文件,以及两个名为ib_logfile0和ib_logfile1的5MB大小的日志文件

    事务的回滚(rollback

    在终端环境,

    MariaDB [data]> insert into test values(3,30000);
    Query OK, 1 row affected (0.00 sec)
    
    MariaDB [data]> insert into test values(4,40000);
    Query OK, 1 row affected (0.00 sec)
    
    MariaDB [data]> select * from test;
    +------+----------+
    | id   | money    |
    +------+----------+
    |    1 |  1234.56 |
    |    2 | 23456.88 |
    |    3 | 30000.00 |
    |    4 | 40000.00 |
    +------+----------+
    4 rows in set (0.00 sec)
    
    MariaDB [data]> select * from test;
    +------+----------+
    | id   | money    |
    +------+----------+
    |    1 |  1234.56 |
    |    2 | 23456.88 |
    |    3 | 30000.00 |
    |    4 | 40000.00 |
    +------+----------+
    4 rows in set (0.00 sec)
    
    MariaDB [data]> rollback;
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [data]> select * from test;
    +------+----------+
    | id   | money    |
    +------+----------+
    |    1 |  1234.56 |
    |    2 | 23456.88 |
    +------+----------+
    2 rows in set (0.00 sec)
    
    MariaDB [data]> 

    事务的提交(commit

    MariaDB [data]> set autocommit=0;   #关闭自动提交,默认是开启的
    Query OK, 0 rows affected (0.00 sec)
    
    MariaDB [data]> insert into haha values(4,40000);  #写入数据
    Query OK, 1 row affected (0.00 sec)
    
    MariaDB [data]> select * from haha;   #在终端查看是已经有新数据了,但需要提交才可以同步
    +------+----------+
    | id   | money    |
    +------+----------+
    |    1 |  1234.56 |
    |    2 | 23456.88 |
    |    3 | 30000.00 |
    |    4 | 40000.00 |
    +------+----------+
    4 rows in set (0.00 sec)
    
    #打开新的终端查看表,看到的是原始数据,
    MariaDB [data]> select * from haha; 
    +------+----------+
    | id   | money    |
    +------+----------+
    |    1 |  1234.56 |
    |    2 | 23456.88 |
    |    3 | 30000.00 |
    +------+----------+
    3 rows in set (0.00 sec)
    
    #在之前的终端输入commit提交,
    MariaDB [data]> commit;
    Query OK, 0 rows affected (0.00 sec)
    
    #再次到新的终端查看,新插入的数据就会显示,表示写入成功
    MariaDB [data]> select * from haha; 
    +------+----------+
    | id   | money    |
    +------+----------+
    |    1 |  1234.56 |
    |    2 | 23456.88 |
    |    3 | 30000.00 |
    |    4 | 40000.00 |
    +------+----------+
    4 rows in set (0.00 sec)

    MEMORY
    MEMORY存储引擎存储数据的位置是内存,因此访问速度最快,但是安全上没有保障。适合于需要快速的访问或临时表。

    BLACKHOLE
    黑洞存储引擎,可以应用于主备复制中的分发主库。

     

  • 相关阅读:
    .NetTiers不支持UDT的解决方式
    CreateRemoteThread的问题
    使用.NetTiers的事务
    how do i using c# to obtain call stack on crash?
    使用C#为进程创建DUMP文件
    GTD软件
    c#调用c++的dll
    使用PowerDesigner生成数据库
    笨鸟学iOS开发(2)ApplicationSettings
    让IIS支持中文名
  • 原文地址:https://www.cnblogs.com/5444de/p/12750069.html
Copyright © 2011-2022 走看看