一、数据库引擎(Engines)的概念

  MySQ5.6L的架构图:

  MySQL的存储引擎全称为(Pluggable Storage Engines)插件式存储引擎。MySQL的所有逻辑概念,包括SQL Interface、Parser、Optimizer、Caches和Buffers等,都需要真正转为物理层的实际数据的,怎么存或者以什么方式存的问题就需要存储引擎来实现。存储引擎对关系型数据库来讲是一个非常重要的概念。在MySQL中常用的文件系统有MyISAM、InnoDB、Federated、Archive、Merge、Memory等等。其中MyISAM和InnoDB最为普遍。

  简化的MySQL架构图(图片来自《高性能MySQL_第3版》):

  下面对MySQL中MyISAM和InnoDB两种引擎做具体对比介绍。

二、安装MySQL

  在CentOS7上的官方yum库已经将MySQL换成了MariaDB,要安装MySQL可以去MySQL的官网下载安装,安装方式有MySQL官方yum源安装、源码编译安装、通用二进制三种方式。下面以第三种方式(通用二进制)为例演示MySQL的安装步骤。

1.下载通用二进制格式的MySQL程序包并解压

  官方下载地址是https://dev.mysql.com/downloads/mysql/,目前最新的版本是MySQL8.0.13,但一般用到的是MySQL5系列,这里用MySQL5.7做示例,包名为 mysql-5.7.-linux-glibc2.-x86_64.tar.gz 。

  通用二进制格式的程序包安装起来和yum安装同样方便快捷,直接解压再做初始化配置就能直接使用了,并且和系统耦合性低,很方便做数据迁移。

  下载并解压 mysql-5.7.-linux-glibc2.-x86_64.tar.gz 至 /usr/local/ 下

~]# tar xf mysql-5.7.-linux-glibc2.-x86_64.tar.gz -C /usr/local/

  解压后创建软连接:

~]# cd /usr/local
~]# ln -sv mysql-5.7.-linux-glibc2.-x86_64 mysql

2.初始化MySQL

添加mysql用户,修改 /usr/local/mysql 目录的用户权限,将属组改为root,属组改为mysql。

~]# useradd mysql -M -s /sbin/nologin
~]# chmown -R root.mysql /usr/local/mysql/*

3.创建数据库目录

  创建MySQL存放数据的目录,并修改权限。

~]# mkdir -pv /data/mysql
~]# chown mysql.mysql /data/mysql

4.将MySQL的安装路径添加至环境变量中

  使MySQL的各指令使用相对路径就能使用。

~]# vim /etc/profile.d/mysql.sh
export PATH=/usr/local/mysql/bin:$PATH
~]# . /etc/profile.d/mysql.sh #.后面有空格

5.用mysql_install_db部署mysql

  mysql_install_db的官方解释为MySQL Database Deployment Utility.(MySQL数据库部署实施工具),常用选项:

~]# mysql_install_db --datadir=/data/mysql --basedir=/usr/local/mysql --insecure --user=mysql

注:在5.7后的版本中在MySQL初始化部署时可采用 mysqld --initialize 命令更快捷的进行初始化, --insecure 表示随机密码。例如:

~]# mysqld --initilize-insecure --datadir=/data/mysql --user=mysql --basedir=/usr/local/mysql

6.创建MySQL配置文件my.cnf

  my.cnf文件可以放在/etc/、/etc/mysql/、/usr/local/mysql/etc/下,这里建议创建在/usr/local/mysql/etc/下,方便管理。

~]# vim /usr/local/mysql/etc/my.cnf
[mysqld]
datadir=/data/mysql
socket=/tmp/mysql.sock
[mysqld_safe]
log-error=/usr/local/mysql/logs/error.log #需手动创建logs目录和error.log文件,并修改权限为mysql.mysql,目录和文件都需要修改,否则会出错
pid-file=/var/run/mysql/mysql.pid
!includedir /usr/local/mysql/etc/my.cnf.d

7.添加服务管理并启动服务

~]# chkconfig --add mysqld
~]# service start mysqld
Starting MySQL. SUCCESS!

三、MySQL的MyISAM存储引擎和InnoDB存储引擎详解

1.查看MySQL支持的引擎类别与属性

  从上表可以看出MySQL5.7支持8种存储引擎,其中InnoDB是默认的存储引擎,从Transactions这栏中可得知只有InnoDB支持事务,所以从某些角度讲,InnoDB是MySQL中功能最完善的存储引擎了,目前主流的存储引擎就是InnoDB和MyISAM。

  在MySQL自带的库中,默认存储引擎为MyISAM,因为MyISAM通常对读多写少的数据库能发挥很好的性能。另一点需要强调的是:存储引擎是表级别的概念。同一DATABASE的不同表可以是不同类型的存储引擎。但这里强烈建议在同一DATABASE中使用同一存储引擎。

  查看库中表的存储引擎类型可用 SHOW TABLE STATUS 命令,如:

