Mysql——存储引擎

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 一、存储引擎概念
  • 二、MySQL常用的存储引擎
    • (一)、MyISAM
      • 1、特点
      • 2、存储的形式
      • 3、锁定形式——表级锁定形式,数据在更新时锁定整个表
      • 4、MyISAM 表支持3种不同的存储格式
        • (1)、静态(固定长度)表
        • (2)、动态表
        • (3)、压缩表
      • 5、MyISAM适用的生产场景——`适合于单方向的任务场景、同时并发量不高、对于事务要求不高的场景`
    • (二)、InnoDB
      • 1、InnoDB特点
        • (1)、读写阻塞与事务隔离级别相关
        • (2)、对硬件资源要求还是比较高的场合
    • (三)、对比InnoDB和MyISAM
      • 1、死锁
      • 2、如何选择引擎?
    • (四)、查看系统支持的存储引擎
    • (五)、查看表的使用存储引擎
      • 1、方法一
      • 2、方法二
    • (六)、修改存储引擎——通过alter table进行修改
      • 1、方法一
      • 2、方法二——通过修改 /etc/my.cnf 配置文件,指定默认存储引擎并重启服务
      • 3、方法三——通过 create table 创建表时指定存储引擎


一、存储引擎概念

MySQL中的数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎。存储引擎是MySQL将数据存储在文件系统中的存储方式或者存储格式。

二、MySQL常用的存储引擎

在MySQL 5.5之前的版本中,默认的搜索引擎是MyISAM,从MySQL 5.5之后的版本中,默认的搜索引擎变更为InnoDB。现在MySQL 5.7 支持的存储引擎有 InnoDB、MyISAM、Memory、Merge、Archive、CSV、BLACKHOLE 等。

(一)、MyISAM

MySQL数据库中的组件,负责执行实际的数据I/O操作
MySQL系统中,存储引擎处于文件系统之上,在数据保存到数据文件之前会传输到存储引擎,之后按照各个存储引擎的存储格式进行存储。

1、特点

  1. MyISAM不支持事务,也不支持外键约束,只支持全文索引,数据文件和索引文件是分开保存的。
  2. 访问速度快,对事务完整性没有要求
  3. 适合查询、插入为主的应用场景

2、存储的形式

MyISAM在磁盘上存储为三个文件,文件名和表名都相同,但是扩展名分别为:

  1. .frm文件存储表结构的定义
  2. 数据文件的扩展名为 .MYD (MYData)
  3. 索引文件的扩展名是 .MYI (MYIndex)

3、锁定形式——表级锁定形式,数据在更新时锁定整个表

1.数据库在读写过程中相互阻塞: ——> 串行操作,按照顺序操作,每次在读或写的时候会把全表锁起来
2.会在数据写入的过程阻塞用户数据的读取
3.也会在数据读取的过程中阻塞用户的数据写入
4.数据单独写入或读取,速度过程较快且占用资源相对少
MyISAM 是表级锁定,读或写无法同时进行
好处是:分开执行时,速度快、资源占用相对较少(相对)

4、MyISAM 表支持3种不同的存储格式

(1)、静态(固定长度)表

静态表是默认的存储格式。静态表中的字段都是非可变字段,这样每个记录都是固定长度的,这种存储方式的优点是存储非常迅速,容易缓存,出现故障容易恢复,缺点是占用的空间通常比动态表多。
固定长度10
存储非常迅速,容器缓存,故障之后容易恢复

(2)、动态表

动态表包含可变字段(varchar),记录不是固定长度的,这样存储的优点是占用空间较少,但是频繁的更新,删除记录会产生碎片,需要定期执行 OPTIMIZE TABLE 语句或 myisamchk -r 命令来改善性能,并且出现故障的时候恢复相对比较困难。

(3)、压缩表

压缩表由 myisamchk 工具创建,占据非常小的空间,因为每条记录都是被单独压缩的,所以只有非常小的访问开支。

