MySQL存储引擎InnoDB学习01-MySQL体系结构和存储引擎

第一章:MySQL体系结构和存储引擎

Mysql被设计为一个单进程多线程的架构的数据库,MySql数据库实例在系统上的表现就是一个进程。
当我们启动一个Mysql实例时,MySQL数据库会去读取配置文件,根据配置文件的参数来启动数据库实例(这与Oracle的参数文件spfile相似,但不同的是,Oracle中如果没有参数文件,在启动实例时会提示找不到该参数文件,数据库启动会失败。而在MySQL数据库中,可以没有配置文件,这时MySQL会按编译时默认的参数启动实例),MySQL数据库是按如下顺序读取配置文件的:

/etc/my.cnf 
/etc/mysql/my.cnf 
/usr/local/mysql/etc/my.cnf
~/.my.cnf

如果配置文件中有相同配置参数,则以最后一个配置文件中参数为准。
配置文件中有个参数datadir,该参数指定了数据库所在的路径,Linux系统下默认为usr/local/mysql/data

1.1 MySQL体系结构

mysql体系结构 .png

MySQL由以下几部分组成:

  • 连接池组件
  • 管理服务和工具服务
  • SQL接口组件
  • 查询分析器组件
  • 优化器组件
  • 缓冲(cache)组件
  • 插件式存储引擎
  • 物理文件

需要特别注意的是:存储引擎是基于表的,而不是数据库。

1.2 MySQL存储引擎

存储引擎是MySQL区别于其他数据库的一个最重要特性,存储引擎的好处是:每个存储引擎都有各自的特点,能够根据具体的应用建立不同存储引擎表,由于MySQL的开源特性,用户还可以根据MySQL预定义的存储引擎接口编写自己的存储引擎。

1.2.1 常见存储引擎

  • InnoDB存储引擎
        InnoDB存储引擎支持事务,其设计目标主要面向在线事务处理(OLTP)的应用,其特点是行锁设计、支持外键、并支持类似于Oracle的非锁定读(即默认读取操作不会产生锁),Mysql数据库从5.5.8版本开始将InnoDB设置为默认的存储引擎。InnoDB存储引擎将数据放在一个逻辑的表空间中,这个表空间像一个黑盒一样由InnoDB存储引擎自行管理(InnoDB存储引擎的表单独存放到一个独立的idb文件中)。
        InnoDB通过使用多版本并发控制(MVCC)来获得高并发,并且实现了SQL标准的4种隔离级别,默认为REPEATABLE级别。同时,使用next_key_locking策略来避免幻读。除此之外,InnoDB存储引擎还提供了插入缓存(insert buffer)、二次写(double write)、自适应哈希索引(adaptive hash index)、预读(read ahead)等高性能和高可用的功能。
        对于表中数据的存储,InnoDB存储引擎采用了聚集(clustered)的方式,因此每张表的存储都是按主键的顺序进行存放,如果在表中没有显式的指定主键,InnoDB存储引擎会为每一行生成一个6个字节的ROWID,并以此作为主键。
  • MyISAM引擎
        MyISAM存储引擎不支持事务、表锁设计、支持全文索引,主要面向一些OLAP数据库应用。同时MyISAM存储引擎的缓冲池值缓存索引文件,而不缓冲数据文件。
        MyISAM存储引擎表由MYD和MYI组成,MYD用来存放数据文件,MYI用来存放索引文件。
        在MySQL5.0之前的版本,MyISAM默认支持的表大小为4GB,如果需要支持大于4GB的MyISAM表时,则需要制定MAX_ROWS和AVG_ROW_LENGTH属性,而从MySQL5.0版本开始,MyISAM默认支持256TB的单表数据,这足够满足一般应用的需求。
        不难看出,MyISAM适合没有更新操作,只有查询(例如统计、报表)的业务场景,MyISAM现在用的已经很少了。

注意:对于MyISAM存储引擎表,MySQL数据库只缓存其索引文件,数据文件的缓存交由操作系统本身来完成,这与其他LRU算法缓存数据的大部分数据库不同。此外,在MySQL5.1.23版本之前,无论是在32位还是64位操作系统环境下,缓存索引的缓冲区最大只能设置为4GB,在之后的版本中,64位的操作系统可以支持大于4GB的索引缓冲区。

  • NDB存储引擎
        2003年,MySQL AB公司从Sony Ericsson公司收购了NDB集群引擎。
        NDB存储引擎是一个集群存储引擎,类似于Oracle的RAC集群,不过与Oracle RAC share everything架构不同的是,其结构是share nothing的集群架构,因此能提供更高的可用性。
        NDB的特点是数据全部放在内存中(MySQL5.1版本开始可以将非索引数据存放在磁盘上),因此主键查找(primary key lookups)的速度极快,并且通过添加NDB数据存储节点(Data Node)可以线性的提高数据库性能,是高可用、高性能的集群系统。
        值得注意的是,NDB存储引擎的连接操作(JOIN)是在MySQL数据库层完成的,而不是在存储引擎层完成的,这意味着负责的连接操作需要巨大的网络开销,因此查询速度很慢。
  • Memory存储引擎
        Memory存储引擎(之前称为HEAP存储引擎)将表中的数据存放到内存中,如果数据库重启或宕机,表中的数据都将消失。它非常适合存储临时数据,Memory存储引擎默认使用哈希索引,而不是我们熟悉的B+树索引。
        虽然Memory存储引擎速度非常快,但在使用上有一定的限制,比如它只支持表锁,并发性能较差,并且不支持TEXT和BLOB类型,更重要的是存储变长字段(varchar)时是按照定长字段(char)的方式进行的,因此会浪费内存。
  • Archive存储引擎
        Archive存储引擎只支持INSERT和SELECT操作,从MySQL 5.1开始支持索引。
        Archive存储引擎使用zlib算法将数据行(row)进行压缩后存储,压缩比一般可达1:10。
        Archive存储引擎非常适合存储归档数据,如日志信息等,Archive存储引擎使用行锁来实现高并发的插入操作,但是其本身不是事务安全的存储引擎,其设计目标是提供高速的插入和压缩功能。
  • Federated存储引擎
        Federated存储引擎表并不存放数据,它只是指向一台远程MySQL数据库服务器上的表,这非常类似于SQL Server的链接服务器和Oracle的透明网关,不同的是,当前的Fedrated存储引擎只支持MySQL数据库表,不支持异构数据库表。
  • Maria存储引擎
        Maria存储引擎是新开发的存储引擎,设计目标主要是用来取代原有的MyISAM存储引擎,从而成为MySQL的默认存储引擎(存储引擎的开发者是MySQL创始人之一的Michael Widenius,因此它可以看作是MyISAM的后续版本)
        Maria存储引擎的特点是:支持缓存数据和索引文件、应用了行锁设计、提供了MVCC功能、支持事务和非事务安全的选项、以及更好的BLOB字符类型的处理性能。
  • 其他存储引擎
    MySQL还有Merge、CSV、Sphinx、Infobright存储引擎,他们都有各自的特点和使用场景。

1.3各个存储引擎的比较

不同MySQL存储引擎相关特新比较.png

如何查看自己当前使用的MySQL数据库所支持的存储引擎?

  • 可以通过命令:SHOW ENGINES查看:
  • 也可以通过查找information_schema中的ENGINES表查看


你可能感兴趣的:(MySQL存储引擎InnoDB学习01-MySQL体系结构和存储引擎)