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存储引擎表由MYD和MYI组成,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存储引擎
只支持insert和select操作,使用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:
-
Implemented in the server, rather than in the storage engine.
在服务器中实现,而不是在存储引擎中实现。
-
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的压缩行格式是只读的。
-
Implemented in the server via encryption functions.
在服务器中通过加密功能实现。
-
Implemented in the server via encryption functions; In MySQL 5.7 and later, data-at-rest tablespace encryption is supported.
通过加密功能在服务器上实现; 在MySQL 5.7及以后版本中,静态数据表空间
支持加密。
-
Support for foreign keys is available in MySQL Cluster NDB 7.3 and later.
对外键的支持在MySQL集群NDB 7.3和更高版本中可用。
-
InnoDB support for FULLTEXT indexes is available in MySQL 5.6 and later.
InnoDB对全文索引的支持在MySQL 5.6和更高版本中是可用的。
-
InnoDB support for geospatial indexing is available in MySQL 5.7 and later.
InnoDB对地理空间索引的支持在MySQL 5.7和更高版本中是可用的。
-
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
-
连接 MySQL操作是一个连接进程和 MySQL 数据库实例进行通信;
-
从程序设计的角度来看,本质上是进程通信。
常用进程通信方式: 管道,命名管道,命名字,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 小结
省略.....