【mysql】mysql存储引擎

了解存储引擎咱们先看下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

 特性:

  • 表损坏修复:能够对因为意外关闭致使采用MyISAM的表进行修复操做。可使用mysql提供的check,repair语句检查修复表。
  • 支持全文索引类型。
  • 不支持事务。
  • 存储格式:静态表,动态表,压缩表(当一张大表导入数据后不在进行修改操做了,这样能够压缩表,减小空间)。
  • mysql版本小于5.0时,默认表大小4G,若是想存储大点表要修改MAX_Rows和AVG_ROW_LENGTH这两个参数。修改后表会重建,须要点时间。在高版本的mysql这个默认支持单表大小256TB。
  • 仅在内存中保存索引。

适用场景:

  • 非事务型应用。
  • 只读类的应用。     
  • 空间类的应用(支持空间类的函数),好比地理数据。

 示例:

建立一个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存储引擎特性:

  1. 支持事务。彻底支持事务的ACID特性。innodb使用undo log 日志(存储未提交的事务来帮助未提交事务回滚和实现MVCC多版本并发控制,这个文件能够独立表空间存在)和redo log日志(存储已经提交的事务,内容是顺序写入)来实现。
  2. 支持行级锁。在写操做时候锁定的资源更少,行级锁能够最大程度的支持并发。行级锁是由存储引擎本身实现的,mysql服务器不知道存储引擎锁的实现方式。
  3. 在内存中保存索引和数据。

 查看默认存储引擎:

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

 

 

系统表空间和独立表空间要如何选择。

咱们能够对比下分析:

  1. 当删除数据表中不用的数据的时候,系统表空间没法简单的缩小文件的大小。
  2. 独立表空间能够经过optimize table命令来收缩系统文件,减小磁盘碎片。不须要重启数据库,不影响表的正常访问。
  3. 系统表空间因为只有一个文件,会产生IO瓶颈,若是对多个表数据刷新时候,从文件系统层面来看,是顺序进行的。而独立表空间,每张表都有本身的表空间文件,在添加数据的时候,能够利用多个文件增长IO处理的性能,因此对于频繁数据写入操做的系统不太适合独立表空间。
相关文章
相关标签/搜索