Mysql--08 存储引擎
一.存储引擎简介

- 1、文件系统:
- 1.1 操作系统组织和存取数据的一种机制。
- 1.2 文件系统是一种软件。
- 2、文件系统类型:ext2 3 4 ,xfs 数据
- 2.1 不管使用什么文件系统,数据内容不会变化
- 2.2 不同的是,存储空间、大小、速度。
- 3、MySQL引擎: 可以理解为,MySQL的“文件系统”,只不过功能更加强大。
- 4、MySQL引擎功能: 除了可以提供基本的存取功能,还有更多功能事务功能、锁定、备份和恢复、优化以及特殊功能
总之,存储引擎的各项特性就是为了保障数据库的安全和性能设计结构。
二.MySQL自带的存储引擎类型
MySQL 提供以下存储引擎:
01)InnoDB02)MyISAM
03)MEMORY
04)ARCHIVE
05)FEDERATED
06)EXAMPLE
07)BLACKHOLE
08)MERGE
09)NDBCLUSTER
10)CSV
还可以使用第三方存储引擎:
01)MySQL当中插件式的存储引擎类型
02)MySQL的两个分支
03)perconaDB
04)mariaDB
#查看当前MySQL支持的存储引擎类型
mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)
#查看innodb的表有哪些
mysql> select table_schema,table_name,engine from information_schema.tables where engine='innodb';
+--------------+----------------------+--------+
| table_schema | table_name | engine |
+--------------+----------------------+--------+
| mysql | innodb_index_stats | InnoDB |
| mysql | innodb_table_stats | InnoDB |
| mysql | slave_master_info | InnoDB |
| mysql | slave_relay_log_info | InnoDB |
| mysql | slave_worker_info | InnoDB |
+--------------+----------------------+--------+
20 rows in set (0.03 sec)
#查看myisam的表有哪些
mysql> select table_schema,table_name,engine from information_schema.tables where engine='myisam';
+--------------------+---------------------------+--------+
| table_schema | table_name | engine |
+--------------------+---------------------------+--------+
| information_schema | COLUMNS | MyISAM |
| information_schema | EVENTS | MyISAM |
| mysql | help_category | MyISAM |
| mysql | ndb_binlog_index | MyISAM |
+--------------------+---------------------------+--------+
33 rows in set (0.01 sec)
- 1、innodb和myisam的区别
物理上的区别:
#进入mysql目录
[root@db01~l]# cd /application/mysql/data/mysql
#myisam
[root@db01 mysql]# ll user.*
-rw-rw---- 1 mysql mysql 10684 Mar 6 2017 user.frm
-rw-rw---- 1 mysql mysql 960 Aug 14 01:15 user.MYD
-rw-rw---- 1 mysql mysql 2048 Aug 14 01:15 user.MYI
#进入word目录
[root@db01 world]# cd /application/mysql/data/world/
#innodb
[root@db01 world]# ll city.*
-rw-rw---- 1 mysql mysql 8710 Aug 14 16:23 city.frm
-rw-rw---- 1 mysql mysql 688128 Aug 14 16:23 city.ibd
- 2.innodb存储引擎的简介
在MySQL5.5版本之后,默认的存储引擎,提供高可靠性和高性能。
优点:
01)事务安全(遵从 ACID)
02)MVCC(Multi-Versioning Concurrency Control,多版本并发控制)
03)InnoDB 行级别锁定
04)Oracle 样式一致非锁定读取
05)表数据进行整理来优化基于主键的查询
06)支持外键引用完整性约束
07)大型数据卷上的最大性能
08)将对表的查询与不同存储引擎混合
09)出现故障后快速自动恢复
10)用于在内存中缓存数据和索引的缓冲区池

