zoukankan      html  css  js  c++  java
  • mysql数据库各存储引擎比較

    mysql数据库差别于其它数据库的最重要的一个特点是其插件式的表存储引擎,存储引擎是基于表的。而不是数据库
    InnoDB存储引擎:
           支持事务,其设计目标主要面向在线事务处理(OLTP)的应用,其特点是行锁设计、支持外键、并支持相似于oracle的非锁定读,即默认读取操作不会产生锁。其将数据放在一个逻辑的表空间中。此外。InnoDB存储引擎支持用裸设备用来建立其表空间,所谓裸设备即是是一种没有经过格式化,不被Unix通过文件系统来读取的特殊块设备文件,是不被操作系统直接管理的设备。

    这种设备少了操作系统这一层。I/O效率更高。InnoDB还提供了插入缓冲(insert buffer)、二次写(double write)、自适应哈希索引(adaptive hash index)、预读(read ahead)等高性能和高可用的功能。

       InnoDB使用多版本号并发控制来获得高并发性。而且实现了sql标准的4种隔离级别,各自是:
     
    • 未提交读(Read uncommitted):在未提交读级别,事务中的改动,即使没有提交,对其它事务也都是可见的。事务能够读取未提交的数据,这也被称为脏读(Dirty Read)。这个级别会导致非常多问题。从性能上来说,未提交读不会比其它的级别好太多,可是缺乏其它级别的非常多优点。在实际应用中一般非常少使用。
    • 提交读(Read committed):大多数数据库系统的默认隔离级别都是提交读(但Mysql不是)。

      提交读满足前面提到的隔离性的简单定义:一个事务開始时,仅仅能“看见”已经提交的事务所做的改动。

      换句话说,一个事务从開始直到提交之前。所做的不论什么改动对其它事务都是不可见的。

      这个级别有时候也叫做不可反复读(nonrepeatable read),由于两次运行相同的查询。可能会得到不一样的结果。

    • 可反复读(Repeatable read):可反复读攻克了脏读的问题。该级别保证了在同一个事务中多次读取相同记录的结果是一致的。

      可是理论上。可反复读隔离级别还是无法解决另外一个幻读(Phantom read)问题。所谓幻读。指的是当某个事务在读取某个范围内的记录时,另外一个事务中又在该范围插入了新的记录,当之前的事务再次读取该范围的记录时。会产生幻行(Phantom row)可反复读是MySQL的默认事务隔离级别

    • 可串行化(Serializable):可串行化是最高的隔离级别。

      它通过强制事务串行运行,避免了前面所说的幻读问题。简单来说,可串行化会在读取的每一行数据上都加上锁,所以可能导致大量的超时和锁争用问题。实际应用中也非常少用到这个隔离级别。仅仅有在非常须要确保数据的一致性而且能够接受没有并发的情况下,才考虑用该级别。


       对于表中的数据存储。InnoDB存储引擎採用了聚集的方式,因此每张表的存储都是按主键的顺序存储。假设没有显式的在表定义时指定主键,InnoDB存储引擎会为每一行生成一个6字节的ROWID,并以此作为主键。

    MyISAM存储引擎:
        MyISAM存储引擎不支持事务、表锁设计,支持全文索引。主要面向一些OLAP(在线分析处理)数据库应用,MyISAM存储引擎的还有一个与众不同的地方是它的缓冲池仅仅缓存索引文件,而不是数据文件,MyISAM存储引擎表由MYD和MYI组成,MYD用来存放数据文件,MYI用来存放索引文件,在mysql5.0版本号之前,MyISAM默认支持的表大小为4GB,5.0版本号開始,MyISAM默认支持256TB的单表数据,

    NDB存储引擎:
          是一个集群存储引擎。其结构是share nothing的集群架构。

    Shared Everthting:通常是针对单个主机。全然透明共享CPU/MEMORY/IO,并行处理能力是最差的,典型的代表SQLServer


    Shared Disk:各个处理单元使用自己的私有 CPU和Memory,共享磁盘系统。典型的代表Oracle Rac。 它是数据共享,可通过添加节点来提高并行处理的能力,扩展能力较好。其相似于SMP(对称多处理)模式。可是当存储器接口达到饱和的时候,添加节点并不能 获得更高的性能 。


    Shared Nothing:各个处理单元都有自己私有的CPU/内存/硬盘等,不存在共享资源。相似于MPP(大规模并行处理)模式,各处理单元之间通过协议通信,并行处理和扩展能力更好。典型代表DB2 DPF和hadoop ,各节点相互独立。各自处理自己的数据。处理后的结果可能向上层汇总或在节点间流转。

    我们常说的 Sharding 事实上就是Share Nothing架构,它是把某个表从物理存储上被水平切割,并分配给多台server(或多个实例),每台server能够独立工作,具备共同的schema。比方MySQL ProxyGoogle的各种架构,仅仅需添加server数就能够添加处理能力和容量。

    因此提供更高的可用性,NDB的特点是数据所有存放在内存中,因此主键查找的速度极快,而且通过加入NDB数据存储节点能够线性的提高数据库性能,是高可用的集群系统。

    可是NDB存储引擎的链接操作是在mysql数据库层完毕的,而不是在存储引擎层完毕的,意味着复杂的连接操作须要巨大的网络开销。因此查询速度非常慢。


    Memory存储引擎(之前称为heap存储引擎):

         将表中的数据存放在内存中,假设数据库重新启动或者发生崩溃,表中的数据都将消失,非常适用于存储暂时数据的暂时表,默认使用哈希索引,而不是B+树索引。仅仅支持表锁。并发性能较差,而且存储变长字段(varchar)时是依照定常字段(char)的方式进行的。因此会浪费内存。


    Archive存储引擎:

       仅仅支持insert和select操作。从mysql5.1開始支持索引,非常适合存储归档数据,如日志信息,其设计目标是提供快速的插入和压缩功能。


    Federated存储引擎:

         存储引擎表并不存放数据。他仅仅是指向一台远程mysql数据库server上的表。仅仅支持mysql数据库表,不支持异构数据库表(异构数据库系统相关的多个数据库系统的集合,能够实现数据的共享和透明訪问,每一个数据库系统在加入异构数据库系统之前本身就已经存在,拥有自己的DBMS。

    )  


    Maria存储引擎:

          设计目标是主要用来代替原有的mysql存储引擎,特点是支持缓存数据和索引文件,应用了行锁设计,提供了mvcc(多版本号并发控制)功能,支持事务和非事务安全的选项,以及更好的blob字符类型的处理性能,


    在MySQL中有两个字段类型easy让人感觉混淆,那就是TEXT与BLOB。特别是自己写博客程序的博主不知道改为自己的博客正文字段选择TEXT还是BLOB类型。

    以下给出几点差别:

    一、主要差别

    TEXT与BLOB的主要差别就是BLOB保存二进制数据。TEXT保存字符数据。眼下差点儿所有博客内容里的图片都不是以二进制存储在数据库的,而 是把图片上传到server然后正文里使用<img>标签引用,这种博客就能够使用TEXT类型。

    而BLOB就能够把图片换算成二进制保存到数据 库中。

    二、类型差别

    BLOB有4种类型:TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB。它们仅仅是可容纳值的最大长度不同。

    TEXT也有4种类型:TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT。这些类型同BLOB类型一样。有相同的最大长度和存储需求。

    三、字符集

    BLOB列没有字符集,而且排序和比較基于列值字节的数值值。TEXT列有一个字符集。而且依据字符集的校对规则对值进行排序和比較

    四、大写和小写

    在TEXT或BLOB列的存储或检索过程中。不存在大写和小写转换,都一样!

    五、严格模式

    运行在非严格模式时,假设你为BLOB或TEXT列分配一个超过该列类型的最大长度的值值。值被截取以保证适合。

    假设截掉的字符不是空格。将会产生一条警告。使用严格SQL模式,会产生错误。而且值将被拒绝而不是截取并给出警告。

    六、其它

    当保存或检索BLOB和TEXT列的值时不删除尾部空格。

    对于BLOB和TEXT列的索引,必须指定索引前缀的长度。

    BLOB和TEXT列不能有默认值。

    当排序时仅仅使用该列的前max_sort_length个字节。

    max_sort_length的 默认值是1024。

    当你想要使超过max_sort_length的字节有意义,对含长值的BLOB或TEXT列使用GROUP BY或ORDER BY的还有一种方式是将列值转换为固定长度的对象。

    标准方法是使用SUBSTRING函数。

    BLOB或TEXT对象的最大大小由其类型确定,但在client和server之间实际能够传递的最大值由可用内存数量和通信缓存区大小确定。

    你能够通过更改max_allowed_packet变量的值更改消息缓存区的大小,但必须同一时候改动server和client程序。


    除了以上的存储引擎,mysql还有非常多其它的存储引擎。包含merge、csv、sphinx、infobright。他们都有各自的使用场所,


  • 相关阅读:
    gcvt(),ecvt(),fcvt()的区别
    SQLITE3 使用总结
    C++的类型转换浅析
    JAVA Class21
    JAVA Class20
    JAVA Class19
    JAVA Class18
    JAVA Class17
    JAVA Class16
    关于hover失效问题(!important)
  • 原文地址:https://www.cnblogs.com/zhchoutai/p/8324689.html
Copyright © 2011-2022 走看看