MySQL存储引擎
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL存储引擎相关的知识,希望对你有一定的参考价值。
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=存储引擎
[[email protected] ~] vim /etc/my.cnf
[mysqld]
default-storage-engine=MyISAM
[[email protected] ~] 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版本有)
#在修改前先安装下列三个工具包
[[email protected] bin] yum install perl-DBD-MySQL -y
[[email protected] bin] yum install mysal-DBI -y
[[email protected] bin] yum install perl-DBI -y
[[email protected] bin] mysql_convert_table_format --host=localhost --user=root --password=123123 --socket=/tmp/mysql.sock --engine=InnoDB cilent user info
以上是关于MySQL存储引擎的主要内容,如果未能解决你的问题,请参考以下文章