Database / SQL
MySQL 与 SQL 基础(八)
记录 MySQL 启动方式、SQL 分类、DDL、DML、DQL、DCL 和表结构操作。
简介
存储引擎是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎是基于表而不是基于库的,所以存储引擎也可以称为表类型。
MySQL 5.5之后,默认存储引擎是InnoDB
相关操作:
查询建表语句
SHOW CREATE TABLE 表名;
建表时指定存储引擎
CREATE TABLE 表名(
...
) ENGINE = 引擎;
查看当前数据库支持的存储引擎
SHOW ENGINES;
InnoDB
InnoDB是一种兼顾可靠性和高性能的通用存储引擎
特点:
- DML操作遵循ACID模型,支持事务
- 行级锁,提高并发访问性能
- 支持外键FOREIGN KEY约束,保证数据的完整性和正确性
InnoDB引擎的每张表都会对应一个xxx.idb表空间文件(xxx代表表名),储存该表的表结构(frm、sdi)、数据和索引
参数:innodb_file_per_table决定是每张表对应一个文件还是共用文件,MySQL 8.0默认为1
- InnoDB逻辑储存结构

MyISAM和Memory
MyISAM
MyISAM是MySQL早期的默认存储引擎
特点:
- 不支持事务,不支持外键
- 支持表锁,不支持行锁
- 访问速度快
文件:xxx.sdi存储表结构信息、xxx.MYD存储数据、xxx.MYI存储索引
Memory
Memory引擎的表数据是存储在内存中的,由于受到硬件问题、或断电问题的影响,只能将这些表作为临时表或缓存使用
特点:
- 内存存放
- hash索引
文件:xxx.sdi存储表结构信息
存储引擎的选择
| 特点 | InnoDB | MyISAM | Memory |
|---|---|---|---|
| 存储限制 | 64TB | 有 | 有 |
| 事务安全 | 支持 | - | - |
| 锁机制 | 行锁 | 表锁 | 表锁 |
| B+tree索引 | 支持 | 支持 | 支持 |
| Hash索引 | - | - | 支持 |
| 全文索引 | 支持(v5.6之后) | 支持 | - |
| 空间使用 | 高 | 低 | N/A |
| 内存使用 | 高 | 低 | 中等 |
| 批量插入速度 | 低 | 高 | 高 |
| 支持外键 | 支持 | - | - |
选择存储引擎时,应该根据应用系统的特点选择合适的存储引擎,对于复杂的应用系统,还可以根据实际情况选择多种存储引擎进行组合。
- InnoDB:是MySQL的默认存储引擎,支持事务、外键。如果应用对事务的完整性有较高的要求,在并发条件下要求数据的一致性、数据操作除了插入和查询之外,还包含很多的更新、删除操作,那么InnoDB存储引擎是比较合适的选择。
- MyISAM:如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性,并发性要求不是很高,那么选择这个存储引擎是非常合适的。
- Memory:将所有数据保存在内存中,访问速度快,通常用于临时表及缓存。Memory的缺陷就是对表的大小有限制,太大的表无法缓存在内存中,并且无法保障数据的安全性
数据类型
数值类型
| 类型 | 大小 | SIGNED | UNSIGNED | 描述 |
|---|---|---|---|---|
| TINYINT | 1 byte | (-128, 127) | (0, 255) | 小整数值 |
| SMALLINT | 2 bytes | (-32768, 32767) | (0, 65535) | 大整数值 |
| MEDIUMINT | 3 bytes | (-8388608, 8388607) | (0, 16777215) | 大整数值 |
| INT / INTEGER | 4 bytes | (-2^31^, -2^31^-1) | (0, 2^32^) | 大整数值 |
| BIGINT | 8 bytes | (-2^63^, 2^63^-1) | (0, 2^64^) | 极大整数值 |
| FLOAT | 4 bytes | 单精度浮点数 | ||
| DOUBLE | 8 bytes | 双精度浮点数 | ||
| DECIMAL | 依赖于M(精度)与D(标度)的值 | 小数值(精确定点数) |
若要使用UNSIGNED形式的数据类型,在数据类型后加UNSIGNED,如INT UNSIGNED
字符串类型
| 类型 | 大小 | 描述 |
|---|---|---|
| CHAR(M) | 0~255 bytes | 定长字符串 |
| VARCHAR(M) | 0~65535 bytes | 变长字符串 |
| TINYBLOB | 0~255 bytes | 不超过255个字符的二进制数据 |
| TINYTEXT | 0~255 bytes | 短文本字符串 |
| BLOB | 0~65535 bytes | 二进制形式的长文本数据 |
| TEXT | 0~65535 bytes | 长文本数据 |
| MEDIUMBLOB | 0~16777215 bytes | 二进制形式的中等长度文本数据 |
| MEDIUMTEXT | 0~16777215 bytes | 中等长度文本数据 |
| LONGBLOB | 0~4294967295 bytes | 二进制形式的极大文本数据 |
| LONGBLOB | 0~4294967295 bytes | 极大文本数据 |
一个字符就是一个字节,CHAR占M个字节,VARCHAR占D+1<=m个字节,D为长度
CHAR的性能高于VARCHAR