MySQL引擎原理

存储引擎

# 存储引擎可以看成是处理数据的不同方式
	
# 查看存储引擎的方式
	show engines;

# 需要掌握的四个存储引擎
	MyISAM
		MySQL5.5之前默认的存储引擎
			不支持事务、行级锁和外键	针对数据的操作较于InnoDB不够安全
			但是数据的存取速度较于InnoDB更快
	InnoDB
		MySQL5.5之后默认的存储引擎
			支持事务、行级锁和外键	针对数据的操作更加的安全
	memory
		基于内存存取数据
			速度最快但是断电立即丢失
	blackhole
		写入其中的数据都会立刻消失	类似于垃圾处理站

# 存储引擎创建表的不同点
	create table t1(id int) engine=myisam;
	create table t2(id int) engine=innodb;
	create table t3(id int) engine=memory;
	create table t4(id int) engine=blackhole;
	"""
	MyISAM会创建三个文件
		.frm	表结构文件
		.MYD	表数据文件
		.MYI	表索引文件(索引是用来加快数据查询的)
	InnoDB会创建两个文件
		.frm	表结构文件
		.idb	表数据和表索引文件
	memory
		.frm	表结构文件
	blackhole
		.frm	表结构文件
	"""

MySQL基本数据类型

# 1. 整型
	tinyint	smallint	int bigint
	不同的int类型能够存储的数字范围是不一样的
		1.要注意是否存负数(正负号需要占一个比特位)
		2.针对手机号码只能用bigint
	'''研究默认是否需要正负号'''
		create table t5(id tinyint);
		insert into t5 values(-999),(999);
	# 结论:所有的int类型默认都需要正负号
		create table t6(id tinyint unsigned);	# 移除正负号
		insert into t6 values(-999),(999);

# 2. 浮点型
	float	double	decimal
	float(255,30)	# 总共255位	小数位占30位
	double(255,30)	# 总共255位	小数位占30位
	decimal(65,30)	# 总共65位	小数位占30位
	"""研究三者的不同"""
	create table t7(id float(255,30));
	create table t8(id double(255,30));
	create table t9(id decimal(65,30));
	insert into t7 values(1.1111111111111);
	insert into t8 values(1.1111111111111);
	insert into t9 values(1.1111111111111);
	# 结论:三者的精确度不一样
		float < double < decimal
	
	"""
	到底使用哪个
		一般情况下小数点后面只保留两位	所以float足矣
		如果是从事高精密业务	则需要考虑更高的精确度
	ps:有时候很多看似需要用数字存储的数据	可能都是村的字符串
	"""

# 3. 字符类型
	char(4)
		定长类型	最多只能存四个字符	多了报错少了自动空格填充至四个
	varchar(4)
		变长类型	最多只能存四个字符	多了报错少了又鸡哥则存几个
	"""研究上述特征"""
	create table t10(id int,name char(4));
	create table t11(id int,name varchar(4));
	insert into t10 values(1, 'qq');
	insert into t11 values(1, 'qq');
	# 针对5.6版本超出范围不会报错	而是自动帮你截取并保存(此行为不合理)
		方式1:修改配置文件(永久)
		方式2:命令修改(暂时)
			show varibles like '%mode%'
			set session	# 当前窗口有效
			set global	# 当前服务端有效
				set global sql_mode = 'strict_trans_tables'
			修改完毕后退出客户端重新进入即可
		再次执行上述插入命令	会直接报错
	# 研究定长与变长特性
		insert into t10 values(1,'j');
		insert into t11 valuse(1,'t');
		# 统计某个字段数据的长度	char_length()
		'''底层确实会填充	但是取出来的时候会自动去除'''
		set global sql_mode = 'strict_trans_tables,pad_char_to_full_length'

char与varchar的对比

char
	优势:整存整取	速度快
	劣势:浪费存储空间
varchar
	优势:节省存储空间
	劣势:存取数据的速度较char慢
"""
char(5)
	qq   tony kevintom  jerry
varchar(5)
	1bytes+qq1bytes+tony1butes+kevin1bytes+tom1bytes+jerry
	存:先计算数据的长度
	取:先获取报头的数据
"""
# 以前几乎都是char	现在很多情况下使用varchar
	通过右键告诉你每个字段的英文名和中文名及类型等项目的诸多信息

补充:在创建字段的时候可以加上相应的注释
	create table t12(
		id int comment '序号',
		name char(4) comment '姓名'
	);

整型中括号内数字的作用

create table t13(id int(3));
insert into t13 values(44444);
"""
在整型中括号内的数字并不是用来限制存储的长度,而是用来控制展示的长度
以后在定义整型字段的时候,不需要自己添加数字,使用默认的就可以
"""
create table t14(id int(3) zerofill);
insert into t13 values(4);
# 结论:整型比较特殊,是唯一个不是用来限制存储长度的类型

枚举与集合类型

枚举
	多选一
	enum()
		create table user(
			id int,
			name varchar(32),
			gender enum('male','female','others')
		);
		insert into user values(1,'qq','女');	# 报错
		insert into user values(1,'qq','female');	# 正常
集合
	多选多(包含了多选一)
set()
	create table userinfo(
		id int,
		name char(16),
		hobby set('basketball','football','doublecolorball')
	);

日期类型

date		年月日
datetime	年月日时分秒
time		时分秒
year		年份

