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,'乔伊','女','抽烟,喝酒,鬼混');
效果