存储引擎
# 查询支持的全部引擎
show engines;
# 查看默认存储引擎
show variables like '%engine%';
InnoDB
InnoDB给MySql表提供事物、回滚、崩溃修复能力和多版本并发控制的事务安全,是第一个提供外键约束的表引擎.而且InnoDB对事务处理的能力也是MySql其他引擎无法比拟的.
优缺点
支持自动增长列AUTO_INCREMENT
自动增长列的值不能为空,且值必须唯一.MySql中规定自增列必须为主键.在插入时,如果自增列不输入值或者输入的0或空(NULL)则插入的值为自动增长后的值,如果插入的值在前面没有出现过,则可以自动插入.
InnoDB存储引擎的优势在于提供了良好的事物管理,崩溃修复能力和并发控制。缺点是读写效率差,占用的数据空间相对较大.
MyISAM
MyISAM是MySql中常见的存储引擎,曾经是MySql默认的存储引擎是基于ISAM引擎发展起来的,解决了ISAM的很多不足同时增加了很多有用的拓展.
文件类型
表存储成3个文件.文件的名字和表名相同,拓展名包括frm(存储表的结构)、MYD(存储数据,MYData)和MYI(存储索引,MYIndex).
存储格式
支持三种不同的存储格式,包括静态型、动态型和压缩型.
MyISAM静态
如果所有表列的大小都是静态(即不用xBLOB、xTEXT或VARCHAR数据类型)就会自动使用静态MyISAM格式,这种类型的表性能非常高,因为在维护和访问已预定义格式存储的数据时需要很低的开支.但是,这项有点要以空间为代价,因为每列都需要分配给该列最大空间,而无论该空间是否真正的使用.
如果该列(即时有一列)定义为动态的(即使用xBLOB、xTEXT或VARCHAR数据类型),MySQL就会自动使用动态格式,虽然MyISAM动态表占用的空间比静态格式所占用空间少,但空间的节省带来了性能的下降.如果某个字段的内容发生改变,则其位置很可能就需要移动,这会导致碎片的产生.随着数据集中的碎片增加,数据访问性能就会相应降低.这个问题有两种法定是修复:
- 竟可能的使用静态数据类型.
- 经常使用OPTIMIZE TABLE NAME语句,它会整理表的碎片,恢复由于更新和删除而导致的空间丢失.
MyISAM压缩
有时候会创建整个应用程序生命周期中都只读的表。如果是这种情况,就可以使用myisampack工具将其转换为MyISAM压缩表来减少空间.在给定硬件配置下(如快速的处理器和低速的硬盘驱动器),性能的提升将相当显著.教程传送门如下.
优缺点
MyISAM引擎的优势在于占用空间小,处理速度快;缺点是不支持事物的完整性和并发性.
数据类型
整数数据类型
数据类型 | 取值范围 | 说明 | 单位/字节 |
---|---|---|---|
TINYINT | 符号值:-127~127无符号:0~255 | 最小的整数 | 1 |
BIT | 符号值:-127~127无符号:0~255 | 最小的整数 | 1 |
BOOL | 符号值:-127~127无符号:0~255 | 最小的整数 | 1 |
SMALLINT | 符号值:-32 768~32767无符号:0~65535 | 小型整数 | 2 |
MEDIUMINT | 符号值:-8 388 608~8 388 607无符号:0~16 777 215 | 中型整数 | 3 |
INT | 符号值:-2 147 683 648~2 147 683 647无符号:0~4 294 967 295 | 标准整数 | 4 |
BIGINT | 符号值:-9 223 372 036 854 775 808~9 223 372 036 854 775 807无符号:0~18 446 744 073 709 551 615 | 大整数 | 8 |
FLOAT | +(-)3.402 823 466E+38 | 单精度浮点数 | 8或4 |
DOUBLE | +(-)1.797 693 134 862 315 7E+308+(-)1.797 693 134 862 315 4E-308 | 双精度浮点数 | 8 |
DECIMAL | 可变 | 一般整数 | 自定义 |
说明:
在创建表时,使用数字类型,应遵循以下原则
- 选择最小的可用类型,如果值永远不超过127,则使用TINYINT比INT强.
- 对于完全都是数字的,可以选择整数类型.
- 浮点类型可用于能具有小数部分的数,如货物单价、网上购物交付金额等.
字符串
字符串类型可以分为三类:普通的文本字符串类型(CHAR和VARCHAR)、可变类型(TEXT和BLOB)和特殊类型(SET和ENUM).
普通文本的字符串类型
CHAR列的长度被固定为创建表所声明的长度,取值在1~255之间;VARCHAR列的值是变长的字符串,取值和CHAR一样.
类型 | 取值范围/字符 | 说明 |
---|---|---|
char | 0~255 | 固定长度为M的字符串,其中M的取值范围为0~255。national关键字指定了应该使用的默认字符集。binary关键字指定了数据是否区分大小写(默认区分)。ASCII关键字指定了再该列中使用latinl字符集,unicode关键字制定了使用UCS字符集 |
char | 0~255 | char(M)类似 |
varchar | 0~255 | 长度可变,其他和char(M)类似 |
可变类型(TEXT和BLOB)
它们的大小可以改变,TEXT类型适合存储长文本,而BLOB类型适合存储二进制数据,支持任何数据,入文本,声音和图像等.
类型 | 最大长度(字节数) | 说明 |
---|---|---|
TINYBLOB | 2^8-1(255) | 小BLOB字段 |
TINYTEXT | 2^8-1(255) | 小TEXT字段 |
BLOB | 2^16-1(65 535) | 常规BLOB字段 |
TEXT | 2^16-1(65 535) | 常规TEXT字段 |
MEDOIMBLOB | 2^24-1(16 777 215) | 中型BLOB字段 |
MEDOIMTEXT | 2^24-1(16 777 215) | 中型TEXT字段 |
LONGBLOB | 2^32-1(4 294 967 295) | 长BLOB字段 |
LONGTEXT | 2^32-1(4 294 967 295) | 长TEXT字段 |
特殊类型(SET和ENUM)
类型 | 最大值 | 说明 |
---|---|---|
Enum('value1','value2',...) | 65 535 | 该类型的列只可以容纳所列值之一或为NULL |
Set('value1','value2',...) | 64 | 该类型的列只可以容纳所列一组值或为NULL |
说明
:创建表时,使用字符串类型时应该遵循
- 从速度方面考虑,要选择固定的列,可以使用CHAR类型
- 要节省空间,使用动态的列,可以使用VARCHAR类型
- 要将列中的内容限制在一种选择,可以使用ENUM类型
- 允许在一个列中有多于一个的条目,可以使用SET类型
- 如果要搜索的内容不区分大小写,可以使用TEXT类型
- 如果要搜索的内容区分大小写,可以使用BLOB类型
日期和时间类型
日期和事件类型包括:DATATIME、DATE、TIMESTAMP、TIME和YEAR.赋予它一个不合法的值会被“0”代替
类型 | 取值范围 | 说明 |
---|---|---|
DATE | 1000-01-01 9999-12-31 | 日期,格式YYYY-MM-DD |
TIME | -838:58:59 835:58:59 | 时间,格式HH:MM:SS |
DATETIME | 1000-01-01 00:00:009999-12-31 23:59:59 | 日期和时间,格式YYYY-MM-DD HH:MM:SS |
TIMESTAMP | 1970-01-01 00:00:002037年的某个时间 | 时间标签,在处理报告时使用显示格式取决于M的值 |
YEAR | 1901-2105 | 年份可指定两位数字和四位数字的值 |