目录
一,存储引擎概念
1,myisam介绍
2,innodb介绍
3,myisam与innodb的区别
二,数据库存储引擎操作
1,查看系统支持的存储引擎
2,查看表使用的存储引擎
3,修改存储引擎
一,存储引擎概念
MySQL中的数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,
这些不同的技术以及配套的功能在MySQL中称为存储引擎
存储引擎是MySQL将数据存储在文件系统中的存储方式或者存储格式
MySQL常用的存储引擎:
MyISAM
InnoDB
MySQL数据库中的组件,负责执行实际的数据I/O操作
MySQL系统中,存储引擎处于文件系统之上,在数据保存到数据文件之前会传输到存储引擎,之后按照各个存储引擎的存储格式进行存储
1,myisam介绍
myisam特点
- 不支持事务
- 表级锁定
- 读写相互阻塞,写入不能读,读时不能写
- 只缓存索引
- 不支持外键约束
- 不支持聚簇索引
- 读取数据较快,占用资源较少
- 不支持MVCC(多版本并发控制机制)高并发
- 崩溃恢复性较差
- MySQL5.5.5 前默认的数据库引擎
myisam在磁盘上存储成三个文件
.frm 文件存储表结构的定义
数据文件的扩展名为 .MYD (MYData)
索引文件的扩展名是 .MYI (MYIndex)
MyIsam 是表级锁定,读或写无法同时进行
数据库在读写过程中相互阻塞: ————》串行操作,按照顺序操作,每次在读或写的时候会把全表锁起来,会在数据写入的过程阻塞用户数据的读取,也会在数据读取的过程中阻塞用户的数据写入。
特性:数据单独写入或读取,速度过程较快且占用资源相对少
MyISAM 表支持 3 种不同的存储格式
(1)静态(固定长度)表
静态表是默认的存储格式。静态表中的字段都是非可变字段,这样每个记录都是固定长度的,这种存储方式的优点是存储非常迅速,
容易缓存,出现故障容易恢复;缺点是占用的空间通常比动态表多。
固定长度10
存储非常迅速,容器缓存,故障之后容易恢复
(2)动态表
动态表包含可变字段(varchar),记录不是固定长度的,这样存储的优点是占用空间较少,但是频繁的更新、删除记录会产生碎片,
需要定期执行 OPTIMIZE TABLE 语句或 myisamchk -r 命令来改善性能,并且出现故障的时候恢复相对比较困难
(3)压缩表
压缩表由 myisamchk 工具创建,占据非常小的空间,因为每条记录都是被单独压缩的,所以只有非常小的访问开支。
MyISAM适用的生产场景
公司业务不需要事务的支持
单方面读取或写入数据比较多的业务
MyISAM存储引擎数据读写都比较频繁场景不适合
使用读写并发访问相对较低的业务
数据修改相对较少的业务
对数据业务一致性要求不是非常高的业务
服务器硬件资源相对比较差
MyIsam:适合于单方向的任务场景、同时并发量不高、对于事务要求不高的场景
2,innodb介绍
innodb的特点
- 行级锁
- 支持事务,适合处理大量短期事务
- 读写阻塞与事务隔离级别相关
- 可缓存数据和索引
- 支持聚簇索引
- 崩溃恢复性更好
- 支持MVCC高并发
- 从MySQL5.5后支持全文索引
- 从MySQL5.5.5开始为默认的数据库引擎
对硬件资源要求还是比较高的场合
行级锁定,但是全表扫描仍然会是表级锁定
InnoDB 中不保存表的行数,如 select count(*) from table; 时,InnoDB 需要扫描一遍整个表来计算有多少行,但是 MyISAM 只要简单的读出保存好的行数即可。需要注意的是,当 count(*)语句包含 where 条件时 MyISAM 也需要扫描整个表,对于自增长的字段,InnoDB 中必须包含只有该字段的索引,但是在 MyISAM 表中可以和其他字段一起建立组合索引。
3,myisam与innodb的区别
atureMyISAMInnoDBMemoryArchiveNDBStorage limits(支持最大容量)256TB64TBRAMNone384EBTransactions(事务)NoYesNoNoYesLocking granularity(锁定级别)TableRowTableRowRowMVCC(多版本并发控制技术)NoYesNoNoNoGeospatial data type supportYesYesNoYesYesGeospatial indexing supportYesYesNoNoNoB-tree indexesYesYesYesNoNoT-tree indexesNoNoNoNoYesHash indexesNoNoYesNoYesFull-text search indexesYesYesNoNoNoClustered indexesNoYesNoNoNoData cachesNoYesN/ANoYesIndex cachesYesYesN/ANoYesCompressed dataYesYesNoYesNoEncrypted dataYesYesYesYesYesCluster database supportNoNoNoNoYesReplication support (note 1)YesYesLimitedYesYesForeign key support(外键)NOYESNoNoYesBackup/point-in-time recovery (note 1)YesYesYesYesYesUpdate statistics for data dictionaryYesYesYesYesYes
Memory :将所有数据存储在RAM中,以便在需要快速查找参考和其他类似数据的环境中进行快
速访问。适用存放临时数据。
Archive :为存储和检索大量很少参考的存档或安全审核信息,只支持SELECT和INSERT操作;支持行级锁和专用缓存区。
企业选择存储引擎依据
业务场景如果并发两大,什么并发量大,读写的并发量大,那我们建议使用innoDB 如果单独的写入或是插入单独的查询,那我们建议使用没有INNODB
表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低;
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高;
• 支持的字段和数据类型
所有引擎都支持通用的数据类型
但不是所有的引擎都支持其它的字段类型,如二进制对象
• 锁定类型:不同的存储引擎支持不同级别的锁定
表锁定: MyISAM 支持
行锁定: InnoDB 支持
索引的支持
•建立索引在搜索和恢复数据库中的数据时能显著提高性能
•不同的存储弓|擎提供不同的制作索引的技术
•有些存储弓|擎根本不支持索引
事务处理的支持
•提高在向表中更新和插入信息期间的可靠性
•可根据企业业务是否要支持事务选择存储引擎
二,数据库存储引擎操作
1,查看系统支持的存储引擎
show engines;
(root@localhost) [(none)]> 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. row ***************************
Engine: MRG_MYISAM
Support: YES
Comment: Collection of identical MyISAM tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 3. row ***************************
Engine: MEMORY
Support: YES
Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 4. row ***************************
Engine: BLACKHOLE
Support: YES
Comment: /dev/null storage engine (anything you write to it disappears)
Transactions: NO
XA: NO
Savepoints: NO
*************************** 5. row ***************************
Engine: MyISAM
Support: YES
Comment: MyISAM storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 6. row ***************************
Engine: CSV
Support: YES
Comment: CSV storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 7. row ***************************
Engine: ARCHIVE
Support: YES
Comment: Archive storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 8. row ***************************
Engine: PERFORMANCE_SCHEMA
Support: YES
Comment: Performance Schema
Transactions: NO
XA: NO
Savepoints: NO
*************************** 9. row ***************************
Engine: FEDERATED
Support: NO
Comment: Federated MySQL storage engine
Transactions: NULL
XA: NULL
Savepoints: NULL
9 rows in set (0.00 sec)
ERROR:
No query specified
2,查看表使用的存储引擎
方法一
show table status from 库名 where name='表名'\G;
(root@localhost) [(none)]> show table status from hellodb where name='students'\G;
*************************** 1. row ***************************
Name: students
Engine: InnoDB #存储引擎innodb
Version: 10
Row_format: Dynamic
Rows: 25
Avg_row_length: 655
Data_length: 16384
Max_data_length: 0
Index_length: 0
Data_free: 0
Auto_increment: 26
Create_time: 2021-12-01 14:19:45
Update_time: 2021-12-01 14:19:45
Check_time: NULL
Collation: utf8_general_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.00 sec)
ERROR:
No query specified
方法二
use 库名;
show create table 表名;
(root@localhost) [(none)]> use hellodb
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
(root@localhost) [hellodb]> show create table students\G;
*************************** 1. row ***************************
Table: students
Create Table: CREATE TABLE "students" (
"StuID" int(10) unsigned NOT NULL AUTO_INCREMENT,
"Name" varchar(50) NOT NULL,
"Age" tinyint(3) unsigned NOT NULL,
"Gender" enum('F','M') NOT NULL,
"ClassID" tinyint(3) unsigned DEFAULT NULL,
"TeacherID" int(10) unsigned DEFAULT NULL,
PRIMARY KEY ("StuID")
) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8 #存储引擎是innodb
1 row in set (0.00 sec)
ERROR:
No query specified
3,修改存储引擎
方法一:通过 alter table 修改
use 库名;
alter table 表名 engine=MyISAM;
(root@localhost) [hellodb]> alter table students engine=myisam; #修改引擎为myisam
Query OK, 25 rows affected (0.00 sec)
Records: 25 Duplicates: 0 Warnings: 0
(root@localhost) [hellodb]> show create table students\G; #查看存储引擎
*************************** 1. row ***************************
Table: students
Create Table: CREATE TABLE "students" (
"StuID" int(10) unsigned NOT NULL AUTO_INCREMENT,
"Name" varchar(50) NOT NULL,
"Age" tinyint(3) unsigned NOT NULL,
"Gender" enum('F','M') NOT NULL,
"ClassID" tinyint(3) unsigned DEFAULT NULL,
"TeacherID" int(10) unsigned DEFAULT NULL,
PRIMARY KEY ("StuID")
) ENGINE=MyISAM AUTO_INCREMENT=26 DEFAULT CHARSET=utf8 #存储引擎为myisam
1 row in set (0.00 sec)
ERROR:
No query specified
方法二:通过修改 /etc/my.cnf 配置文件,指定默认存储引擎并重启服务
quit
vim /etc/my.cnf
[mysqld]
default-storage-engine=INNODB
[root@localhost ~]# vim /etc/my.cnf #修改配置文件
[mysqld]
user = mysql
basedir = /usr/local/mysql
datadir = /usr/local/mysql/data
port = 3306
character_set_server=utf8
pid-file = /usr/local/mysql/mysqld.pid
socket = /usr/local/mysql/mysql.sock
server-id = 1
default-storage-engine=INNODB #修改默认存储引擎
#skip-grant-tables
:wq
[root@localhost ~]# systemctl restart mysqld.service #重启服务
注意:此方法只对修改了配置文件并重启mysql服务后新创建的表有效,已经存在的表不会有变更。
(root@localhost) [hellodb]> create table test (id int,name char(10)); #新建表
Query OK, 0 rows affected (0.01 sec)
(root@localhost) [hellodb]> show create table test\G; #查看存储引擎
*************************** 1. row ***************************
Table: test
Create Table: CREATE TABLE "test" (
"id" int(11) DEFAULT NULL,
"name" char(10) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 #存储引擎为innodb
1 row in set (0.00 sec)
ERROR:
No query specified
通过 create table 创建表时指定存储引擎
use 库名;
create table 表名(字段1 数据类型,...) engine=MyISAM;
(root@localhost) [hellodb]> create table test1 (id int,name char(20),age
varchar(10))engine=myisam; #创建表时指定存储引擎为myisam
ERROR 2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id: 3
Current database: hellodb
Query OK, 0 rows affected (0.01 sec)
(root@localhost) [hellodb]> show create table test1\G; #查看存储引擎
*************************** 1. row ***************************
Table: test1
Create Table: CREATE TABLE "test1" (
"id" int(11) DEFAULT NULL,
"name" char(20) DEFAULT NULL,
"age" varchar(10) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 #存储引擎是myisam
1 row in set (0.00 sec)
ERROR:
No query specified