了解存储引擎我们先看下mysql的体系架构。

上图是mysql的逻辑架构图,可以看到分了几层。

第一层是大部分网路客户端工具,比如php,python  ,JDBC等,主要功能就是连接处理,授权认证等,这层并不是mysql独有的。每个连接到mysql的客户端都会在服务端有个线程,这个连接的查询只会在这个线程中执行查询。

第二层是mysql服务层,包括了连接管理器,查询解析器,查询缓存,查询优化器,以及所有的mysql内置函数和sql接口。常用的DDL,DML语句都是在这层定义的,这层实现了所有跨存储引擎的功能:存储过程,存储函数,触发器,视图等等, 包含和存储引擎无关的特性(比如说常见的select语句,从文件系统中获取我们想要的数据这个具体的功能是由存储引擎实现),是mysql的核心服务功能所在的地方。

第三层,也就是文件系统层上面那一排就是mysql的存储引擎,者层被称之为存储引擎层,这也是mysql最有特点的就是它的插件式存储引擎,这种设计将数据库查询处理及数据的存储提取相分离,因为mysql中的数据存储和提取是由存储引擎来负责的,者层服务器通过API接口和存储引擎通信,而这些接口屏蔽了不同存储引擎的差异(比如非常出名的innodb存储引擎就是由第三方公司开发的),所以这种设计方式可以让我们在使用数据库的时候可以灵活的根据不同存储引擎的性能和特征来选择。

注意:

存储引擎是针对表的,一个数据库里不同的表可以选择不同的存储引擎。

MySQL常用的存储引擎的介绍


  mysql存储引擎层多种存储引擎,它们各自的特性各不相同,包括InnoDB、MyISAM、Memory等。现在最常用的存储引擎是InnoDB,它从MySQL 5.5.5版本开始成为了mysql的默认存储引擎。

  下面一张表格展示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()) engine=myisam;
Query OK, 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 说明表是正常的
+------------------------------+-------+----------+----------+
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 |
+------------------------------+--------+----------+----------+
row in set (0.12 sec)

压缩表,可以使用myisampack打包压缩。压缩前先查看文件情况。

[root@localhost oa_workflow_test]# ls -l myiam_table*
-rw-r----- mysql mysql 6月 : myiam_table_5769.SDI
-rw-r----- mysql mysql 6月 : myiam_table.MYD
-rw-r----- mysql mysql 6月 : myiam_table.MYI

开始压缩

[root@localhost oa_workflow_test]# myisampack -b -f myiam_table.MYI     f参数是强制压缩
Compressing myiam_table.MYD: ( records)
- Calculating statistics
- Compressing file
-%

压缩后我们在看下目录多了一个文件myiam_table.OLD,这个压缩之前myiam_table.MYI一个文件备份。

[root@localhost oa_workflow_test]# ls -l myiam_table*
-rw-r----- mysql mysql 6月 : myiam_table_5769.SDI
-rw-r----- mysql mysql 6月 : myiam_table.MYD
-rw-r----- mysql mysql 6月 : myiam_table.MYI
-rw-r----- mysql mysql 6月 : 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存储引擎。

innodb存储引擎特性:

  1. 支持事务。完全支持事务的ACID特性。innodb使用undo log 日志(存储未提交的事务来帮助未提交事务回滚和实现MVCC多版本并发控制(和oracle类似),这个文件可以独立表空间存在)和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()) engine ='innodb';
Query OK, rows affected (0.70 sec)

然后看下在文件系统中如何存储的。

[root@localhost webim]# ll
-rw-r----- mysql mysql 9月 conf_project_archives.ibd
-rw-r----- mysql mysql 6月 : table_innode.ibd
-rw-r----- mysql mysql 8月 table_innode.frm mysql8.0版本已经将这个文件取消掉了

如果将innodb_file_per_table设置成off,看看innodb如何存储。