innodb核心特性
重点:
MVCC
事务
行级锁
热备份
Crash Safe Recovery(自动故障恢复)
- 3.查看存储引擎
1)使用 SELECT 确认会话存储引擎
#查询默认存储引擎
mysql> SELECT @@default_storage_engine;
+--------------------------+
| @@default_storage_engine |
+--------------------------+
| InnoDB |
+--------------------------+
1 row in set (0.00 sec)
2)使用 SHOW 确认每个表的存储引擎
#查看表的存储引擎
mysql> show create table city\G
*************************** 1. row ***************************
...
) ENGINE=InnoDB AUTO_INCREMENT=4080 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
mysql> show table status like 'city'\G
*************************** 1. row ***************************
Name: city
Engine: InnoDB
...
3)使用 INFORMATION_SCHEMA 确认每个表的存储引擎
#查看表的存储引擎
mysql> select table_name,engine from information_schema.tables where table_name='city' and table_schema='world'\G
*************************** 1. row ***************************
table_name: city
engine: InnoDB
1 row in set (0.00 sec)
- 4.存储引擎的设置
1)在启动配置文件中设置服务器存储引擎
#在配置文件的[mysqld]标签下添加/etc/my.cnf
[mysqld]
default-storage-engine=innodb
2)使用 SET 命令为当前客户机会话设置
#在MySQL命令行中临时设置
mysql> SET @@storage_engine=myisam;
Query OK, 0 rows affected, 1 warning (0.00 sec)
#查看
mysql> select @@default_storage_engine;
+--------------------------+
| @@default_storage_engine |
+--------------------------+
| MyISAM |
+--------------------------+
1 row in set (0.00 sec)
(3)在 CREATE TABLE 语句指定
#建表的时候指定存储引擎
create table t (i INT) engine = <Storage Engine>;
#如:建test1表,指定存储引擎为myisam
mysql> create table test1(id int) engine=myisam;
Query OK, 0 rows affected (0.02 sec)
三.真实企业案例
项目背景:
公司原有的架构:一个展示型的网站,LAMT,MySQL5.1.77版本(MYISAM),50M数据量。
小问题不断:
- 1、表级锁:对表中任意一行数据修改类操作时,整个表都会锁定,对其他行的操作都不能同时进行。
- 2、不支持故障自动恢复(CSR):当断电时有可能会出现数据损坏或丢失的问题。
如何解决:
- 1、提建议将现有的MYISAM引擎替换为Innodb,将版本替换为5.6.38
- 1)如果使用MYISAM会产生”小问题”,性能安全不能得到保证,使用innodb可以解决这个问题。
- 2)5.1.77版本对于innodb引擎支持不够完善,5.6.38版本对innodb支持非常完善了。
- 2、实施过程和注意要素
1)备份生产库数据(mysqldump)
[root@db01 test]# mysql -uroot -p1
mysql> show tables;
+----------------+
| Tables_in_test |
+----------------+
| student4 |
| tlbb2 |
+----------------+
2 rows in set (0.00 sec)
#测试环境(先简单创几个存储引擎为myisam)
mysql> create table test1(id int) engine=myisam;
Query OK, 0 rows affected (0.02 sec)
mysql> create table test2(id int) engine=myisam;;
Query OK, 0 rows affected (0.00 sec)
mysql> create table test3(id int) engine=myisam;;
Query OK, 0 rows affected (0.01 sec)
2)准备一个5.6.44版本的新数据库
#先导库,准备一个环境
[root@db01 test]# mysqldump -uroot -p1 -B test >/tmp/full.sql
3)对备份数据进行处理(将engine字段替换)
#方法一
[root@db01 ~]# sed -i 's#ENGINE=MyISAM#ENGINE=InnoDB#g' /tmp/full.sql
#方法二
[root@db01 ~]# vim /tmp/full.sql
:%s#MyISAM#InnoDB#g
4)将修改后的备份恢复到新库
#方法一
[root@db01 test]# mysql -uroot -p123 -h 10.0.0.52 < /tmp/full.sql
5)应用测试环境连接新库,测试所有功能
#连接
[root@db02 ~]# mysql -uroot -p123
#查看存储引擎
mysql> select @@default_storage_engine;
+--------------------------+
| @@default_storage_engine |
+--------------------------+
| InnoDB |
+--------------------------+
1 row in set (0.00 sec)
6)停应用,将备份之后的生产库发生的新变化,补偿到新库
7)应用割接到新数据库
项目结果:
*解决了”小问题” *
四.Innodb存储引擎——表空间介绍

