欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

第62天学习打卡(MySQL 数据库级别的MD5加密 事务 索引)

程序员文章站 2022-06-01 09:13:22
...

数据库中为什么要设置主键及其作用:

数据库主键,指的是一个列或多列的组合,其值能唯一的标识表中的每一行,通过它可强制表的实体完整性。

主键可以用来表示一个精确定位的特定的行,如果没有主键,你就无法精准定位一条记录是否就是你要的相关行记录,这样就会导致更新或删除表中特定的行很困难。

而如果我们有主键来约束行记录的唯一性后,就可以利用主键来解决这个问题。

主键的作用:

1)保证实体的完整性;

2)加快数据库的操作速度。

3) 在表中添加新记录时,DBMS会自动检查新记录的主键值,不允许该值与其他记录的主键值重复。

  1. DBMS自动按主键值的顺序显示表中的记录。如果没有定义主键,则按输入记录的顺序显示表中的记录。

5.3 数据库级别的MD5加密(扩展)

什么是MD5:信息摘要算法

主要增强算法复杂度和不可逆性。

MD5不可逆,具体的值的MD5是一样的

MD5**网站的原理,背后有一个字典,如果**了MD5加密后 的值,就会返回加密前的值

-- ================== 测试MD5加密===================
 CREATE TABLE `testmd5`(
 
 `id` INT(4) NOT NULL,
 `name` VARCHAR(20) NOT NULL,
 `pwd` VARCHAR(50) NOT NULL,
 PRIMARY KEY(`id`)
  
 )ENGINE=INNODB DEFAULT CHARSET=utf8
 
 -- 明文密码
 INSERT  IGNORE INTO testmd5 VALUES(1,'zhangsan','123456'),(2,'lisi','123456'),(3,'wangwu','123456')
 
 -- 加密
UPDATE testmd5 SET pwd=MD5(pwd) WHERE id = 1 -- 加密第一个
UPDATE testmd5 SET pwd=MD5(pwd)  -- 全部加密

 -- 插入的时候加密
 INSERT INTO testmd5 VALUES(4,'xiaoming',MD5('123456'))
 
 -- 如何校验:将用户传递进来的密码,进行md5加密,然后对比加密后的值
 SELECT * FROM testmd5 WHERE `name` = 'xiaoming' AND pwd=MD5('123456')
 
 

6.事务 Transaction(重点 面试)

要么都成功,要么都失败


1.SQL 执行 A 给B转账 A 有1000 -------->转200给 B B原本有200

2.SQL执行 B 收到A的钱 之后 A剩800 ------->B有400


将一组SQL放在一个批次中去执行

事务原则:ACID原则 原子性Atomicity 一致性Consistency 隔离性Isolation 持久性Durability(脏读 ,幻读…)

原子性表示:这两个事务要么同时成功要么同时失败,不能只发生其中一个动作

一致性表示:针对一个事务操作前与操作后的状态一致 即指的是无论怎么转,最后的钱总共只有1200

持久性:表示事务结束后的数据不随着外界原因导致数据丢失

操作前:A:1000 B:200

操作后:A:800 B:400

如果在操作前(事务还没来得及提交)服务器宕机或者断电,那么重启数据库后,数据状态为:

A:1000 B:200

如果在操作后(事务已经提交)服务器宕机或者断电,那么重启数据库后,数据状态为:

A:800 B:400

事务没有提交,恢复到原状

事务已经提交,持久化到数据结构,数据一旦提交就不可逆

隔离性:事务的隔离性是多个用户并发访问数据时,数据库为每个用户开启的事务,不能被其他事务的操作数据 所干扰,事务之间要相互隔离。

针对多个用户同时操作,主要是排除其他事务对本次事务的影响

比如A给B转账 C给B转账 这两个事务是不影响的因为有隔离性

隔离所导致的一些问题

**脏读:**指的是一个事务读取了另外一个事务没有提交的数据

**不可重复读:**在一个事务内读取表中的某一行数据,多次读取结果不同(着不一定是错误,只是某些场合不对)

比如页面统计查询值 B原本查询为200 当再次查询时变为B=400(因为点击生成表的时候,B有人转账进来了200(事务已提交))

**虚读(幻读):**是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。(一般是行影响,多了一行)

执行事务

-- ====================事务===================
-- mysql是默认开启事务自动提交的
SET autocommit = 0 /*关闭事务*/ 
SET autocommit = 1 /*开启事务(默认的)*/

-- 手动处理事务
SET autocommit = 0   -- 关闭自动提交
-- 事务开启
START TRANSACTION  -- 标记一个事务的开始,从这个之后的sql都在同一个事务内
 
 
 INSERT  xxx
 
 INSERT  xxx
 
 
 -- 提交:持久化(成功提交!)
 COMMIT
 -- 回滚: 回到原来是样子(提交失败)
ROLLBACK
 
 -- 事务结束
 SET autocommit = 1   -- 开启自动提交
 
 
 -- 了解
 SAVEPOINT  保存点 -- 设置一个事务的保存点
 ROLLBACK TO SAVEPOINT 保存点 -- 回滚到保存点
 RELEASE SAVEPOINT  保存点 -- 撤销保存点
 
 

模拟转账场景

-- 模拟事务   转账
 
 CREATE DATABASE shop CHARACTER SET utf8 COLLATE utf8_general_ci
 
 USE shop
 
CREATE TABLE `account`(
`id` INT(3) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(30) NOT NULL,
`money`DECIMAL(9,2) NOT NULL,
PRIMARY KEY(`id`)

)ENGINE=INNODB DEFAULT CHARSET=utf8
 
 INSERT INTO `account`(`name`,`money`)
 VALUES ('A',2000.00),('B',10000.00)
 
 -- 模拟转账:事务
 SET autocommit = 0; -- 关闭自动提交
 START TRANSACTION -- 开启一个事务(一组事务)
 
 UPDATE `account` SET money=money-500 WHERE `name` = 'A' -- A减500
 UPDATE `account` SET money=money+500 WHERE `name` = 'B' -- B加500
 
 COMMIT; -- 提交事务,一旦提交就被持久化了
 ROLLBACK; -- 回滚
 SET autocommit = 1; -- 恢复默认值
 

7索引

MySQL 官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。

提取句子主干,就可以得到索引的本质:索引是数据结构

7.1 索引的分类

在一个表中,主键索引只能有一个,唯一索引可以有多个

主键索引(PRIMARY KEY)

​ 唯一的标识,主键不可重复,只能有一个列作为主键

唯一索引(UNIQUE KEY)

​ 避免重复的列出现,唯一索引可以重复,多个列都可以标识为唯一索引

常规索引(KEY / INDEX)

​ 默认的,index / key 关键字设置

全文索引(FullText)

​ 在特定的数据库引擎下才有, MyISAM

​ 快速定位数据

关于MySQL 优化 看懂 explain 的博客地址:https://blog.csdn.net/jiadajing267/article/details/81269067

基础语法

 -- 索引的使用
  -- 1.在创建表的时候给字段增加索引
  -- 2.创建完毕后,增加索引
  
  
  -- 显示所有的索引信息
  SHOW INDEX FROM student
 
 -- 增加一个全文索引(索引名) 列名
 ALTER TABLE school.student ADD FULLTEXT INDEX `studentname`(`studentname`);
 
 -- EXPLAIN 分析sql执行的情况
 EXPLAIN SELECT * FROM student;-- 非全文索引
 
 EXPLAIN SELECT * FROM student WHERE MATCH(studentname) AGAINST('赵')
 
相关标签: mysql