MySQL存储引擎

在熟悉存储引擎之前先了解MySQL的体系结构

1 Connectors指的是不同语言中与SQL的交互

2 Management Serveices & Utilities: 系统管理和控制工具

3 Connection Pool: 连接池。

管理缓冲用户连接,线程处理等需要缓存的需求

4 SQL Interface: SQL接口。

接受用户的SQL命令,并且返回用户需要查询的结果。比如select from就是调用SQL Interface

5 Parser: 解析器。

SQL命令传递到解析器的时候会被解析器验证和解析。解析器是由Lex和YACC实现的,是一个很长的脚本。

主要功能:

a . 将SQL语句分解成数据结构,并将这个结构传递到后续步骤,以后SQL语句的传递和处理就是基于这个结构的 

b.  如果在分解构成中遇到错误,那么就说明这个sql语句是不合理的

6 Optimizer: 查询优化器。

SQL语句在查询之前会使用查询优化器对查询进行优化。他使用的是“选取-投影-联接”策略进行查询。

用一个例子就可以理解: select uid,name from user where gender = 1;

这个select 查询先根据where 语句进行选取,而不是先将表全部查询出来以后再进行gender过滤

这个select查询先根据uid和name进行属性投影,而不是将属性全部取出以后再进行过滤

将这两个查询条件联接起来生成最终查询结果

7 Cache和Buffer: 查询缓存。

如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。

这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等

8 Engine :存储引擎。

存储引擎是MySql中具体的与文件打交道的子系统。也是Mysql最具有特色的一个地方。

Mysql的存储引擎是插件式的。它根据MySql AB公司提供的文件访问层的一个抽象接口来定制一种文件访问机制(这种访问机制就叫存储引擎)

现在有很多种存储引擎,各个存储引擎的优势各不一样,最常用的MyISAM,InnoDB,BDB

默认下MySql是使用MyISAM引擎,它查询速度快,有较好的索引优化和数据压缩技术。但是它不支持事务。

InnoDB支持事务,并且提供行级的锁定,应用也相当广泛。 Mysql也支持自己定制存储引擎,甚至一个库中不同的表使用不同的存储引擎,这些都是允许的。

MyISAM的优点

  • 速度快,磁盘空间占用少;
  • 某个库或表的磁盘占用情况既可以通过操作系统查相应的文件(夹)的大小得知,也可以通过SQL语句SHOW TABLE STATUS查得

InnoDB的优点

  • 支持事务
  • 行级锁定,更新时锁定行.要是全表扫描.也是全表锁.所以建索引非常重要
  • 具有高效的缓存特点.可以缓存索引和数据
  • 支持分区,表空间
  • 支持外键约束.
  • 5.5版本以后支持全文索引
  • 对硬件资源要求相比myisam引擎更高.

查看存储的命令

1:不进入数据库查看
mysql> show table status from cilent where name='user';
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+---------+
| 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 |
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+---------+
| user | InnoDB |      10 | Dynamic    |    2 |           8192 |       16384 |               0 |            0 |         0 |           NULL | 2018-07-03 17:09:14 | 2018-07-03 17:10:28 | NULL       | utf8_general_ci |     NULL |                |         |
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+---------+
1 row in set (0.03 sec)

上面表格中‘Name对应的是user表名,Engine对应的是InnoDB的存储引擎,Version对应的是版本’上下是一一对应的我这边用的是5.7版本

进入数据库查看

mysql> show create table user;
+-------+-----------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                |
+-------+-----------------------------------------------------------------------------------------------------------------------------+
| user  | CREATE TABLE "user" (
  "name" varchar(10) DEFAULT NULL,
  "sroce" int(5) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |
+-------+-----------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

修改存储引擎的几种方式

1:alter table 表名 engine=存储引擎(对已经存在的表进行修改)

mysql> alter table user engine=MyISAM;
Query OK, 2 rows affected (0.03 sec)
Records: 2  Duplicates: 0  Warnings: 0
mysql> show create table user;
+-------+-----------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                |
+-------+-----------------------------------------------------------------------------------------------------------------------------+
| user  | CREATE TABLE "user" (
  "name" varchar(10) DEFAULT NULL,
  "sroce" int(5) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
+-------+-----------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

2:在my.cnf配置文件里面修改加入(新创建表时默认的存储引擎就是配置文件里面修改的那个)

  • default-storage-engine=存储引擎
[root@localhost ~] vim /etc/my.cnf
[mysqld]
default-storage-engine=MyISAM
[root@localhost ~] systemctl restart mysqld.service  #改完配置文件重启服务
#下面直接创建表默认的存储引擎就是配置文件里的那个
mysql> create table infos (id int);
Query OK, 0 rows affected (0.00 sec)
mysql> show create table infos;
+-------+-----------------------------------------------------------------------------------------+
| Table | Create Table                                                                            |
+-------+-----------------------------------------------------------------------------------------+
| infos | CREATE TABLE "infos" (
  "id" int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
+-------+-----------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

3:create table 表名 engine=存储引擎(创建表的时候选择)

mysql> create table info (id int) engine=MyISAM;
Query OK, 0 rows affected (0.00 sec)
mysql> show create table info;
+-------+----------------------------------------------------------------------------------------+
| Table | Create Table                                                                           |
+-------+----------------------------------------------------------------------------------------+
| info  | CREATE TABLE "info" (
  "id" int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
+-------+----------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

4:mysql_convert_table_format --host=那台主机登录 --user=用户 --password=密码 --socket=/tmp/mysql.sock --engine=InnoDB 数据库 表名(多个表格同时修改存储引擎)

(上面这条命令在5.7版本是没有只有在5.5版本有)

#在修改前先安装下列三个工具包
[root@localhost bin] yum install perl-DBD-MySQL -y
[root@localhost bin] yum install mysal-DBI -y
[root@localhost bin] yum install perl-DBI -y
[root@localhost bin] mysql_convert_table_format --host=localhost --user=root --password=123123 --socket=/tmp/mysql.sock --engine=InnoDB cilent user info