5.5版本以后出现共享表空间概念
表空间的管理模式的出现是为了数据库的存储更容易扩展
5.6版本中默认的是独立表空间
- 1、共享表空间
1)查看共享表空间
#物理查看
[root@db01 ~]# ll /application/mysql/data/
-rw-rw---- 1 mysql mysql 79691776 Aug 14 16:23 ibdata1
#命令行查看
mysql> show variables like '%path%';
+-----------------------+------------------------------------+
| Variable_name | Value |
+-----------------------+------------------------------------+
| innodb_data_file_path | ibdata1:76M;ibdata2:50M:autoextend |
| ssl_capath | |
| ssl_crlpath | |
+-----------------------+------------------------------------+
3 rows in set (0.00 sec)
#查看大小
[root@db01 data]# du -sh ibdata1
76M ibdata1
5.6版本中默认存储:
1.系统数据
2.undo
3.临时表
5.7版本中默认会将undo和临时表独立出来,5.6版本也可以独立,只不过需要在初始化的时候进行配置
2)设置方法
#编辑配置文件
[root@db01 ~]# vim /etc/my.cnf
[mysqld]
innodb_data_file_path=ibdata1:50M;ibdata2:50M:autoextend
- 2、独立表空间
对于用户自主创建的表,会采用此种模式,每个表由一个独立的表空间进行管理
1)查看独立表空间
#物理查看
[root@db01 ~]# ll /application/mysql/data/world/
-rw-rw---- 1 mysql mysql 688128 Aug 14 16:23 city.ibd
#命令行查看
mysql> show variables like '%per_table%';
+-----------------------+-------+
| Variable_name | Value |
+-----------------------+-------+
| innodb_file_per_table | ON |
+-----------------------+-------+
1 row in set (0.01 sec)
企业案例
在没有备份数据的情况下,突然断电导致表损坏,打不开数据库。
1)拷贝库目录到新库中(先准备一个和原表结构一样的环境)
[root@db01 data]# tar zcf world1.tgz world/
#传到测试环境
[root@db01 data]# scp world1.tgz 172.16.1.52:/application/mysql/data/
#解压
[root@db02 data]# tar xf world1.tgz
2)启动新数据库
[root@db01 ~]# mysqld_safe --defaults-file=/data/3307/my.cnf &
3)登陆数据库查看r
#查看
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| test |
| world |
+--------------------+
5 rows in set (0.00 sec)
4)查询表中数据
mysql> select * from city;
ERROR 1146 (42S02): Table 'world.city' doesn't exist (表不存在)
5)找到以前的表结构在新库中创建表
mysql> show create table world.city;
#删掉外键创建语句
CREATE TABLE `city1` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`Name` char(35) NOT NULL DEFAULT '',
`CountryCode` char(3) NOT NULL DEFAULT '',
`District` char(20) NOT NULL DEFAULT '',
`Population` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`),
KEY `CountryCode` (`CountryCode`)
#CONSTRAINT `city_ibfk_1` FOREIGN KEY (`CountryCode`) REFERENCES `country` (`Code`)
) ENGINE=InnoDB AUTO_INCREMENT=4080 DEFAULT CHARSET=latin1;
6)删除表空间文件
#删除表空间文件
mysql> alter table city1 discard tablespace;
#在表的物理结构查看
[root@db02 world]# ll
total 1000
-rw-rw---- 1 mysql mysql 8710 Nov 4 10:26 city1.frm
-rw-rw---- 1 mysql mysql 8710 Nov 4 10:26 city.frm
-rw-rw---- 1 mysql mysql 589824 Nov 4 10:26 city.ibd
7)拷贝旧表空间文件
[root@db02 world1]# cp city.ibd city1.ibd
8)授权
[root@db01 world]# chown -R mysql.mysql *
9)导入表空间
#查看,会报错
mysql> select * from city1;
#导入表空间
mysql> alter table city_new import tablespace;
#再次查看
mysql> select * from city1;
- 改表名
#改表名
mysql> alter table city1 rename city;
#再次查看
mysql> show tables;
+------------------+
| Tables_in_world1 |
+------------------+
| city |
| country |
| countrylanguage |
+------------------+
3 rows in set (0.00 sec)
Mysql--08 存储引擎的更多相关文章
- MYSQL的存储引擎一般只要哪些?
根据个人个人见解: MySQL的存储引擎(构成.安全.锁) Myisam:数据操作快速的一种引擎,支持全文检索.文件保存在数据库名称为目录名的 目录中,有3个文件,分别是表定义文件(.frm).数据文 ...
- MySQL常用存储引擎及如何选择
一.MySQL的存储引擎 完整的引擎说明还是看官方文档:http://dev.mysql.com/doc/refman/5.6/en/storage-engines.html 这里介绍一些主要的引擎 ...
- mysql 的存储引擎介绍
在数据库中存的就是一张张有着千丝万缕关系的表,所以表设计的好坏,将直接影响着整个数据库.而在设计表的时候,我们都会关注一个问题,使用什么存储引擎.等一下,存储引擎?什么是存储引擎? 什么是存储引擎? ...
- mysql数据库存储引擎及区别
MySQL有多种存储引擎,每种存储引擎有各自的优缺点,可以择优选择使用:MyISAM.InnoDB.MERGE.MEMORY(HEAP).BDB(BerkeleyDB).EXAMPLE.FEDERAT ...
- mysql之存储引擎和文件配置
(查看系统服务,在运行里输入services.msc) 补充:将mysql做成系统服务:mysqld --install 取消:mysqld --romove 在服务中可以直接鼠标操作mysql服务的 ...
- MySQL数据库----存储引擎
什么是存储引擎? 存储引擎说白了就是如何存储数据.如何为存储的数据建立索引和如何更新.查询数据等技术的实现方法.因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操 ...
- MySql的存储引擎介绍
下面主要介绍InnoDB.MyISAM和MEMEORY三种存储引擎. InnoDB存储引擎 InnoDB遵循CNU通用公开许可(GPL)发行.InnoDB已经被一些重量级互联网公司所采用,如雅虎.Sl ...
- MySQL之存储引擎(表类型)的选择
和大部分的数据库不同,MySQL中有一个存储引擎的概念,用户可以根据数据存储的需求来选择不同的存储引擎.本次博客就来介绍一下MySQL中的存储引擎.MySQL版本 5.7.19. 概述 MySQL的存 ...
- MySql中存储引擎MyISAM与InnoDB区别于选择
InnoDB: 支持事务处理等 不加锁读取 支持外键 支持行锁 不支持FULLTEXT类型的索引 不保存表的具体行数,扫描表来计算有多少行 DELETE 表时,是一行一行的删除 InnoDB 把数据和 ...
- MySQL常用存储引擎功能与用法详解
本文实例讲述了MySQL常用存储引擎功能与用法. MySQL存储引擎主要有两大类: 1. 事务安全表:InnoDB.BDB. 2. 非事务安全表:MyISAM.MEMORY.MERGE.EXAMPLE ...
随机推荐
- 22.Express框架——2019年12月19日
2019年12月19日14:16:36 1. express简介 1.1 介绍 Express框架是后台的Node框架,所以和jQuery.zepto.yui.bootstrap都不一个东西. Exp ...
- 演示Git使用
对于新建的repository,第一次提交,完整过程: 13643@DESKTOP-K6CS6SE MINGW64 ~/Desktop/555 $ ls Readme.md run.py 13643@ ...
- kafka消费组、消费者
consumer group consumer instance 一个消费组可能有一个或者多个消费者.同一个消费组可以订阅一个或者多个主题.主题的某一个分区只能被消费组的某一个消费者消费.那么分区和消 ...
- MapGISK9安装
数据下载 单击SQL-->单击显示SQL语句 单击确定,提示不可识别符号,给字段添加''
- 动态规划 List
例题 #A 传纸条(Accepted) #B 乘积最大 (Unaccepted) #C 石子合并 (Accepted) #D 加分二叉树 (Unaccepted) #E 没有上 ...
- 在getview方法中有三个参数,起到优化的部分为ViewHolder的使用,主要方法setTag(),getTag()
适配器代码如下: public class Myadapter extends BaseAdapter { List<String> date; Context context; //构造 ...
- scau 1142 巡逻的士兵(分治)
1142 巡逻的士兵 时间限制:1000MS 内存限制:65536K 提交次数:217 通过次数:58 题型: 编程题 语言: G++;GCC Description 有N个士兵站成一队列, 现 ...
- php面试专题---16、MySQL创建高性能索引考点
php面试专题---16.MySQL创建高性能索引考点 一.总结 一句话总结: 注意:只写精品 1.索引的基础? 类似书籍的目录:索引类似于书籍的目录,要想找到一本书的某个特定主题,需要先查找书的目录 ...
- 相同name,取最小的id的值,mysql根据相同字段 更新其它字段
id name info1 a 1232 a 2353 a 1244 b 125 b 987相同name,取最小的id的值id name info1 a 1232 a 1233 a 1234 b 12 ...
- WPF样式统一之DevExpress设置窗体,控件为Office风格
DevExpress相信不少人用过,虽然人家不是免费的,但是用过的应该都知道,确实是花了心血的C#插件,下面来介绍下在DevExpress下如何统一设置自己的WPF程序为经典Windows风格. 窗体 ...