【数据库】存储引擎

(一)概念

       MySQL中的数据用各种不同的技术存储在文件(或者内存)中。每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。例如,你在研究大量的临时数据,你也许需要使用内存MySQL存储引擎。内存存储引擎能够在内存中存储所有的表格数据。又或者,你也许需要一个支持事务处理的数据库(以确保事务处理不成功时数据的回退能力)。

       这些不同的技术以及配套的相关功能在 MySQL中被称作存储引擎(也称作表类型)。 MySQL默认配置了许多不同的存储引擎,可以预先设置或者在MySQL服务器中启用。你可以选择适用于服务器、数据库和表格的存储引擎,以便在选择如何存储你的信息、如何检索这些信息以及你需要你的数据结合什么性能和功能的时候为你提供最大的灵活性。

       关系数据库表是用于存储和组织信息的数据结构,可以将表理解为由行和列组成的表格,类似于Excel的电子表格的形式。有的表简单,有的表复杂,有的表根本不用来存储任何长期的数据,有的表读取时非常快,但是插入数据时去很差;而我们在实际开发过程中,就可能需要各种各样的表,不同的表,就意味着存储不同类型的数据,数据的处理上也会存在着差异,那么。对于MySQL来说,它提供了很多种类型的存储引擎(或者说不通的表类型),我们可以根据对数据处理的需求,选择不同的存储引擎,从而最大限度的利用MySQL强大的功能。

(二)分类

   2.1 MyISAM

        MYISAM强调的是快速读取操作,而且不占用大量的内存和存储资源不支持事务处理和外键,支持全文索引和表锁,底层为B+tree,采取非聚集索引,数据存储在磁盘上;

   2.2 InnoDB

         支持外键、事务和行锁,不支持全文索引,底层为B+tree,采取聚集索引,数据存放在磁盘上;

   2.3 MEMORY

          适用于临时数据的存储为了提高效率会将varchar当成char处理、不支持 图片[BLOB]和大文本[TEXT]存储、底层为hash、存储在内存上,但当MEMORY中出现BLOB或者TEXT会将内容转存到磁盘上存储

   2.4 ARCHIVE

        一般存储日志数据使用压缩算法将数据进行压缩后存储,压缩比例一般是1:10,只支持insert和select操作不支持索引;

总结如下图所示:

               

(三)InnoDB与MyISAM的区别

   3.1 事务的概念

       A  -> 原子性(Atomicity)指一个事务要么全部执行,要么不执行;也就是说一个事务不可能只执行了一半就停止了.比如你从取款机取钱,这个事务可以分成两个步骤:1划卡,2出钱.不可能划了卡,而钱却没出来.这两步必须同时完成.要么就不完成.

       C  -> 一致性(Consistency)指事务的运行并不改变数据库中数据的一致性.例如,完整性约束了a+b=10,一个事务改变了a,那么b也应该随之改变.

       I   ->  独立性(Isolation):事务的独立性也有称作隔离性,是指两个以上的事务不会出现交错执行的状态.因为这样可能会导致数据不一致.

       D  ->  持久性(Durability)事务的持久性是指事务执行成功以后,该事务所对数据库所作的更改便是持久的保存在数据库之中,不会无缘无故的回滚.

   3.2 MyISAM

     MyIASM是MySQL默认的引擎,但是它没有提供对数据库事务的支持,也不支持行级锁和外键,因此当INSERT(插入)或UPDATE(更新)数据时即写操作需要锁定整个表,效率便会低一些。不过和Innodb不同,MyIASM中存储了表的行数,于是SELECT COUNT(*) FROM TABLE时只需要直接读取已经保存好的值而不需要进行全表扫描。如果表的读操作远远多于写操作且不需要数据库事务的支持,那么MyIASM也是很好的选择。

   3.3 InnoDB

        Innodb引擎提供了对数据库ACID事务的支持;该引擎还提供了行级锁和外键约束它的设计目标是处理大容量数据库系统;MySQL运行时Innodb会在内存中建立缓冲池,用于缓冲数据和索引。当需要使用数据库事务时,该引擎当然是首选。由于锁的粒度更小,写操作不会锁定全表,所以在并发较高时,使用Innodb引擎会提升效率但是使用行级锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表。

   3.4 两种存储引擎的选择

       大数据集趋向于选择InnoDB引擎,因为它支持事务处理和故障恢复。数据库的大小决定了故障恢复的时间长短,InnoDB可以利用事务日志进行数据恢复,这会比较快。主键查询在InnoDB引擎下也会相当快,不过需要注意的是如果主键太长也会导致性能问题;大批的INSERT语句(在每个INSERT语句中写入多行,批量插入)在MyISAM下会快一些,但是UPDATE语句在InnoDB下则会更快一些,尤其是在并发量大的时候。

(四)更改数据库引擎

   4.1 查看当前数据库支持的引擎和默认的数据库引擎

    命令:

show engines;

    结果:

   

 4.2 更改数据库引擎

     方法1:修改配置文件my.ini 

     将my-small.ini另存为my.ini,在[mysqld]后面添加default-storage-engine=InnoDB,重启服务,数据库默认的引擎修改为InnoDB

     方法2:在建表的时候指定

create table mytbl(   
    id int primary key,   
    name varchar(50)   
)type=MyISAM;

     方法3:建表后更改

 alter table mytbl2 type = InnoDB;

  4.3 查看修改结果

      方法1:

show table status from mytest; 

     方法2:

show create table table_name;

参考文章:https://www.cnblogs.com/0201zcr/p/5296843.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章