存储引擎介绍

Mysql中的数据用各种不同的技术存储在文件中,这些技术中的每一种技术都使用不同的存储机制,索引技巧,锁定水平。并且最终提供广泛的不同的功能和能力。通过选则不同的技术,能够获得额外的速度或者功能,从而改善应用的整体功能,这些不同的技术以及配套的相关功能在mysql中被称作存储引擎

在熟悉存储引擎之前,先来了解mysql的体系结构:

1)Connectors:连接组件,相当于驱动,针对不同的语言会有不同的驱动,例如针对PHP要安装php驱动。驱动要到mysql官网上去找,衔接mysql与开发语言的桥梁

2)Connection  pool :连接池组件,mysql为了加大前台请求进程与后台服务的连接,相当于客服,为了用户体验不止一个组件

3)Enterprise Management Service&Utilities:管理服务和控制组件,

4)SQL Interface:SQL接口组件,支持服务进行各种增,删,改,查操作

5)Parser:查询分析器组件,支持进行各种条件查询,比如升降序查询

6)Optimizer:优化器组件

7)Caches&Buffers:缓存组件

8)Pluggable Storage Engines:插件式存储引擎,支持热插拔(即插即用)

9)File System:文件系统

10)File&Logs:存储文件和日志

Mysql存储引擎MyISAM和InnoDB_第1张图片

Mysql系统中,存储引擎处于文件系统之上,在数据保存到数据文件之前会先传输到存储引擎,然后按照各个存储引擎的存储格式进行数据存储。使用这种存储引擎的优点在于,仅仅需要提供特殊应用所需的特性即可;数据库中的系统开销最小;具有更有效和更高效的数据库性能

Mysql存储引擎MyISAM和InnoDB_第2张图片


MyISAM的特点及介绍

MyISAM   MYSQL5.5以前支持的默认存储引擎

1)查询频率较高的场合:商城网站

2)不支持事务


3)表锁定   读取与写入互阻塞


Mysql存储引擎MyISAM和InnoDB_第3张图片 

Mysql存储引擎MyISAM和InnoDB_第4张图片

Mysql存储引擎MyISAM和InnoDB_第5张图片

 Mysql存储引擎MyISAM和InnoDB_第6张图片

InnoDB特点及介绍

InnoDB存储引擎不同于MyISAM存储引擎,InnoDB  mysql5.7默认支持存储引擎

Mysql存储引擎MyISAM和InnoDB_第7张图片

 

Mysql存储引擎MyISAM和InnoDB_第8张图片

 

Mysql存储引擎MyISAM和InnoDB_第9张图片










查看数据库可配置的存储引擎类型

使用show engines;可以查看Mysql默认使用的存储引擎,以及系统支持的其他存储引擎

mysql> show engines;


+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
8 rows in set (0.01 sec)

可看到默认使用的存储引擎为InnoDB

查看表正在使用的存储引擎

1)使用show table status命令可以查看表正在使用的存储引擎,

show table status from 库名where name='表名';

mysql> show table status from abc where name='info';


+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time | Check_time | Collation       | Checksum | Create_options | Comment |
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
| info | InnoDB |      10 | Compact    |    1 |          16384 |       16384 |               0 |            0 |  10485760 |           NULL | 2018-09-07 14:33:07 | NULL        | NULL       | utf8_general_ci |     NULL |                |         |
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+
1 row in set (0.00 sec)

可看到info表使用的存储引擎为InnoDB

2)使用show create命令也可以查看表正在使用的存储引擎

use 库名;     //先进入数据库

show create table 表名;

mysql> use abc;
Database changed

mysql> show create table info;


+-------+------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                           |
+-------+------------------------------------------------------------------------------------------------------------------------+
| info  | CREATE TABLE `info` (
  `id` int(11) DEFAULT NULL,
  `name` char(18) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

配置存储引擎为所需要的类型

Mysql存储引擎MyISAM和InnoDB_第10张图片

(1)使用alter table命令修改

alter table 表名 engine=存储引擎

mysql> alter table info engine=MyISAM;


Query OK, 1 row affected (0.02 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql> show create table info;
+-------+------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                           |
+-------+------------------------------------------------------------------------------------------------------------------------+
| info  | CREATE TABLE `info` (
  `id` int(11) DEFAULT NULL,
  `name` char(18) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
+-------+------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

(2)修改Mysql的配置文件my.cnf,可以指定default-storage-engine选项设置默认的存储引擎

vim /etc/my.cnf

//省略内容

[mysqld]

default-storage-engine=MyISAM

//省略内容

这里指定默认存储引擎是MyISAM,需要重新启动Mysql服务器,

以后创建的新表存储引擎就会改变,但是之前创建的表的存储引擎不会改变。

mysql> create table xinxi(id int ,score decimal(5,2));


Query OK, 0 rows affected (0.03 sec)

mysql> show create table xinxi;
+-------+------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                 |
+-------+------------------------------------------------------------------------------------------------------------------------------+
| xinxi | CREATE TABLE `xinxi` (
  `id` int(11) DEFAULT NULL,
  `score` decimal(5,2) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
+-------+------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

(3)使用create table创建表时用engine指定存储引擎,会使用指定的存储引擎。现在数据库的默认引擎是MyISAM,但创建新表时指定使用InnoDB,则新表的存储引擎就是InnoDB

mysql> create table family(name char(10),chengwei char(10)) engine=InnoDB;


Query OK, 0 rows affected (0.07 sec)

mysql> show create table family;
+--------+---------------------------------------------------------------------------------------------------------------------------------+
| Table  | Create Table                                                                                                                    |
+--------+---------------------------------------------------------------------------------------------------------------------------------+
| family | CREATE TABLE `family` (
  `name` char(10) DEFAULT NULL,
  `chengwei` char(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+--------+---------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

(4)批量修改多个表的存储引擎

mysql5.5版本之前(包括5.5)有这个命令,可以这样操作。mysql5.7以后就不能这么操作了

mysql_convert_table_format --user=root --password=密码 --socket=/路径/mysql.sock --engine=引擎 库名 表名

mysql_convert_table_format --user=root --password=abc123 --socket=/home/mysql/mysql.sock --engine=MyISAM test family info

老版本5.5默认存储引擎为MyISAM 若要批量修改为InnoDB 则需修改命令本身的代码

具体步骤如下:

yum install perl-DBI -y

yum install perl-DBD-MySQL -y

vim /usr/local/mysql/bin/mysql_convert_table_format         //修改

//32行修改(修改后的内容为带加粗的部分)

"e|engine|type=s" => $opt_engine   

 

mysql_convert_table_format --user=root --password=abc123 --socket=/home/mysql/mysql.sock --engine=InnoDB test family info