InnoDB存储引擎 (第1章 MySQL体系结构和存储引擎)

1.1  定义数据库和实例

数据库: 即指磁盘上的文件;

物理操作系统文件或其他形式文件类型的集合。(是文件的集合,是依照某种数据模型组织起来并存放于二级存储器中的数据集合。)

数据库文件可以试frm,MYD,MYI,ibd结尾的文件,当使用NDB引擎时,数据库是存放于内存中的文件;

 

实例: 指的启动的一个数据库程序.

由数据库后台进程/线程以及一个共享内存区域组成。(是应用程序,是位于用户与操作系统之间的一层数据管理软件,用户对数据库的任何操作都是在数据库实例下进行的,应用程序只有通过数据库实例才能和数据库打交道。)

MySQL是一个单进程多线程的数据库;

查看mysql启动的进程情况: ps -ef | grep mysqld

查看mysql启动配置文件: mysql --help |grep my.cnf

例如结果为: order of preference, my.cnf, $MYSQL_TCP_PORT,

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

上面有三个配置文件,相同的参数 ,mysql会以最后一个配置文件中的参数为准;

Linux环境下,配置文件一般放在 /etc/my.cnf 下;

windows环境下,配置文件的后缀可能是,cnf,也可能是.ini,命令: mysql--help

 

数据库所在路径 :

show variables like 'datadir' ;

linux下默认 /usr/local/mysql/data;

 

1.2  MySQL体系结构

 组成部分:

  • 连接池组件

  • 管理服务和工具组件

  • SQL接口组件

  • 查询分析器组件

  • 优化器组件

  • cache组件

  • 插件式存储引擎 (最重要的特色)

  • 物理文件

