一、事务
二、索引
三、权限管理
四、三大范式
一、事务
本质:要么一起成功,要么一起失败
例子:转账(必须同时成功,或同时失败)要是转账时断电了,没转出去钱没了,那太难受了。
事务原则:ACID
A (原子性):要么一起成功,要么一起失败(只有这两个动作)。
C (一致性):事务前后的数据完整性要保持一致,总金额不会增加或减少。
- 100块无论转多少给谁,转出去和自己剩下的一定为100。
I (隔离性):多个用户之间对数据操作互不影响。
- 隔离时导致的问题:
- 脏读:一个事务读取到了另一个事务未提交的数据。
- 不可重复读:一个事务读取某一行,多次读取的数据不一致。
- 幻读:一个事务读取到了别的事务插入的数据,导致前后读取不一致。
D (持久性):根据事务是否提交来执行成功或失败,事务提交后不可逆。
- 当事务成功时,无论是否断电,数据库重启后钱也不会恢复到原状(转账后的状态)。
- 当事务失败时,无论是否断电,数据库重启后钱一定会恢复到原状(转账前的状态)。
-- 创建数据库
create database if not exists changeMoney default character set 'utf8' default collate utf8_general_ci;
-- 创建表
create table shop(
`id` bigint(20) not null auto_increment,
`name` varchar(40) not null,
`money` decimal(40) not null,
primary key(`id`)
)engine = INNODB default charset=utf8;
-- 事务
-- 关闭自动提交
set autocommit = 0;
-- 开启事务
start transaction
update shop set money = money - 1000 where `name` = '张三';
update shop set money = money + 1000 where `name` = '李四';
--提交事务
commit;
--回滚(恢复到未开启事务时)
rollback;
-- (开启自动提交)
set autocommit = 1;
事务提交过程:
二、索引
帮助mysql高效获取数据的数据结构。
索引在小数据量时用处不大,在大数据量时可以显著增加查询速度;
索引创建:create [索引] index 索引名(id_表名_字段名) on 表名(字段名);
索引:
-
主键索引(primary key):唯一的标识,一张表只有一个主键。
-
唯一索引(unique key):避免重复的列出现,可以重复,多个列都可以标识为唯一索引。
-
常规索引(key/index):默认,可以通过key或index关键字来设置。
-
全文索引(FullText):快速定位数据
影响:
-
索引创建完成之后,查询速度变快,但插入和修 改速度变慢。
-
表中数据越多,创建索引越慢。
索引原则:
- 索引不是越多越好。
- 不要对经常变动数据加索引。
- 小数据量不要加索引。
- 索引一般加在常用来查询的字段上。
推荐阅读:https://blog.codinglabs.org/articles/theory-of-mysql-index.html
三、权限管理
1、创建用户
create user 用户名 identified by 密码;
2、修改当前用户密码(MySQL8失效)
set password = password(密码);
3、修改指定用户密码
set password for 用户名 = password(密码);
4、重命名
rename user 就用户名 to 新用户名;
5、授权用户全部权限(授权的用户不能给其他用户授权)
grant all privileges on *.* to 用户名;
6、查询权限
show grants for 用户名;
show grants for root@localhost; (查询root权限)
7、root用户权限
grant all privileges on *.* to ‘root@localhost’ with grants option;
8、撤销权限
revoke all privileges on *.* from 用户名;
9、删除用户
drop user 用户名;
四、数据库备份
备份的原因:
- 保证数据库数据不丢失
- 数据转移
备份的方式:
-
物理拷贝:进入mysql所在文件夹,将data文件拷贝。
-
windows:在windows命令行使用mysqldump进行导出。
- 导出:mysqldump -h 主机 - u 用户名 -p 密码 数据库 [表1,表2,表3…] > 盘符:位置或名称。
-
导入:
- 1、先登录数据库,导入表需要进入数据库才能导入。
- 2、source 盘符:/文件。**
四、三大范式
第一范式(1NF):
原子性,表的每一列只做一件事情。
第二范式(2NF):
满足第一范式,并且每张表只描述一件事情。
第三范式(3NF):
满足第一和第二范式,并且确保表的每一列数据都和主键直接相关,而不能间接相关。
图片来源:https://www.cnblogs.com/wsg25/p/9615100.html
规范数据库的设计:
关联数据库不得超过三张表。
- 考虑商业化的需求和目标(成本、用户体验),数据库的性能更加重要。
- 在规范性能的问题的时候,需要适当的考虑一下规范性。
- 故意给某些表增加一些冗余字段,让多表查询变为单表查询。
- 故意增加一些计算列(从大数据量变为小数据量的查询:索引)