MySQL

目录

  • 存储引擎
  • MyISAM存储引擎
  • InnoDB存储引擎
  • Memory 存储引擎
  • Archive存储引擎
  • NDB存储引擎
  • 测试存储引擎
  • innodb与MyIASM存储引擎的区别

1, 存储引擎

  • 存储引擎 : 其实就是指定 表 如何存储数据,如何为存储的数据 建立索引 以及 如何更新,查询数据等技术实现的方法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型)

  • 在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。而MySql数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据自己的需要编写自己的存储引擎

  • MySQL存储引擎比较

特性 MyISAM InnoDB Memory Archive NDB
存储限制 没有 64TB 没有 没有
事务 支持 支持
锁粒度
B树索引 支持 支持 支持 支持
哈希索引 支持 支持
全文索引 支持
集群索引 支持
数据缓存 支持 支持
索引缓存 支持 支持 支持
数据压缩 支持 支持
批量插入 相对低 非常高
内存消耗
外键支持 支持
复制支持 支持 支持 支持 支持 支持
查询缓存 支持 支持 支持 支持 支持
备份恢复 支持 支持 支持 支持 支持
集群支持 支持

2, MyISAM存储引擎

  • 1、MyISAM 是MySQL (mysql 5.5版本以前) 原来的默认存储引擎.
  • 2、MyISAM 这种存储引擎不支持事务,不支持行级锁,只支持并发插入的表锁。
  • 3、MyISAM 类型的表支持三种不同的存储结构:静态型、动态型、压缩型。
    • (1)静态型:就是定义的表列的大小是固定(即不含有:xblob、xtext、varchar等长度可变的数据类型),这样mysql就会自动使用静态myisam格式。
      • 使用静态格式的表的性能比较高,因为在维护和访问的时候以预定格式存储数据时需要的开销很低。但是这高性能是用空间换来的,因为在定义的时候是固定的,所以不管列中的值有多大,都会以最大值为准,占据了整个空间。
    • (2)动态型:如果列(即使只有一列)定义为动态的(xblob, xtext, varchar等数据类型),这时myisam就自动使用动态型,虽然动态型的表占用了比静态型表较少的空间,但带来了性能的降低.
    • (3)压缩型:如果在这个数据库中创建的是在整个生命周期内只读的表,则这种情况就是用myisam的压缩型表来减少空间的占用。
  • 4、MyISAM也是使用B+tree索引但是和Innodb的在具体实现上有些不同。

3, InnoDB存储引擎

  • 1 MySQL默认存储引擎(MySQL 5.5 版本后).
  • 2 innodb 支持事务,回滚以及系统崩溃修复能力和多版本迸发控制的事务的安全。
  • 3 innodb 支持自增长列(auto_increment),自增长列的值不能为空,(一个表只允许存在一个自增,并且要求自增列必须为索引)
  • 4 innodb 支持外键(foreign key) ,外键所在的表称为子表,而所依赖的表称为父表。
  • 5 innodb存储引擎支持行级锁。
  • 6 innodb存储引擎索引使用的是B+Tree
  • 补充3点:
    • 1 大容量的数据集时趋向于选择Innodb。因为它支持事务处理和故障的恢复。Innodb可以利用数据日志来进行数据的恢复。主键的查询在Innodb也是比较快的。
    • 2 大批量的插入语句时(这里是INSERT语句)在MyIASM引擎中执行的比较的快,但是UPDATE语句在Innodb下执行的会比较的快,尤其是在并发量大的时候。
    • 3 两种引擎所使用的索引数据结构是什么?
      • 答案:都是B+树!
      • MyIASM引擎,B+树的数据结构中存储的内容实际上是实际数据的地址值。也就是说它的索引和实际数据是分开的,只不过使用索引指向了实际数据。这种索引的模式被称为非聚集索引。
      • Innodb引擎的索引的数据结构也是B+树,只不过数据结构中存储的都是实际的数据,这种索引有被称为聚集索引。

4, Memory 存储引擎

  • Memory存储引擎(之前称为Heap)将表中数据存放在内存中,如果数据库重启或崩溃,数据丢失,因此它非常适合存储临时数据。

5, Archive存储引擎

  • 正如其名称所示,Archive非常适合存储归档数据,如日志信息。它只支持INSERT和SELECT操作,其设计的主要目的是提供高速的插入和压缩功能。

6, NDB存储引擎

  • NDB存储引擎是一个集群存储引擎,类似于Oracle的RAC,但它是Share Nothing(非共享)的架构,因此能提供更高级别的高可用性和可扩展性。NDB的特点是数据全部放在内存中,因此通过主键查找非常快。
  • 关于NDB,有一个问题需要注意,它的连接(join)操作是在MySQL数据库层完成,不是在存储引擎层完成,这意味着,复杂的join操作需要巨大的网络开销,查询速度会很慢。

7, 测试存储引擎

  • 创建三个表,分别使用innodb,myisam,memory 存储引擎,进行插入数据测试
create table t1(id int)engine=innodb;
create table t2(id int)engine=myisam;
create table t3(id int)engine=memory;
 
#看一下三个存储引擎创建的 表文件
 t1.frm  t1.ibd 
 t2.MYD  t2.MYI  t2.frm 
 t3.frm
#细心的同学会发现最后的存储引擎只有表结构,无数据
#memory,在重启mysql或者重启机器后,表内数据清空

8, innodb与MyIASM存储引擎的区别

  • 1 innodb 是mysql5.5版本以后的默认存储引擎, 而MyISAM是5.5版本以前的默认存储引擎.

  • 2 innodb 支持事物,而MyISAM不支持事物

  • 3 innodb 支持行级锁.而MyIASM 它支持的是并发的表级锁.

  • 4 innodb 支持外键, 而MyIASM 不支持外键

  • 5 innodb与MyIASM存储引擎都采用B+TREE存储数据, 但是innodb的索引与数据存储在一个文件中,这种方式我们称之为聚合索引.

    • 而MyIASM则会单独创建一个索引文件,也就是说,数据与索引是分离开的
  • 6 在效率方面MyISAM比innodb高,但是在性能方面innodb要好一点.

  • 转自http://www.cnblogs.com/wangfengming/p/7930333.html

原文地址:https://www.cnblogs.com/xiaoqshuo/p/9944827.html