mysql> USE mysql;
mysql> SHOW TABLE STATUS WHERE Engine=InnoDB\G; #过滤名为mysql库中的存储引擎为InnoDB的表。

  在结果中可看出MySQL已经渐渐的由MyISAM引擎转向InnoDB了,下面再具体介绍两个主流存储引擎的区别。

2.InnoDB介绍

  InnoDB的数据存储在表空间(table space)中,相较于其他存储引擎有所不同的是,其他存储引擎将数据存储在具体的文件系统中,如MyISAM的每个表都有一个属于自己的文件。但InnoDB的存储方式是基于黑盒模式的,就是说InnoDB将所有的数据都存储在一个空间中,任何库的任何存储引擎类型为InnoDB的表数据和索引全都在一个盒子中,这个盒子就称为表空间(table space),它内部有自己的文件系统。当表越来越多,占用空间越来越大时,会生成lbdata2、lbdata3、依次增加。在MySQL的数据目录下可以看到MySQL的默认表空间:

~]# ll -h /data/mysql/
total 121M
-rw-r-----. mysql mysql Oct : auto.cnf
-rw-r-----. mysql mysql Oct : ib_buffer_pool
-rw-r-----. mysql mysql 12M Oct : ibdata1 #这个文件就是默认的表空间文件,任何库的任何存储引擎类型为InnoDB的表都存储在这一文件中。

  也可以在MySQL中设置将使用InnoDB引擎的表存储在自己单独的表空间(包括数据文件和索引信息)中,存储路径在所属库的目录下,而不是在MySQL数据目录下。代码为 innodb_file_per_table=ON 。下面演示说明,设置路径如下:

~]# vim /usr/local/mysql/etc/my.cnf.d/service.cnf
[mysqld]
innodb_file_per_table=ON

  重启后在MySQL中查看:

mysql> SHOW GLOBAL VARIABLES LIKE 'innodb_file_per_table';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_file_per_table | ON |
+-----------------------+-------+
row in set (0.01 sec)

  创建一个新表:

mysql> CREATE TABLE tbl2(id INT,Name CHAR());

  查看默认库(mysql库)中的文件:

  tbl2.ibd就是表tbl2单独的表空间,tbl2.frm为表结构文件。若未启用 innodb_file_per_table=ON 则只有tbl2.frm文件。

3.InnoDB的特性:

1.InnoDB是一种事务型存储引擎,适用于对事务要求较高的场景中,但较适用于处理大量的短期事务(short-lived),若要处理大量长事务,可以选择Oracle。

2.InnoDB基于MVCC(Mutli Version Concurrency Control)多版本并发控制,支持高并发。

PS:所谓MVCC是指数据库管理系统常用的并发控制方法,用于提供对数据库的并发访问,并以编程语言实现事务内存。如果没有并发控制,如果用户A在用户B写入数据库的同时从数据库中读取数据,则用户A可能会看到写了一半或不完整的数据,也可能无法查看数据。这里所描述的多版本其实是指将原表做多个快照,在不同用户的不同访问时间点进行快照,因为每一个连接都是基于快照进行的,所以用户之间的访问互相不受影响,虽然这样的方式不能完全避免用户A读到和用户B修改后的数据,但能大大提高并发性。

3.支持四个隔离级别,默认为REPEATABLE-READ。

4.支持间隙锁防止幻读。

5.支持使用聚集索引,将数据和索引存储在同一处,找到索引便找到数据,从而提高性能,但每个表上只能有一个聚集索引。

6.支持自适应hash索引。

7.优秀的自动崩溃恢复特性。

4.InnoDB关键字

数据存储:表空间;
并发:MVCC,间隙锁,行级锁;
索引:聚集索引、辅助索引;
性能:预读操作、内存数据缓冲、内存索引缓存、自适应Hash索引、插入操作缓存区;
备份:支持热备;

5.MyISAM存储引擎

  在MySQL较老的版本(5.1以前),MyISAM是默认的存储引擎。MyISAM存储引擎不支持事务和行级锁,并且崩溃后无法安全恢复。尽管MyISAM有这么多短板缺点,但不代表他一无是处,对于制度的数据,或者表比较小、可忍受的修复操作,依然可以使用MyISAM。MyISAM存储引擎设计简单,数据已紧密格式存储,所以在某些场景下还是很好用的。但MyISAM最典型的的性能问题还是表级锁的问题。MyISAM存储引擎出常用在只读或读多写少、表较小的场景。

  MyISAM的特性:

1.支持加锁与并发访问控制。MyISAM的锁是表级别的,就是说MyISAM可对整张表加锁。读取时会对需要读到的所有表家共享锁,写入时则对表加排它锁。

2.支持修复功能。对于MyISAM表,MySQL可以手工或者自动执行检查和修复,但这里的修复和事务恢复以及崩溃恢复是不同的概念。

