MySQL存储引擎概念
MySQL中的数据用各种不同的技术存储在文件(或内存)中,这些技术都使用不同的存储机制、索引技巧,锁定水平,并且最终提供广泛的、不同的功能。通过选择不同的技术,能够获得额外的速度或功能,从而改善整体功能
查询MySQL中支持的存储引擎
show engines; 或 show engines \g
show variables like ‘have%’;
show variables like ‘table_type’
常见三种存储引擎
- innoDB存储引擎
- MyISAM存储引擎
- MEMORY存储引擎
innoDB存储引擎特点及优缺点
innoDB存储引擎支持自动增长列(auto_increment)
innoDB存储引擎中支持外键(foreign key)
优点: 提供良好的事务管理、崩溃修复能力和并发控制
缺点:其读写效率稍差,占用的数据空间相对比较大
MyISAM存储引擎特点及优缺点
MyISAM存储引擎文件类型
- frm:存储表的结构
- myd: 存储数据
- myi: 存储索引
MyISAM存储引擎的存储格式
- MyISAM静态
- MyISAM动态
- MyISAM压缩
优点: 占用空间小,处理速度快
缺点:不支持事务的完整性和并发性
MEMORY存储引擎特点及优缺点
MEMORY存储引擎是MySQL中的一类特殊的存储引擎。其使用存储在内存中的内容来创建表,而且所有数据也放在内存中。
优点: 处理速度非常快
缺点:其数据易丢失,生命周期短
如何选择存储引擎
- innoDB存储引擎:用于事务处理应用程序,具有众多特性,包括ACID事务支持,支持外键,同时支持崩溃修复能力和并发控制。
- 适用于对事务完整性要求比较高,要求并发控制,需要频繁进行更新、删除操作的数据库
- MyISAM存储引擎:主要用于非事务表,它提供高速存储和检索,以及全文搜索能力。
- 适应于表主要用于插入新记录和读出记录,应用完整性、并发性要求很低
- MEMORY存储引擎:提供“内存“表,所有数据都在内存中,数据的处理速度快。但安全性不高
- 适应于需要很快读写速度,对数据的安全性要求较低,使用相对较小的数据库表
MySQL中的数据类型
MySQL支持多种数据类型,数值类型、日期/时间类型和字符串(字符)类型不区分大小写
数值类型
类型名 | 涵义 |
TINYINT | 一个很小的整数,1 个字节 |
SMALLINT | 一个小整数,2个字节 |
MEDIUMINT | 一个中等大小整数,3个字节 |
INT、INTEGER | 一个正常大小整数,4个字节 |
BIGINT | 一个大整数,8个字节 |
FLOAT | 一个小(单精密)浮点数字,近似值,可以带一个整数类型的参数,0到23的精度对应FLOAT列的4字节单精度。24到53的精度对应DOUBLE列的8字节双精度。 |
DOUBLE DOUBLE PRECISION REAL | 一个正常大小(双精密)浮点数字,近似值 |
DECIMAL(或简写为DEC) NUMERIC | 一个精确的浮点数字 |
日期时间类型
类型名 | 涵义 |
DATE | 一个日期,以'YYYY-MM-DD'格式来显示,范围是'1000-01-01'到 '9999-12-31',3个字节。 |
TIME | 一个时间,以' HH:MM:SS'格式来显示,TIME值的范围可以从'-838:59:59'到'838:59:59'。小时部分会因此大的原因是TIME类型不仅可以用于表示一天的时间(必须小于24小时),还可能为某个事件过去的时间或两个事件之间的时间间隔(可以大于24小时,或者甚至为负)。3个字节。 |
DATETIME | 一个日期和时间组合,以'YYYY-MM-DD HH:MM:SS'格式来显示,取值范围:“1000-01-01 00:00:00”到“9999-12-31 23:59:59”,8个字节。 |
TIMESTAMP | 一个时间戳,基本上与DATETIME差不多(包括精度),但是在建时间戳类型的列上会自动添加默认值为CURRENT_TIMESTAMP,而且在更新行时自动用当前时间更新时间戳类型的列。 取值范围:“19700101000000”到2037年的某个时刻。存储需求:4字节 |
YEAR | 以YYYY格式检索和显示YEAR值。范围是1901到2155. 1个字节。插入值时可以是:4位字符串、2位字符串、4位数字、2位数字。1到69和70到99范围的值被转换为2001到2069和1970到1999范围的YEAR值 |
字符数据类型
类型名 | 含义 |
CHAR[(M)] | 一个定长字符串,M的取值范围是0-255. 当CHAR值被存储时,他们被用空格在右边填补到指定的长度。当CHAR值被检索时,拖后的空格被删去。 |
VARCHAR(M) | 一个变长字符串,必须指指定M值。长度可以指定为0到65,535之间的值 |
TINYBLOB TINYTEXT | 最大长度为255(2^8-1)个字符的BLOB或TEXT列 |
BLOB TEXT | 最大长度为65535(2^16-1)个字符的BLOB或TEXT列 |
MEDIUMBLOB MEDIUMTEXT | 最大长度为16777215(2^24-1)个字符的BLOB或TEXT列 |
LONGBLOB LONGTEXT | 最大长度为4294967295(2^32-1)个字符的BLOB或TEXT列 |
ENUM('value1','value2',...) | 枚举:列只能赋值为某个枚举成员或NULL。1或2个字节,取决于枚举值的个数(最多65,535个值) |
SET('value1','value2',...) | 集合:列可以赋值为多个集合成员或NULL。1、2、3、4或者8个字节,取决于set成员的数目(最多64个成员) |
字符串类型
- BLOB是一个二进制大对象,可以容纳可变数量的数据。BLOB类型有TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB有4种。它们只是可容纳值的最大长度不同。支持任何数据,如文本、声音和图像等。
- TEXT类型有TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT4种。这些对应4种BLOB类型,有相同的最大长度和存储需求,适合存储长文本。
布尔数据类型
- BOOLEAN或简写为BOOL
- 0表示假,非0值表示真,一般用1表示
MySQL数据库操作
创建数据库(create database)
查看数据库(show databases)
选择数据库(use database)
删除数据库(drop database)
创建表
语法:
CREATE TABLE [IF NOT EXISTS] table_name
(
列名 数据类型 列级约束,
……,
表级约束
);
创建表时,需要指定下列内容:
唯一的表名称;
表内唯一的列名称;
列的数据类型及其宽度;
对于整数类型的列,可以使用关键字auto_increment将该列定义成自动增长列。
注意:
- (1)该列必须索引,一般将其定义成主键列
- (2)一个表只能有一个自增列
- (3)不为自增列赋值,或赋值为NULL,该列将自增;如果显式地为该列赋值,则使用显式插入的值,且再使用自增功能时接着显式值自增。
- (4)得到最后一次插入的值:last_insert_id()
查看表结构
show columns
describe
修改表结构
添加一列:alter table t1 add column c2 int; (column关键字可以省略)
修改某列:alter table t1 modify column c2 smallint;
删除一列:alter table t1 drop column c2; (column关键字可以省略)
修改列名:ALTER TABLE t1 CHANGE 旧列名 新列名 数据类型;(提示:数据类型可改可不改)
重命名表
rename table 数据表名1 to 数据表名2
查看和删除表
查看某个数据库中有哪些表:show tables [LIKE 'pattern'] [from dbname];
用DROP TABLE 语句删除数据表:DROP TABLE [IF EXISTS] tbl_name [, tbl_name,...]
注意:DROP TABLE删除一个或多个数据库表。所有表中的数据和表定义均被删除,故小心使用这个命令
面试题:
1. mysql 存储方式?
MySQL的表属性有:MyISAM 和 InnoDB 2种存储方式:
MyISAM 不支持事务回滚
InnoDB 支持事务回滚
可以用 show create table tablename 命令看表的类型。
如果操作MySQL想要支持事务回滚的话,该表的属性必须是 InnoDB 类型
2.请写出数据类型(int char varchar datetime text)的意思; 请问varchar和char有什么区别
- CHAR和VARCHAR类型类似,但它们保存和检索的方式不同。它们的最大长度和尾部空格是否被保留等方面也不同
- CHAR列的长度固定为创建表时声明的长度当检索到CHAR值时,尾部的空格被删除掉。
- VARCHAR列中的值为可变长字符串。同CHAR对比,VARCHAR值保存时只保存需要的字符数,VARCHAR值保存时不进行填充。当值保存和检索时尾部的空格仍保留
3、MySQL自增类型(通常为表ID字段)必需将其设为(?)字段
答: 对于整数类型的列,可以使用关键字auto_increment将该列定义成自动增长列