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存储引擎的主要内容,如果未能解决你的问题,请参考以下文章