3.支持全文索引,非聚集索引。

4.表压缩功能。如果表在创建并导入数据后,不会再进行修改,那么这样的表就能使用MyISAM表压缩功能。这样可以减少磁盘空间占用以及减少磁盘I/O,从而提升查询性能。

6.MyISAM表创建示例

  进入MySQL创建存储引擎为MyISAM的表:

mysql> CREATE TABLE tbl3(id INT,Name CHAR()) Engine 'MyISAM'; 

  在数据库文件中可以看到用MyISAM创建的表的结构如下:

tbl_name.frm:表格式定义;
tbl_name.MYD:数据文件;
tbl_name.MYI:索引文件

MySQL中MyISAM和InnoDB两种主流存储引擎的特点的更多相关文章

  1. INNODB与MyISAM两种表存储引擎区别

    mysql数据库分类为INNODB为MyISAM两种表存储引擎了,两种各有优化在不同类型网站可能选择不同,下面小编为各位介绍mysql更改表引擎INNODB为MyISAM技巧. 常见的mysql表引擎 ...

  2. 【mysql中myisam和innodb的区别】

    单击进入源网页 要点摘要: 1.查看mysql存储引擎的状态mysql> show engines; 2.查看mysql默认的存储引擎mysql> show variables like ...

  3. MYSQL 中 MyISAM与InnoDB两者之间区别与选择,详细总结,性能对比

    1.MyISAM:默认表类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法.不 ...

  4. MySQL中myisam和innodb的主键索引有什么区别?

    MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址.下图是MyISAM索引的原理图: 这里设表一共有三列,假设我们以Col1为主键,则上图是一个MyISAM表的主索 ...

  5. MySQL中MyISAM与InnoDB区别及选择,mysql添加外键

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

  6. PHP开发必用的mysql那么你知道Mysql中MyISAM和InnoDB的区别吗?

    构成上的区别: 每个MyISAM在磁盘上存储成三个文件.第一个文件的名字以表的名字开始,扩展名指出文件类型. .frm文件存储表定义. 数据文件的扩展名为.MYD (MYData). 索引文件的扩展名 ...

  7. MySQL中MyISAM与InnoDB区别

    原文:https://blog.csdn.net/frycn/article/details/70158313?utm_source=copy InnoDB:支持事务处理等不加锁读取支持外键支持行锁不 ...

  8. MySQL中MyISAM与InnoDB区别及选择(转)

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

  9. MySQL中MyISAM与InnoDB区别及选择

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

随机推荐

  1. 【微信小程序开发】页面配置

    app下的app.json文件是全局配置. app下的每一个page中,也可以配置.json文件. page中配置的内容是对应app中window配置项下的内容. page中的配置将覆盖window中 ...

  2. 【微信小程序开发】全局配置

    今天看看小程序全局配置. 上一篇[微信小程序开发]秒懂,架构及框架 配置,无非就是为了增加框架的灵活性,而定下的规则. 微信小程序的配置文件是一个树状结构,各个节点代表不同的配置项,小程序框架会解析这 ...

  3. java动态生成验证码图片

    package cn.lijun.checkimg; import java.awt.image.BufferedImage;import java.io.BufferedReader; import ...

  4. 【转】linux 查看进程启动路径

    在linux下查看进程大家都会想到用 ps -ef|grep XXX可是看到的不是全路径,怎么看全路径呢?每个进程启动之后在 /proc下面有一个于pid对应的路径例如:ps -ef|grep pyt ...

  5. ABP框架系列之十一:(AspNet-Core-ASPNET核心)

    Introduction This document describes ASP.NET Core integration for ASP.NET Boilerplate framework. ASP ...

  6. boost--日期处理

    1.timer 不同于系统函数的timer()一般生成一个定时器,boost中的timer是一个计时器,以秒为单位,最小精度为毫秒,使用需要包含头文件"boost\timer.hpp&quo ...

  7. tabel表格的dom操作

    对table表格的操作比较麻烦,一直字符串的连接会比较麻烦 var nod = cwgk_msg_list.insertRow();//这个是上边获取过的dom元素,一般是tbody的元素,对元素进行 ...

  8. 用Rider写一个由Autofac管理资源的WebAPI应用程序

    一:步骤和上一篇创建控制台项目一样,不过这次选择的是.net core区域下的Asp.net web application,Type里选择Web API(Web API类似java里的SpringB ...

  9. 1131 Subway Map DFS解法 BFS回溯!

    In the big cities, the subway systems always look so complex to the visitors. To give you some sense ...

  10. UML系统建模的分析和应用

    一.基本信息 标题:UML系统建模的分析和应用 时间:2016 出版源:无线互联科技 领域分类:统一建模语言 二.研究背景 问题定义:统一建模语言的分析应用 难点:掌握和理解相关系统的业务环境,掌握良 ...