了解存储引擎咱们先看下mysql的体系架构。php
上图是mysql的逻辑架构图,能够看到分了几层。node
第一层是大部分网路客户端工具,好比php,python ,JDBC等,主要功能就是链接处理,受权认证等,这层并非mysql独有的。每一个链接到mysql的客户端都会在服务端有个线程,这个链接的查询只会在这个线程中执行查询。 python
第二层是mysql服务层,包括了链接管理器,查询解析器,查询缓存,查询优化器,以及全部的mysql内置函数和sql接口。经常使用的DDL,DML语句都是在这层定义的,这层实现了全部跨存储引擎的功能:存储过程,存储函数,触发器,视图等等, 包含和存储引擎无关的特性(好比说常见的select语句,从文件系统中获取咱们想要的数据这个具体的功能是由存储引擎实现),是mysql的核心服务功能所在的地方。 mysql
第三层,也就是文件系统层上面那一排就是mysql的存储引擎,者层被称之为存储引擎层,这也是mysql最有特色的就是它的插件式存储引擎,这种设计将数据库查询处理及数据的存储提取相分离,由于mysql中的数据存储和提取是由存储引擎来负责的,者层服务器经过API接口和存储引擎通讯,而这些接口屏蔽了不一样存储引擎的差别(好比很是出名的innodb存储引擎就是由第三方公司开发的),因此这种设计方式可让咱们在使用数据库的时候能够灵活的根据不一样存储引擎的性能和特征来选择。web
注意:sql
存储引擎是针对表的,一个数据库里不一样的表能够选择不一样的存储引擎。数据库
MySQL经常使用的存储引擎的介绍缓存
mysql存储引擎层多种存储引擎,它们各自的特性各不相同,包括InnoDB、MyISAM、Memory等。如今最经常使用的存储引擎是InnoDB,它从MySQL 5.5.5版本开始成为了mysql的默认存储引擎。服务器
查看当前mysql存储引擎信息架构
mysql> show engines; +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | Engine | Support | Comment | Transactions | XA | Savepoints | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES | | MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO | | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO | | BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO | | MyISAM | YES | MyISAM storage engine | NO | NO | NO | | CSV | YES | CSV storage engine | NO | NO | NO | | ARCHIVE | YES | Archive storage engine | NO | NO | NO | | PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO | | FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
1.MyISAM存储引擎
MyISAM是mysql5.5以前的默认存储引擎,它是mysql最先使用的存储引擎之一,它也是大部分系统表,临时表(不是create table语句建的,这里是指在排序,分组等操做中,当记录数量超过必定大小的时候,由查询优化器创建的临时表)所采用的存储引擎。MyISAM存储引擎物理文件由MYD(数据文件)和MYI(索引文件)组成。
[root@localhost ~]# ls /usr/local/mysql/data/oa_2018/ | grep "^web_entry" web_entry.frm 这个frm后缀是用来记录表的结构的文件 web_entry.MYD web_entry.MYI
特性:
适用场景:
示例:
建立一个mysiam引擎的表。
mysql> create table myiam_table(id int,name varchar(20)) engine=myisam; Query OK, 0 rows affected (0.34 sec)
使用语句检查修复表。
mysql> check table myiam_table; +------------------------------+-------+----------+----------+ | Table | Op | Msg_type | Msg_text | +------------------------------+-------+----------+----------+ | oa_workflow_test.myiam_table | check | status | OK | 状态ok 说明表是正常的 +------------------------------+-------+----------+----------+ 1 row in set (0.16 sec) mysql> repair table myiam_table; +------------------------------+--------+----------+----------+ | Table | Op | Msg_type | Msg_text | +------------------------------+--------+----------+----------+ | oa_workflow_test.myiam_table | repair | status | OK | +------------------------------+--------+----------+----------+ 1 row in set (0.12 sec)
压缩表,可使用myisampack打包压缩。压缩前先查看文件状况。
[root@localhost oa_workflow_test]# ls -l myiam_table* -rw-r----- 1 mysql mysql 3066 6月 2 00:27 myiam_table_5769.SDI -rw-r----- 1 mysql mysql 0 6月 2 00:27 myiam_table.MYD -rw-r----- 1 mysql mysql 1024 6月 2 00:27 myiam_table.MYI
开始压缩
[root@localhost oa_workflow_test]# myisampack -b -f myiam_table.MYI f参数是强制压缩 Compressing myiam_table.MYD: (1 records) - Calculating statistics - Compressing file -150%
压缩后咱们在看下目录多了一个文件myiam_table.OLD,这个压缩以前myiam_table.MYI一个文件备份。
[root@localhost oa_workflow_test]# ls -l myiam_table* -rw-r----- 1 mysql mysql 3066 6月 2 00:27 myiam_table_5769.SDI -rw-r----- 1 mysql mysql 57 6月 2 00:59 myiam_table.MYD -rw-r----- 1 mysql mysql 1024 6月 2 01:04 myiam_table.MYI -rw-r----- 1 mysql mysql 40 6月 2 01:04 myiam_table.OLD
2.innodb存储引擎
innodb存储引擎是mysql5.5以后的默认存储引擎。是一种事务型存储引擎,支持事务的ACID特性,innodb的设计能够适合处理大量的小事务,小事务大部分状况下会被提交,不多被回滚。innodb在存储方面跟mysiam不同,它有存储表空间的概念,数据是存储在表空间中的,具体怎么存储是由innodb_file_per_table这个参数定义的,参数为on则会为每一个nnodb表创建idb为后缀的系统文件,好比tablename.idb,参数为off则把数据放在系统的表空间ibdataX(X表示数字)。
innodb存储引擎特性:
查看默认存储引擎:
mysql> show variables like 'default_storage_engine'; +------------------------+--------+ | Variable_name | Value | +------------------------+--------+ | default_storage_engine | InnoDB | +------------------------+--------+
查看innodb_file_per_table的设置。
mysql> show variables like 'innodb_file_per_table'; +-----------------------+-------+ | Variable_name | Value | +-----------------------+-------+ | innodb_file_per_table | ON | +-----------------------+-------+
mysql> create table table_innode(id int,name varchar(10)) engine ='innodb'; Query OK, 0 rows affected (0.70 sec)
而后看下在文件系统中如何存储的。
[root@localhost webim]# ll -rw-r----- 1 mysql mysql 147456 9月 15 2017 conf_project_archives.ibd -rw-r----- 1 mysql mysql 131072 6月 3 13:37 table_innode.ibd -rw-r----- 1 mysql mysql 131072 8月 24 2017 table_innode.frm mysql8.0版本已经将这个文件取消掉了
若是将innodb_file_per_table设置成off,看看innodb如何存储。
mysql> set global innodb_file_per_table=off; Query OK, 0 rows affected (0.04 sec)
建立一张新表
mysql> create table my_innode_off(id int,name varchar(10)) engine ='innodb'; Query OK, 0 rows affected (0.10 sec)
再次查看目录文件,发现此次只有frm文件。
[root@localhost webim]# ll 总用量 528 -rw-r----- 1 mysql mysql 147456 9月 15 2017 conf_project_archives.ibd -rw-r----- 1 mysql mysql 131072 6月 3 13:40 table_innode.ibd -rw-r----- 1 mysql mysql 131072 6月 3 13:37 table_innode.frm -rw-r----- 1 mysql mysql 131072 8月 24 2017 my_innodb_off.frm
其实数据是存储在系统的共享表空间中,进入上一层目录,能够看见一个名为ibdata1的文件
[root@localhost webim]# cd .. [root@localhost data]# ll -rw-r-----. 1 mysql mysql 56 6月 27 2017 auto.cnf drwxr-x--- 2 mysql mysql 83 11月 30 2017 db_kingnet_ganen -rw-r----- 1 mysql mysql 223 11月 22 2017 db_kingnet_ganen_10.SDI drwxr-x--- 2 mysql mysql 16384 10月 30 2017 db_kingnet_oa -rw-r----- 1 mysql mysql 1144 5月 27 21:56 ib_buffer_pool -rw-r-----. 1 mysql mysql 79691776 6月 3 13:56 ibdata1
系统表空间和独立表空间要如何选择。
咱们能够对比下分析: