Back to VNotes

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逻辑储存结构
图层 4

MyISAM和Memory

MyISAM

MyISAM是MySQL早期的默认存储引擎

特点:

  • 不支持事务,不支持外键
  • 支持表锁,不支持行锁
  • 访问速度快

文件:xxx.sdi存储表结构信息、xxx.MYD存储数据、xxx.MYI存储索引

Memory

Memory引擎的表数据是存储在内存中的,由于受到硬件问题、或断电问题的影响,只能将这些表作为临时表或缓存使用

特点:

  • 内存存放
  • hash索引

文件:xxx.sdi存储表结构信息

存储引擎的选择

特点InnoDBMyISAMMemory
存储限制64TB
事务安全支持--
锁机制行锁表锁表锁
B+tree索引支持支持支持
Hash索引--支持
全文索引支持(v5.6之后)支持-
空间使用N/A
内存使用中等
批量插入速度
支持外键支持--

选择存储引擎时,应该根据应用系统的特点选择合适的存储引擎,对于复杂的应用系统,还可以根据实际情况选择多种存储引擎进行组合。

  • InnoDB:是MySQL的默认存储引擎,支持事务、外键。如果应用对事务的完整性有较高的要求,在并发条件下要求数据的一致性、数据操作除了插入和查询之外,还包含很多的更新、删除操作,那么InnoDB存储引擎是比较合适的选择。
  • MyISAM:如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性,并发性要求不是很高,那么选择这个存储引擎是非常合适的。
  • Memory:将所有数据保存在内存中,访问速度快,通常用于临时表及缓存。Memory的缺陷就是对表的大小有限制,太大的表无法缓存在内存中,并且无法保障数据的安全性

数据类型

数值类型

类型大小SIGNEDUNSIGNED描述
TINYINT1 byte(-128, 127)(0, 255)小整数值
SMALLINT2 bytes(-32768, 32767)(0, 65535)大整数值
MEDIUMINT3 bytes(-8388608, 8388607)(0, 16777215)大整数值
INT / INTEGER4 bytes(-2^31^, -2^31^-1)(0, 2^32^)大整数值
BIGINT8 bytes(-2^63^, 2^63^-1)(0, 2^64^)极大整数值
FLOAT4 bytes单精度浮点数
DOUBLE8 bytes双精度浮点数
DECIMAL依赖于M(精度)与D(标度)的值小数值(精确定点数)

若要使用UNSIGNED形式的数据类型,在数据类型后加UNSIGNED,如INT UNSIGNED

字符串类型

类型大小描述
CHAR(M)0~255 bytes定长字符串
VARCHAR(M)0~65535 bytes变长字符串
TINYBLOB0~255 bytes不超过255个字符的二进制数据
TINYTEXT0~255 bytes短文本字符串
BLOB0~65535 bytes二进制形式的长文本数据
TEXT0~65535 bytes长文本数据
MEDIUMBLOB0~16777215 bytes二进制形式的中等长度文本数据
MEDIUMTEXT0~16777215 bytes中等长度文本数据
LONGBLOB0~4294967295 bytes二进制形式的极大文本数据
LONGBLOB0~4294967295 bytes极大文本数据

一个字符就是一个字节,CHAR占M个字节,VARCHAR占D+1<=m个字节,D为长度

CHAR的性能高于VARCHAR