您的位置:首页 > 数据库 > MySQL

Mysql存储引擎MyISAM和InnoDB

2018-09-09 10:40 591 查看

存储引擎介绍

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的特点及介绍

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

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

2)不支持事务

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













InnoDB特点及介绍

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













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

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

mysql> show engines;

+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine  
27e4
; | 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)

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




(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 |
+-------+-------------
5b4
-----------------------------------------------------------------------------------------------------------+
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
5b4
|
+-------+------------------------------------------------------------------------------------------------------------------------------+
| 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 &nb
3eac
sp; |
+--------+---------------------------------------------------------------------------------------------------------------------------------+
| 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  系统 运维 Linux