1.存储引擎介绍
数据库中数据的存储都是以表的形式存储的,存储引擎也称为表类型
实现了存储数据,为存储的数据建立索引,并实现了实时更新以及查询种种方法
数据库中不同类型的表对应mysql不同的存储机制
1.1mysql查看支持的存储引擎
mysql> show engines\G;# 查看所有支持的引擎
mysql> show variables like 'storage_engine%'; # 查看正在使用的存储引擎
InnoDB存储引擎(最常用)
MySQL默认的存储引擎
支持事务
行级锁定,通过索引实现
缓存特性高,可以缓存索引,也能缓存数据。其设计目标主要面向联机事务处理(OLTP)的应用
适用场景:不需要事务支持(不支持),并发较低(锁定机制),数据修改相对较少(阻塞问题),以读为主
MyLSAM存储引擎
不支持事务
表级锁定,锁定机制是锁级索引
只会缓存索引。设计主要面向一些 OLAP 数 据库应用
适用场景:需要事务支持,数据更新频繁,数据一致性要求较高
NDB存储引擎
集群存储引擎
Memory存储引擎
Memory 存储引擎中的数据都存放在内存中,数据库重启或发生崩溃,表中的数据都将消失
NTSE存储引擎
网易公司开发的面向其内部使用的存储引擎。目前的版本不支持事务, 但提供压缩、行级缓存等特性
BLACKHOLE
黑洞存储引擎,可以应用于主备复制中的分发主库。
几种数据引擎对比:
InnoDB
支持事务
支持表锁、行锁(for update)
表锁:select * from tb for update
行锁:select id,name from tb where id=2 for update
myisam
查询速度快
全文索引
支持表锁
表锁:select * from tb for update
NDB
高可用、 高性能、高可扩展性的数据库集群系统
Memory
默认使用的是哈希索引
1.2 指定表类型/存储引擎
存储引擎
1.create table t1(id int) engine = innodb 会出现2个文件
2.create table t2(id int) engine = myisam 会出现3个文件(速度比上面的快),但是我们还是用innodb存储
3.create table t3(id int) engine = memory 只有表结构没有表数据,是创建到内存中的
4.create table t4(id int) engine = blackhole 黑洞,吃数据(数据存进去就没有了,存进去就没有了)
2.数据类型介绍(详见菜鸟教程)
2.1数字
整数
tinyint(小整型) # 一个字节
tinyint[(m)] [unsigned] [zerofill]
小整数,数据类型用于保存一些范围的整数数值范围:
有符号: -128 ~ 127
无符号:0~ 255
PS: MySQL中无布尔值,使用tinyint(1)构造。
int(整型)# 四个字节
int[(m)][unsigned][zerofill]
整数,数据类型用于保存一些范围的整数数值范围:
有符号: -2147483648 ~ 2147483647
无符号:0~ 4294967295
bigint(大整形) # 八个字节
bigint[(m)][unsigned][zerofill]
大整数,数据类型用于保存一些范围的整数数值范围:
有符号:-9223372036854775808 ~ 9223372036854775807
无符号: 0~ 18446744073709551615
## 这里对于int也可以赋值,int类型后面显示的是显示宽度,而不是存储宽度。
例
create table dbs(id int(3) zerofill);
insert into dbs values(5),(12);
效果
小数
float :在位数比较短的情况下不精准
double :在位数比较长的情况下不精准
0.000001230123123123会存成:0.000001230000
decimal:(如果用小数,则用推荐使用decimal)
精准,内部原理是以字符串形式去存
2.2字符
char(10) # 10字符,一个汉字或者一个字母都是一个字符,字符长度范围0-255
简单粗暴,浪费空间,存取速度块,root存成root000000
varchar #字符长度范围0-65535
精准,节省空间,存取速度慢
验证
length():查看字节数
char_length():查看字符数
例
create table b8(x char(5),y char(5));
insert into b8 values('CRY','CRY');
select x,char_length(x),y,char_length(y) from b8; # 查看输入的字符长度
insert into b8 values('哈皮','二狗子');
select x,length(x),y,length(y) from b8; # 查看输入的字节长度
效果(存多少显示多少)
2.3时间类型
常用类型:
datatime # 2018-6-12 16:34:20
data # 2018-6-12
time # 16:34:20
year # 2018
语法
语法:
YEAR
YYYY(1901/2155)
DATE
YYYY-MM-DD(1000-01-01/9999-12-31)
TIME
HH:MM:SS('-838:59:59'/'838:59:59')
DATETIME
YYYY-MM-DD HH:MM:SS(1000-01-01 00:00:00/9999-12-31 23:59:59 Y)
TIMESTAMP
YYYYMMDD HHMMSS(1970-01-01 00:00:00/2037 年某时)
用法
日期:
create table stu(id int,name char(5),now_date date,now_year year,now_datetime datetime,now_time time);
insert into stu values(1,'bob',now(),now(),now(),now());
select * from stu;
效果
2.4枚举及集合类型
字段的值只能在给定范围中选择,如单选框,多选框
enum 单选 只能在给定的范围内选一个值,如性别 sex 男male/女female
set 多选 在给定的范围内可以选择一个或一个以上的值(爱好1,爱好2,爱好3...)
例
create table b5(id int,
姓名 varchar(100),
性别 enum('男','女'),
爱好 set('抽烟','喝酒','鬼混')
);
insert into b5 values
(1,'保罗','男','抽烟'),
(2,'杜杜','女','喝酒,鬼混'),
(3,'乔伊','女','抽烟,喝酒,鬼混');
效果