create table client(
	id int,
	name varchar(32),
	reg_time date,
	birth datetime,
	study_time time,
	join_time year
);
insert into client values(1,'qq','2000-11-11','2000-1-31 11:11:11','11:11:11',1995);

创建表的完整语法

create table 表名(
	字段名1 字段类型(数字) 约束条件,
	字段名2 字段类型(数字) 约束条件,
	字段名3 字段类型(数字) 约束条件
);
"""
1.字段名和字段类型是必须的
2.数字和约束套件是可选的,并且约束条件可以有多个空格隔开即可
3.最后一个语句的结尾不要加逗号
"""
建表
mysql> create database staff;
Query OK, 1 row affected (0.00 sec)

mysql> use staff;
Database changed
mysql> create table staff_info (id int,name varchar(50),age int(3),sex enum('male','female'),phone bigint(11),job varchar(11));
Query OK, 0 rows affected (0.02 sec)


mysql> show tables;
+-----------------+
| Tables_in_staff |
+-----------------+
| staff_info      |
+-----------------+
1 row in set (0.00 sec)

mysql> desc staff_info;
+-------+-----------------------+------+-----+---------+-------+
| Field | Type                  | Null | Key | Default | Extra |
+-------+-----------------------+------+-----+---------+-------+
| id    | int(11)               | YES  |     | NULL    |       |
| name  | varchar(50)           | YES  |     | NULL    |       |
| age   | int(3)                | YES  |     | NULL    |       |
| sex   | enum('male','female') | YES  |     | NULL    |       |
| phone | bigint(11)            | YES  |     | NULL    |       |
| job   | varchar(11)           | YES  |     | NULL    |       |
+-------+-----------------------+------+-----+---------+-------+
6 rows in set (0.00 sec)

mysql> select id,name,sex from staff_info;
Empty set (0.00 sec)

mysql> select * from staff_info;
Empty set (0.00 sec)
插入数据
mysql> insert into staff_info (id,name,age,sex,phone,job) values (1,'Alex',83,'female',13651054608,'IT');
Query OK, 1 row affected (0.00 sec)

mysql> insert into staff_info values (2,'Egon',26,'male',13304320533,'Teacher');
Query OK, 1 row affected (0.00 sec)

mysql> insert into staff_info values (3,'nezha',25,'male',13332353222,'IT'),(4,'boss_jin',40,'male',13332353333,'IT');
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from staff_info;
+------+----------+------+--------+-------------+---------+
| id   | name     | age  | sex    | phone       | job     |
+------+----------+------+--------+-------------+---------+
|    1 | Alex     |   83 | female | 13651054608 | IT      |
|    2 | Egon     |   26 | male   | 13304320533 | Teacher |
|    3 | nezha    |   25 | male   | 13332353222 | IT      |
|    4 | boss_jin |   40 | male   | 13332353333 | IT      |
+------+----------+------+--------+-------------+---------+
4 rows in set (0.00 sec)

约束条件

"""
约束条件相当于是在字段类型的基础之上添加的额外约束
	eg:id int unsigned
"""
unsigned	让数字没有正负号
zerofill	多余的使用数字0填充
not null	非空
	"""
	新增表数据的方式
		方式1:按照字段顺序一一传值
			insert into t1 values(1,'qq');
		方式2:自定义传值顺序,甚至不传
			insert into t1(name,id) values('qq',1);
			insert into t1(id) values(1);
	在MySQL中不传数据,会使用关键字NULL填充,意思就是空,类似于python的None
	"""
	create table t2(
		id int,
		name varchar(32) not null
	);
	
default		默认值
	"""
	所有的字段都可以设置默认值
		用户不给该字段传值则使用默认的,否则使用传了的
	create table t3(
		id int default 911,
		name varchar(16) default 'qq'
	);
	"""
	
unique		唯一值
	"""
	单列唯一
		create table t4(
			id int,
			name varchar(32) unique
		);
	联合唯一
		create table t5(
			id int,
			host varchar(32),
			port int,
			unique(host,port)
		);
		
primary key	主键
	"""
	但从约束层面上来说,相当于是not null + unique(非空且唯一)
	在此基础之上还可以加快数据的查询

	InnoDB存储引擎规定了一张表必须有且只有一个主键
		因为InnoDB是通过主键的方式来构造表的
		如果没有设置主键
			情况1:没有主键和其他约束条件
				InnoDB会采用隐藏的字段作为主键	不能加快数据的查询
			情况2:没有主键但是有非空且唯一的字段
				自动将该字段升级为主键
				create table t6(
					id int,
					age int not null unique,
					pwd int not null unique
				);
	结论:
		在创建表的时候一点过要设置主键
		并且主键字段一般都是表的id字段(uid sid pid cid)
		create table user(
			id int primary key,
			name varchar(32)
		);
	"""
	
auto_increment	自增
	"""
	由于主键类似于数据的唯一标识,并且主键一般都是数字类型
	我们在添加数据的时候不可能记住接下来的序号是多少,太麻烦
	create table user1(
		id int primary key auto_increment,
		name carchar(32)
	);
	"""

自增的特性

自增不会因为删除操作而回退
	delete from 无法影响自增	#如果有自增id,新增的数据,仍然是以删除前的最后一样作为起始。
		delete from t1;
如果想要重置需要使用truncate关键字
	truncate 表名	# 清空表数据并且重置主键值
		truncate table t1;
上一篇:CodeQL简介及其windows下环境安装


下一篇:mac 通过 brew 安装 mysql-connector-c 时报错