5、MyISAM适用的生产场景——适合于单方向的任务场景、同时并发量不高、对于事务要求不高的场景

  1. 公司业务不需要事务的支持
  2. 单方面读取或写入数据比较多的业务
  3. MyISAM存储引擎数据读写都比较频繁场景不适合
  4. 使用读写并发访问相对较低的业务
  5. 数据修改相对较少的业务
  6. 对数据业务一致性要求不是非常高的业务
  7. 服务器硬件资源相对比较差

(二)、InnoDB

1、InnoDB特点

支持事务,支持4个事务隔离级别(数据不一致问题)MySQL从5.5.5版本开始,默认的存储引擎为 InnoDB

(1)、读写阻塞与事务隔离级别相关

  1. 能非常高效的缓存索引和数据
  2. 表与主键以簇的方式存储
  3. 支持分区、表空间,类似oracle数据库
  4. 支持外键约束,5.5前不支持全文索引,5.5后支持全文索引

(2)、对硬件资源要求还是比较高的场合

行级锁定,但是全表扫描仍然会是表级锁定,如update table set a=1 where user like ‘%lic%’;
InnoDB 中不保存表的行数

select count(*) from table; 时,InnoDB 需要扫描一遍整个表来计算有多少行,但是 MyISAM 只要简单的读出保存好的行数即可。需要注意的是,当 count(*)语句包含 where 条件时 MyISAM 也需要扫描整个表

对于自增长的字段,InnoDB 中必须包含只有该字段的索引,但是在 MyISAM 表中可以和其他字段一起建立组合索引。

(三)、对比InnoDB和MyISAM

  • InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交, 这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务;
  • InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败;
  • InnoDB是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高。但 是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大, 因为主键太大,其他索引也都会很大。而MyISAM是非聚集索引,数据文件是分离的,索引保存的 是数据文件的指针。主键索引和辅助索引是独立的
  • InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一 个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快
  • Innodb不支持全文索引,而MyISAM支持全文索引,查询效率上MyISAM要高

1、死锁

#MyISAM:表级锁定
#innodb:行级锁定

2、如何选择引擎?

如果没有特别的需求,使用默认的 Innodb 即可。

MyISAM :以读写插入为主的应用程序,比如博客系统、新闻门户网站。
InnoDB :更新(删除)操作频率也高,或者要保证数据的完整性;并发量高,支持事务和外键。比如 :OA自动化办公系统。
空整个表时,InnoDB 是一行一行的删除,效率非常慢。MyISAM 则会重建表。

(四)、查看系统支持的存储引擎

show engines;

Mysql——存储引擎_第1张图片

(五)、查看表的使用存储引擎

1、方法一

show table status from 库名 where name=‘表名’\G      #\G 和 ; 用一个

例:show table status from test where name=‘class1’\G

Mysql——存储引擎_第2张图片

2、方法二


use 库名;
show create table 表名;

use test;
show create table class1;

Mysql——存储引擎_第3张图片

(六)、修改存储引擎——通过alter table进行修改

1、方法一

use 库名;
alter table 表名 engine=MyISAM;

use test;
alter table class engine=myisam;
show create table class;

Mysql——存储引擎_第4张图片

2、方法二——通过修改 /etc/my.cnf 配置文件,指定默认存储引擎并重启服务

vim /etc/my.cnf
[mysqld]
default-storage-engine=INNODB

systemctl restart mysqld.service

注意:此方法只对修改了配置文件并重启mysql服务后新创建的表有效,已经存在的表不会有变更。

Mysql——存储引擎_第5张图片
Mysql——存储引擎_第6张图片

原先表的引擎不变
Mysql——存储引擎_第7张图片

Mysql——存储引擎_第8张图片

3、方法三——通过 create table 创建表时指定存储引擎

use 库名;
create table 表名(字段1 数据类型,…) engine=MyISAM;

mysql -u root -p
use test;
create table class3(name varchar(10),age char(4))engine=myisam;

Mysql——存储引擎_第9张图片


你可能感兴趣的:(mysql,mysql,数据库,搜索引擎)