存储引擎是MySQL的特点,是一种插入式的存储引擎的概念。
MySQL中提到的存储引擎,通俗点讲指的是表的类型,不同类型的存储引擎决定了表在计算机中独有的存储方式,用户可以根据自己不同的要求,选择不同的存储方式。
下面介绍MySQL常见的存储引擎
1. InnoDB存储引擎 - - - MySQL默认事务型引擎,使用最广泛的存储引擎
我们首先来看一下InnoDB存储引擎下数据库的文件类型。
.opt 用来存储当前数据库的默认字符集和字符校验规则。
.frm 存储表的数据结构
.ibd InnoDB中特有的,存储索引和数据
优点
1.支持事务,具有良好的事务管理能力。
2.具有奔溃修复能力。
3.支持高并发,实现了四个标准的隔离级别。
4.支持自动增长列auto_increment。
5.InnoDB是MySQL上第一个提供外键约束的表引擎。
6.支持从磁盘读取数据时采用的可预测性预读,能够自动在内存中创建hash索引以加速读操作的自适应哈希索引(adaptive hash index),以及能够加速插入操作的插入缓冲区(insert buffer)。
缺点
1.读写效率稍差。
2.占用的数据空间相对较大。
2. MyISAM存储引擎 - - - MySQL5.1及之前的版本默认的存储引擎
.opt 用来存储当前数据库的默认字符集和字符校验规则。
.frm 存储表的数据结构
.MYD MyISAM特有的存储索引
.MYI MyISAM特有的存储数据
优点
1.占用空间小,处理速度快。
2.提供了大量的特性,包括全文索引、压缩、空间函数等。
3.支持对整张表加锁,并发插入。
4.MyISAM表是变长行。可通过修改表的max_rows 和 avg_row_length 选项的值来实现。
在读取时会对需要用到的所有表加共享锁;
写入时则对表加排他锁;
在表同时有读取查询时,也可以往表中插入新的记录(并发插入)
4.支持延迟更新索引键(delayed Key Writer)。
创建MyISAM表时,如果自行指定了delay_key_writer选项,在每次执行修改完成时,不会立即将修改的索引数据写入磁盘中,而是会写到内存中的键缓冲区,只有在清理键缓冲区或者关闭表的时候才会将对应的索引块写入到磁盘。
延迟更新索引键的特性,可以给全局设置,也可为单个表设置。
5.可以使用myisampack对MyISAM表进行压缩。
压缩表是不能再进行修改的,可以极大的减小磁盘的空间占用,减少了磁盘I/O,从而提升了查询性能。
压缩表虽然支持索引,但索引也只是所读的。
缺点
1.不支持事务的完整性。
2.不支持并发性。
3. MEMORY存储引擎 - - - 之前称做HEAP表
使用存储在内存中的内容来创建表,而且所有的数据也存放再内存中,不需要进行磁盘I/O。Memory表的结构在重启后可以保存,但数据会丢失。表的大小取决于max_rows 和max_heap_table_size。max_rows可以在创建表是指定,max_heap_table_size的大小默认16MB,可以按需进行扩大。
Memory表 - - 利用情景
1.用于查找或者映射,例如将邮编和省名的映射表。
2.用于缓存周期性聚合数据的结果。
3.用于保存数据分析中产生的中间数据。
优点
支持hash索引,处理速度快。
缺点
1.Memory表是表级锁,并发写入的性能较低。
2.不支持BLOB / TEXT类型的列,每行的长度是固定的。
3.数据易丢失,生命周期短。
Memory表和临时表的区别 ?
临时表是指使用 create temporary table 语句创建的表,它可以使用任何存储引擎,临时表只在单个链接中可见,当连接断开时,临时表也将不复存在。
MySQL在执行查询操作过程中需要使用临时表来保存中间结果,内部使用的临时表就是Memory表。
如果中间结果太大超出了Memory表限制,或者含有BLOB / TEXT类型的列,则临时表会转换成MyISAM表。
存储引擎的选择
每种存储引擎都有各自的优势,我们应该根据自己的项目选择合适的存储引擎。
?下图是一些建议,希望可以对你有帮助。?
查看存储引擎的mysql命令
1.查看全局的存储引擎
- Engine 表示存储引擎的名称。
- Support 说明MySQL是否支持该类型的索引。
- Comment 对该引擎的评论。
- Transactions 表示是否支持事务处理。
- Savepoints 是否可以设置保存存点,一遍事务回滚到保存点。
mysql> show engines\G
//结果有多个 代码指粘贴了第一个
************************ 1. row ***************************
Engine: InnoDB
Support: DEFAULT
Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
XA: YES
Savepoints: YES
**********************************************************
2.查看数据库默认的存储引擎
- Variable_name 表示存储引擎名称。
- Value 表示MySQL的支持情况。
- DISABLED 表示支持但没开启。
mysql> show variables like 'have%';
+------------------------+----------+
| Variable_name | Value |
+------------------------+----------+
| have_compress | YES |
| have_crypt | NO |
| have_dynamic_loading | YES |
| have_geometry | YES |
| have_openssl | DISABLED |
| have_profiling | YES |
| have_query_cache | YES |
| have_rtree_keys | YES |
| have_ssl | DISABLED |
| have_statement_timeout | YES |
| have_symlink | YES |
+------------------------+----------+
3.查看表的存储引擎。切记你要先进到相应的数据库中才能查看表的存储引擎!!!
我查的是user表,你需要将user所在位置改成你想要查询的表名。
下面来详细介绍一下参数。
- Name 表名。
- Engine 表的存储引擎类型。
- Row_forma 行的格式。
对于MyISAM表,可选的值为
Dynamic 行的长度是可变的,一般包含可变长度的字段,如varchar / BOLB
Fixed 行的长度是固定的,只包含固定长度的列,如char / integer
Compressed 只在压缩表中存在
- Rows 表中的行数 – 除了对InnoDB该值是估计值,其余引擎都是精确值。。
- Avg_row_length 平均每行包含的字节数。
- Data_length 表的数据大小(以字节为单位)。
- Max_data_length 表数据的最大容量。
- Index_length索引的大小(以字节为单位)。
- Data_free 对于MyISAM表,表示已分配但目前没有使用的空间,这部分空间包括之前删除的行,以及后序可以被insert利用到的空间。
- Auto_increment 下一个Auto_increment的值。
- Create_time 表的创建时间。
- Update_time 表数据的最后修改时间。
- Check_time 使用check table命令或者myisamchk工具最后一次检查表的时间。
- Collation 表的默认字符集和字符排列规则。
- Checksum 如果启用,保存的是整个表的实时校验和。
- Create_options 创建表时指定的其他选项。
- Comment 表的其他额外信息
InnoDB表 保存的是InnoDB表空间的剩余空间信息
MyISAM表 保存的是表在创建时带的注释
如果是一个视图,则该列包含 "VIEW" 的文本字样
mysql> show table status like 'user'\G
//结果
*************************** 1. row ***************************
Name: user
Engine: InnoDB
Version: 10
Row_format: Dynamic
Rows: 8
Avg_row_length: 2048
Data_length: 16384
Max_data_length: 0
Index_length: 0
Data_free: 0
Auto_increment: 30
Create_time: 2019-07-27 15:21:44
Update_time: 2019-08-03 15:20:37
Check_time: NULL
Collation: utf8_general_ci
Checksum: NULL
Create_options:
Comment:
如何修改存储引擎
1.在创建表的时候修改ENGINE。
CREATE TABLE `user_myi` (
`id` int(11) DEFAULT NULL,
`name` varchar(10) CHARACTER SET utf8 DEFAULT NULL,
`password` varchar(10) DEFAULT NULL
) ENGINE=MyIsam;
2.用SQL语句修改表的引擎
alter table user_myi engine=InnoDB;
3.修改配置文件里的信息
1.在配置文件中my.ini中找到下边相应的语句,将引擎修改为想要的存储引擎名称。
2.重启MySQL 服务!!!?不是单纯的关闭再打开哟。
default-storage-engine=InnoDB
重启服务的操作:在电脑搜索栏输入服务→点击服务→下拉滑动条找到MySQL→右击MySQL→选择重新启动
本文章借鉴:
电子工业出版社的《高性能MySQL》;
清华大学出版社《MySQL入门很简单》