Mysql存储引擎

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql存储引擎相关的知识,希望对你有一定的参考价值。

mysql存储引擎

存储引擎介绍

Mysql中的数据用各种不同的技术存储在文件(或者内存)中。这些不同的技术以及配套的相关功能在Mysql中被称作存储引擎。

Mysql提供了多个不同的存储引擎,可以预先设置或者在Mysql服务器中启用。根据实际需要还可以分别选择使用于服务器、数据库或者表格的存储引擎,以便在后续检索这些信息等操作过程中提供最大的灵活性。这里主要讲两种最为知名的存储引擎MyISAM和InnoDB。

MyISAM存储引擎

MyISAM存储引擎是Mysql关系数据库系统5.5版本之前默认的存储引擎。MyISAM主要有以下特点:

1、不支持事务,只能管理非事务表。

2、表级锁定形式,数据在更新时锁定整个表。

3、数据库在读写过程中相互阻塞。

4、可以通过key_buffer_size来设置缓存索引,提高访问的性能,减少磁盘IO的压力。

5、采用MyISAM存储引擎进行数据单独写入或读取,速度较快且占用资源相对较少。

6、MyISAM存储引擎不支持外键约束,只支持全文索引。

7、每个MyISAM在磁盘上存储成三个文件:.frm文件存储表定义、.MYD存储数据文件、.MYI存储索引文件。

适用场景

1、公司业务不需要事务的支持。

2、一般单方面读取数据比较多的业务,或者单方面写入数据比较多的业务,以及使用读写并发访问相对较低的业务。

3、以读为主的业务,如ww,blog图片信息数据库、用户数据库、商品库等业务。

4、对数据业务一致性要求不是非常高的业务。

5、服务器硬件资源相对比较差。

InnoDB存储引擎

InnoDB存储引擎不同于MyISAM存储引擎,能够支持事务,具有提交、回滚和崩溃恢复的能力,同时也是为巨大数据量时的最大性能而设计的。主要有以下特点:

1、支持事务,支持四个事务隔离级别。

2、行级锁定,但是全表扫描仍然会是表级锁定(这种情况比较少)。

3、读写阻塞与事务隔离级别相关。

4、具有非常高效的缓存特性,能够缓存索引,也能缓存数据。

5、表与主键以簇的方式存储。

6、支持分区、表空间,类似Oracle数据库。

7、支持外键约束,Mysql 5.5以前不支持全文索引,5.5版本以后支持。

8、适合硬件资源要求比较高的场合。

适用场景

1、公司业务需要事务的支持。

2、行级锁定对高并发有较好的适应能力,但是需要确保查询是通过索引完成。

3、业务数据更新较为频繁的场景,如论坛、微博等。

4、业务数据一致性要求比较高,例如银行业务。

5、硬件设备内存大,利用InnoDB较好的缓存能力来提高内存利用率,减少磁盘IO的压力。

配置合适的存储引擎

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

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       |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)

mysql> 

由于我是用的Mysql 5.7版本,所以默认的存储引擎是InnoDB。

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

1、使用show table status可以查看表正在使用的存储的引擎。

mysql> show table status from test where name=‘yx‘;
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+---------+
| 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 |
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+---------+
| yx   | InnoDB |      10 | Dynamic    |    6 |           2730 |       16384 |               0 |            0 |         0 |           NULL | 2018-07-03 22:36:46 | 2018-07-03 22:39:35 | NULL       | utf8_general_ci |     NULL |                |         |
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+---------+
1 row in set (0.00 sec)

可以看到yx表使用的存储引擎是InnoDB。

2、使用show create 也可查看正在使用的存储引擎。

mysql> show create table yx;
+-------+------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                 |
+-------+------------------------------------------------------------------------------------------------------------------------------+
| yx    | CREATE TABLE "yx" (
  "name" char(10) DEFAULT NULL,
  "score" decimal(5,2) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

配置存储引擎为所选择的类型

当需要选择非默认的存储引擎时,修改的方法主要介绍三种。

1、当表已经创建好后修改该表的存储引擎,使用alter table命令。

mysql> show create table yx;
+-------+------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                 |
+-------+------------------------------------------------------------------------------------------------------------------------------+
| yx    | CREATE TABLE "yx" (
  "name" char(10) DEFAULT NULL,
  "score" decimal(5,2) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> alter table yx engine=MyISAM;
Query OK, 6 rows affected (0.80 sec)
Records: 6  Duplicates: 0  Warnings: 0

mysql> show create table yx;
+-------+------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                 |
+-------+------------------------------------------------------------------------------------------------------------------------------+
| yx    | CREATE TABLE "yx" (
  "name" char(10) DEFAULT NULL,
  "score" decimal(5,2) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
+-------+------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

可以看到已经修改成功。

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

[[email protected] ~]# vim /etc/my.cnf
[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
log-bin=mysql-bin
default-storage-engine=MyISAM
character_set_server=utf8

[[email protected] ~]# systemctl restart mysqld.service 
mysql> use test;
Database changed
mysql> create table test01(name varchar(10),score decimal(5,2));
Query OK, 0 rows affected (0.00 sec)
mysql> show create table test01;
+--------+-------------------------------------------------------------------------------------------------------------------------------------+
| Table  | Create Table                                                                                                                        |
+--------+-------------------------------------------------------------------------------------------------------------------------------------+
| test01 | CREATE TABLE "test01" (
  "name" varchar(10) DEFAULT NULL,
  "score" decimal(5,2) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
+--------+-------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

修改完后,到数据库中,在创建一张新表,查看表的存储引擎类型已经修改成MyISAM。

3、使用create table创建表时用engine来指定存储引擎。

mysql> create table tset02(id int) engine=InnoDB;
Query OK, 0 rows affected (0.03 sec)

mysql> show create table tset02;
+--------+------------------------------------------------------------------------------------------+
| Table  | Create Table                                                                             |
+--------+------------------------------------------------------------------------------------------+
| tset02 | CREATE TABLE "tset02" (
  "id" int(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+--------+------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

因为之前修改了配置文件,所以创建新的表默认的存储引擎是MyISAM,所以指定为InnoDB,可以看到修改成功。

以上是关于Mysql存储引擎的主要内容,如果未能解决你的问题,请参考以下文章

使用Merge存储引擎实现MySQL分表

使用Merge存储引擎实现MySQL分表

MySQL中innodb引擎分析(初始化)

MySQL视图存储过程与存储引擎

(转)Mysql存储引擎__笔记

查看和修改MySQL数据库表存储引擎