MySQL 存储引擎(九)

9、mysql 存储引擎

9.1、回顾

  1. 存储过程:是 SQL 语句和控制语句的预编译集合,以一个名称存储并作为一个单元出来
  2. 参数:输入类型、输出类型、输入&输出类型
  3. 创建:CREATE...PROCEDURE...
  4. 注意事项:
    • 创建存储过程或自定义函数时,需要通过 delimiter 来修改定界符
    • 如果函数体或过程体有多个语句,需要包含在 BEGIN...END 语句块中
    • 存储过程通过 call 来调用

9.2、存储引擎简介

mysql 可以将数据以不同的技术存储在文件(内存)中,这种技术称为存储引擎(存储、查询数据的技术)。

存储引擎使用不同的存储机制、索引技巧、锁定水平,最终提供广泛且不同的功能。

支持的存储引擎

  • MyISAM
  • InnoDB
  • Memory
  • CSV
  • Archive

9.3、相关知识点之并发处理

并发控制

当多个连接对记录进行修改时保证数据的一致性和完整性(当多个用户对同一条记录进行读或写操作时,为保证数据的一致性和完整性)。系统使用锁系统来解决这个并发控制,这种锁分为:

  &nb当多个连接对记录进行修改时保证数据的一致性和完整性(当多个用户对同一条记录进行读或写操作时,为保证数据的一致性和完整性)。系统使用锁系统来解决这个并发控制,这种锁分为:

  • 共享锁(读锁):在同一时间内,多个用户可以读取同一个资源,读取过程中数据不会发生任何变化。
  • 排他锁(写锁):在任何时候只能有一个用户写入资源,当进行写锁时会阻塞其他的读锁或者写锁操作。

锁颗粒

锁的力度(锁的颗粒):锁定时的单位。无需对所有资源加锁,只需对需要修改的资源加锁即可,为寻求平衡就需要使用合适的锁策略:

  • 表锁:是一种开销最小的锁策略。得到数据表的写锁(禁止其他用户进行读写,只能有一个锁)

  • 行锁:是一种开销最大的锁策略。并行性最大(有多少条记录,就有可能对每条记录都进行锁)

表锁的开销最小,因为使用锁的个数最小,行锁的开销最大,因为可能使用锁的个数比较多。

9.4、相关知识点之事务处理

  1. 事物:用于保证数据库的完整性
  2. 事物的特性:
  • 原子性(Atomicity
  • 一致性(Consistency
  • 隔离性(Isolation
  • 持久性(Durability

9.5、相关知识点之外键和索引

  1. 外键:是保证数据一致性的策略

  2. 索引:是对数据表中一列或多列的值进行排序的一种结构(分为普通索引、唯一索引、全文索引、btree 索引和 hash 索引)。

9.6、各个存储引擎特点

各个存储引擎特点

特点 MyISAM InnoDB Memory Archive
存储限制 256TB 64TB
事务安全 - 支持 - -
支持索引 支持 支持 支持
锁颗粒 表锁 行锁 表锁 行锁
数据压缩 支持 - - 支持
支持外键 - 支持 - -
  1. CSV 引擎:

CSV 引擎是由逗号分隔的存储引擎,会在数据库的子目录里为每一个表创建一个(.csv)的文件,这是一种普通的文本文件。每一个数据行占用一个文本行,CSV 不支持索引。

  1. BlackHole (黑洞)引擎:写入的数据都会消失,一般用于做数据复制的中继。

  2. MyISAM 引擎:适用于事务的处理不多的情况。

  3. InnoDB 引擎:适用于事务处理比较多,需要有外键支持的情况。

9.7、设置存储引擎

9.7.1、查看和修改 mysql 存储引擎

查看 mysql 存储引擎

# mysql 5.5 以上默认为 InnoDB
show engines;  # Support列, YES表示当前版本支持这个存储引擎, DEFAULT表示该引擎是默认的引擎。NO表示不支持该存储引擎。

方法一:通过修改 mysql 配置文件实现(永久有效)

# windows:找到(my.ini配置文件)C:\ProgramData\MySQL\MySQL Server 5.7,在配置文件后添加一句:
# mac:找到 my.conf 文件
# 修改完保存,重启 mysql 服务(net stop/start mysql 或者在服务里手动重启)
[mysqld]
default-storage-engine = MyISAM

方法二:使用系统命令修改(临时有效,重启失效)

SET default_storage_engine=InnoDB;

9.7.2、查看和修改数据表使用的存储引擎

方法一:查询 information_schema.TABLES

# 查询information_schema.TABLES
mysql> SELECT TABLE_SCHEMA,        # 数据表所属的数据库名(schema 可以看作为 databases)
    -> TABLE_NAME,            # 数据表名
    -> TABLE_TYPE,        # 数据表类型
    -> ENGINE          # 引擎
    -> FROM information_schema.TABLES
    -> WHERE TABLE_NAME = 'tb_4';
+--------------+------------+------------+--------+
| TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE | ENGINE |
+--------------+------------+------------+--------+
| test         | tb_4       | BASE TABLE | InnoDB |
+--------------+------------+------------+--------+
1 row in set (0.00 sec)

方法二:使用 SHOW CREATE TABLE tb_name\G 命令

# 两个都可以
SHOW CREATE TABLE tb_name\G         
SHOW CREATE TABLE tb_name;

方法三:SHOW TABLE STATUS

 SHOW TABLE STATUS WHERE Name = 'tb_4';   # 最好设置查询条件,否则数据库中的数据表状态信息全都显示出来

修改数据表的存储引擎

ALTER TABLE tb_name ENGINE = InnoDB;

9.7.3、创建表的时候如何指定存储引擎

CREATE TABLE tb_name(
    id SMALLINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(20)
) ENGINE = InnoDB;
SET NAMES = gbk;      # 设置编码方式

9.8、mysql 中 information_schema.tables 字段说明

information_schema.tables 可以获取数据表的结构

字段 含义
table_catalog 数据表等级目录
table_schema 数据表所属数据库名
table_name 表名
table_type 数据表类型
engine 存储引擎
version 版本信息
row_format 行格式(查看数据表是否压缩过)
table_rows 表里记录行数
avg_row_length 平均行长度
data_length 数据长度
max_data_length 最大数据长度
index_length 索引长度
data_free 空间碎片
auto_increment 自动递增(与主键配合)当前值
create_time 表创建时间
update_time 表更新时间
check_time 表检测时间
table_collation 表的字符校验编码集
checksum 校验和
create_options 创建选项
table_comment 表的注释、备注
posted @ 2020-09-05 11:27  Hubery_Jun  阅读(248)  评论(0编辑  收藏  举报