mysql> set global innodb_file_per_table=off;
Query OK, rows affected (0.04 sec)

创建一张新表

mysql> create table my_innode_off(id int,name varchar()) engine ='innodb';
Query OK, rows affected (0.10 sec) 

再次查看目录文件,发现这次只有frm文件。

[root@localhost webim]# ll
总用量
-rw-r----- mysql mysql 9月 conf_project_archives.ibd
-rw-r----- mysql mysql 6月 : table_innode.ibd
-rw-r----- mysql mysql 6月 : table_innode.frm
-rw-r----- mysql mysql 8月 my_innodb_off.frm

其实数据是存储在系统的共享表空间中,进入上一层目录,可以看见一个名为ibdata1的文件

[root@localhost webim]# cd ..
[root@localhost data]# ll
-rw-r-----. mysql mysql 6月 auto.cnf
drwxr-x--- mysql mysql 11月 db_kingnet_ganen
-rw-r----- mysql mysql 11月 db_kingnet_ganen_10.SDI
drwxr-x--- mysql mysql 10月 db_kingnet_oa
-rw-r----- mysql mysql 5月 : ib_buffer_pool
-rw-r-----. mysql mysql 6月 : ibdata1

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

我们可以对比下分析:

  1. 当删除数据表中不用的数据的时候,系统表空间无法简单的缩小文件的大小。
  2. 独立表空间可以通过optimize table命令来收缩系统文件,减少磁盘碎片。不需要重启数据库,不影响表的正常访问。
  3. 系统表空间由于只有一个文件,会产生IO瓶颈,如果对多个表数据刷新时候,从文件系统层面来看,是顺序进行的。而独立表空间,每张表都有自己的表空间文件,在添加数据的时候,可以利用多个文件增加IO处理的性能,所以对于频繁数据写入操作的系统不太适合独立表空间。

【mysql】mysql存储引擎的更多相关文章

  1. MYSQL的存储引擎一般只要哪些?

    根据个人个人见解: MySQL的存储引擎(构成.安全.锁) Myisam:数据操作快速的一种引擎,支持全文检索.文件保存在数据库名称为目录名的 目录中,有3个文件,分别是表定义文件(.frm).数据文 ...

  2. MySQL常用存储引擎及如何选择

    一.MySQL的存储引擎 完整的引擎说明还是看官方文档:http://dev.mysql.com/doc/refman/5.6/en/storage-engines.html 这里介绍一些主要的引擎 ...

  3. mysql 的存储引擎介绍

    在数据库中存的就是一张张有着千丝万缕关系的表,所以表设计的好坏,将直接影响着整个数据库.而在设计表的时候,我们都会关注一个问题,使用什么存储引擎.等一下,存储引擎?什么是存储引擎? 什么是存储引擎? ...

  4. mysql数据库存储引擎及区别

    MySQL有多种存储引擎,每种存储引擎有各自的优缺点,可以择优选择使用:MyISAM.InnoDB.MERGE.MEMORY(HEAP).BDB(BerkeleyDB).EXAMPLE.FEDERAT ...

  5. mysql之存储引擎和文件配置

    (查看系统服务,在运行里输入services.msc) 补充:将mysql做成系统服务:mysqld --install 取消:mysqld --romove 在服务中可以直接鼠标操作mysql服务的 ...

  6. MySQL数据库----存储引擎

    什么是存储引擎? 存储引擎说白了就是如何存储数据.如何为存储的数据建立索引和如何更新.查询数据等技术的实现方法.因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操 ...

  7. MySql的存储引擎介绍

    下面主要介绍InnoDB.MyISAM和MEMEORY三种存储引擎. InnoDB存储引擎 InnoDB遵循CNU通用公开许可(GPL)发行.InnoDB已经被一些重量级互联网公司所采用,如雅虎.Sl ...

  8. MySQL之存储引擎(表类型)的选择

    和大部分的数据库不同,MySQL中有一个存储引擎的概念,用户可以根据数据存储的需求来选择不同的存储引擎.本次博客就来介绍一下MySQL中的存储引擎.MySQL版本 5.7.19. 概述 MySQL的存 ...

  9. MySql中存储引擎MyISAM与InnoDB区别于选择

    InnoDB: 支持事务处理等 不加锁读取 支持外键 支持行锁 不支持FULLTEXT类型的索引 不保存表的具体行数,扫描表来计算有多少行 DELETE 表时,是一行一行的删除 InnoDB 把数据和 ...

  10. MySQL常用存储引擎功能与用法详解

    本文实例讲述了MySQL常用存储引擎功能与用法. MySQL存储引擎主要有两大类: 1. 事务安全表:InnoDB.BDB. 2. 非事务安全表:MyISAM.MEMORY.MERGE.EXAMPLE ...