MySQL区别于其他数据库的最重要的特点是插件式的表存储引擎。(存储引擎是底层物理结构的实现,它是基于表的,而不是数据库。

 

1.3  MySQL存储引擎

1.3.1 InnoDB存储引擎

  • InnoDB存储引擎支持事务,主要面向在线事务处理(OLTP)方面的应用。

  • 特点:行锁设计,支持外键,并支持非锁定读(即默认情况下读取操作不会产生锁)。

  • MySQL在windows版本下的InnoDB是默认的存储引擎。

  • InnoDB将数据放在一个逻辑的表空间中,这个表空间就想黑盒一样由InnoDB自身进行管理。从MySQL4.1版本开始,它可以将每个InnoDB存储引擎的表单独放在一个独立的ibd文件中。

  • InnoDB通过使用多版本并发控制(MVCC)来获得高并发性,

并且实现了SQL标准中的4种隔离级别,默认为REPEATABLE级别,同时使用一种被称为next-key locking的策略来避免幻读

  除此之外,InnoDB还提供了插入缓冲、二次写、自适应哈希索引、预读等高性能和高可用的功能

  • 对于表中数据的存储,InnoDB存储引擎采用了聚集(clusterrd)的方式,这种方式类似于Oracle的索引聚集表。每张表的存储都按主键的顺序存放,如果没有显式地在表定义时指定主键,InnoDB存储引擎会为每一行生成一个6字节的ROWID,并以此作为主键。

 

1.3.2 MyISAM存储引擎

  • 特点:不支持事务、表锁和全文索引,对于一些OLAP(在线分析处理)操作速度快。除windows版本外,是所有其他版本默认的存储引擎。

  • MyISAM存储引擎表由MYDMYI组成,MYD用来存放数据文件,MYI用来存放索引文件。

  • 对于MyISAM存储引擎表,Mysql数据库只缓存其索引文件,数据文件的缓存交由操作系统本身来完成,这与其他使用LRU算法缓存数据的大部分数据库大不相同。

 

1.3.3 NDB存储引擎

集群存储引擎,类似Oracle的RAC集群.

数据全部放在内存中; 5.1版本后可以将非索引数据放在磁盘上,因此主键查找速度极快,并且可以通过添加NDB数据存储节点线性提高数据库能力,高可用,高性能的集群系统;

NDB存储引擎的联接操作(join)是在mysql数据库层完成的,而不是存储引擎层,复杂的联接操作需要巨大网络开销,查询数据很慢;

1.3.4 Memory存储引擎

数据存储在内存中.使用哈希索引.

只支持表锁,所以并发性能差,不支持TEXT和BLOB列类型, 存储变长字段采用char会浪费内存空间.

MySQL使用Memory存储引擎存放查询的中间结果集.

1.3.5 Archive存储引擎

只支持insertselect操作,使用zlib算法压缩数据行后存储.压缩比可达1:10,适合存储归档数据. 如日志信息;

使用行锁来实现高并发插入操作,但本身并不是事务安全的存储引擎;

设计目标主要是提供高速的插入和压缩功能;

1.3.6 Federated存储引擎

并不存放数据,而是指向网络上的一台远程MySQL服务器上的表.

 

1.3.7 Maria存储引擎

新开发的存储以前,设计目标为取代原有的MyISAM存储引擎;

特点:

支持缓存数据和索引文件,应用行锁设计,提供MVCC功能,支持事务和非事务安全的选项,以及更好的BOLB字符类型的处理性能;

1.3.8 其他存储引擎

 其他存储引擎:Merge,CSV...

问题

  • 为什么 MySQL 不支持全文索引?

    答:支持,MyISAM、InnoDB都支持

  • MySQL 数据库快是因为不支持事务?

    答:MyISAM 不支持,但是 InnoDB 支持。“快”是相对于不同应用来说的,对于 ETL 这种操作,MyISAM 更有优势,但在 OLTP 环境中,InnoDB 效率更高;

  • 当表的数据量大于1000万时,mysql的性能会急剧下降吗?

    答: 不,mysql 是数据库不是文件, 随着数据行的增加,性能当然会有所下降,但不是线性的,

用户选择正确的存储引擎和配置,再多的数据量mysql也可以承受;

 

1.4  各存储引擎之间的比较

官方手册:

 

Notes:

  1. Implemented in the server, rather than in the storage engine.

在服务器中实现,而不是在存储引擎中实现。

  1. Compressed MyISAM tables are supported only when using the compressed row format. Tables using the compressed row format with MyISAM are read only.

只有在使用压缩行格式时,才支持压缩的MyISAM表。表的使用MyISAM的压缩行格式是只读的。

  1. Implemented in the server via encryption functions.

在服务器中通过加密功能实现。

  1. Implemented in the server via encryption functions; In MySQL 5.7 and later, data-at-rest tablespace encryption is supported.

通过加密功能在服务器上实现; 在MySQL 5.7及以后版本中,静态数据表空间

支持加密。

  1. Support for foreign keys is available in MySQL Cluster NDB 7.3 and later.

对外键的支持在MySQL集群NDB 7.3和更高版本中可用。

  1. InnoDB support for FULLTEXT indexes is available in MySQL 5.6 and later.

InnoDB对全文索引的支持在MySQL 5.6和更高版本中是可用的。

  1. InnoDB support for geospatial indexing is available in MySQL 5.7 and later.

InnoDB对地理空间索引的支持在MySQL 5.7和更高版本中是可用的。

  1. InnoDB utilizes hash indexes internally for its Adaptive Hash Index feature.

InnoDB内部利用哈希索引来实现自适应哈希索引特性。

9. See the discussion later in this section.

请参阅本节后面的讨论。

 

查看MySQL支持的存储引擎: show engines;

1.5  连接MySQL

  1. 连接 MySQL操作是一个连接进程和 MySQL 数据库实例进行通信;

  2. 从程序设计的角度来看,本质上是进程通信

 

常用进程通信方式: 管道,命名管道,命名字,TCP/IP套接字,UNIX域套接字;

1.5.1 TCP/IP

命令: mysql -uroot -p123456 -h127.0.0.1

远程数据库将IP换成远程服务器上地址即可;

在连接到MySQL之前,会检查一张权限视图.视图在mysql数据库中,表名为user;

 

1.5.2 命名管道和共享内存

在配置文件中增加--enable-named-pipe选项

在MySQL4.1之后还提供了共享内存的方式,在配置文件添加--shared-menory

 

1.5.3 UNIX域套接字

不是网络协议, Mysql客户端和数据库实例在一台服务器上的情况下使用;

套接字文件查找命令:

show variables like '%socket%';

知道路径后,进行连接;

mysql -uroot -S /tmp/mysql.socket

 

1.6  小结

省略.....

原文地址:https://www.cnblogs.com/coloz/p/13792641.html