随机推荐

  1. 加载loading对话框的功能(不退出沉浸式效果)

    上一篇基于修改系统源码的前提下,实现了完全的沉浸式体验效果.可参考这篇 戳这 一.自定义Dialog 在沉浸式效果下,当界面弹出对话框时,对话框将获取到焦点,这将导致界面退出沉浸式效果,那么是不是能通 ...

  2. Eclipse插件开发教程-插件的导出和安装应用

    Eclipse插件可以给开发人员提供不少便利,在很多场景下,插件甚至是必不可少的.那么怎么自己开发一个插件呢?前面两篇讲了怎么开发插件,那么开发完了Eclipse插件之后,怎么使用呢?下面就讲讲插件的 ...

  3. Android 性能优化:使用 Lint 优化代码、去除多余资源

    前言 在保证代码没有功能问题,完成业务开发之余,有追求的程序员还要追求代码的规范.可维护性. 今天,以“成为优秀的程序员”为目标的拭心将和大家一起精益求精,学习使用 Lint 优化我们的代码. 什么是 ...

  4. 数据库CRUD操作以及MyBatis的配置使用

    • 业务字段设计 • 数据库创建 • CRUD操作 • MyBatis集成 • 注解和XML定义 • ViewObject和DateTool • 首页开发     • 业务字段设计 实体: name: ...

  5. XUnit 依赖注入

    XUnit 依赖注入 Intro 现在的开发中越来越看重依赖注入的思想,微软的 Asp.Net Core 框架更是天然集成了依赖注入,那么在单元测试中如何使用依赖注入呢? 本文主要介绍如何通过 XUn ...

  6. MySQL 执行计划中Extra(Using where,Using index,Using index condition,Using index,Using where)的浅析

      关于如何理解MySQL执行计划中Extra列的Using where.Using Index.Using index condition,Using index,Using where这四者的区别 ...

  7. 从0开始的Python学习010return语句&DocStrings

    return语句 return语句用来从一个函数中 返回 即跳出函数.当然也可以从函数中返回一个值. #return 语句从一个函数返回 即跳出函数.我们也可选从函数返回一个值 def maximum ...

  8. JavaScript -- JSON.parse 函数 和 JSON.stringify 函数

    JavaScript -- JSON.parse 函数 和 JSON.stringify 函数 1. JSON.parse 函数: 使用 JSON.parse 可将 JSON 字符串转换成对象. &l ...

  9. C++面向对象程序设计之C++的初步知识

    本节内容为学习谭浩强老师编写的<C++面向对象程序设计>的第1章  C++的初步知识  后的个人总结. 在正文开始之前,首先声明,我是Python程序员. 1.2.最简单的C++程序 例1 ...

  10. 设置TextBlock默认样式后,其他控件的Text相关属性设置失效问题

    问题: 定义了默认TextBlock样式后,再次自定义下拉框 or 其他控件 ,当内部含有TextBlock时,设置控件的字体相关样式无效,系统始终使用TextBlock设置默认样式 解决方案: 为相 ...