文章目录
- 6、事务
- 6.1、事务基本概念
- 7.1、索引的分类
- 7.2、索引原则
- 8.1、用户管理
- 8.2、MySQL备份
- 9.1、为什么需要设计
- 9.2、三大范式
6、事务
6.1、事务基本概念
要么都成功,要么都失败
事务原则:ACID原则-
原子性(Atomicity)
要么都成功,要么都失败
一致性(Consistency)
事务前后数据的完整性必须保持一致
隔离性(Isolation)
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离。
持久性(Durability)
事务一旦提交不可逆,会被持久化写入数据库中
隔离所导致的一些问题
脏读:
指一个事务读取了另外一个事务未提交的数据
不可重复读:
在一个事务内读取表中的某一行数据,多次读取结果不同。(这个不一定是错误,只是某些场合不对)
虚读(幻读)
是指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致。
(一般是行影响,多了一行)
执行事务
-- mysql 默认开始事务自动提交set autocommit=0 --关闭set autocommit=1 --开启(默认的)--手动 处理事务set autocommit=0 --1.关闭自动提交事务--事务开启start transaction --2.标记一个事务的开始,这里开始之后的所有sql语句都在一个事务内--sql语句..... --3.执行sql语句--4.1.提交:持久化commit--4.2.回滚:回到原来的样子rollback--5.事务结束set autocommit=1
模拟场景
--模拟转账set autocommit=0;start transaction --开启一个事务(一组事务)update account set money=money-500 where `name`=\'a\' --a转出500update account set money=money+500 where `name`=\'b\' --b转入500commit;--提交事务,被持久化 无法回滚;rollback;--回滚 数据返回原来值set autocommit=1;--恢复默认值
7、索引
7.1、索引的分类
在一个表中,主键索引只能由一个,唯一索引可以有多个
- 主键索引(PRIMARY KEY)唯一的标识,主键不可重复,只能有一个作为主键(单一主键和联合主键)
- 避免重复的列出现(字段值不能相同),唯一索引可以重复,多个列都可以标为唯一索引
- 默认的,index,key关键字来设置
- 在特定的数据库引擎下才有(1.7说到)
--索引的使用--1.在创建表的时候给字段增加索引--2.创建完毕后,增加索引--使用alter 添加索引语法(索引名可选[])alter table table_name add index index_name (column_list) ;alter table table_name add unique (column_list) ;alter table table_name add primary key (column_list) ;--使用create 添加索引语法(索引名不可选) 不能用CREATE INDEX语句创建PRIMARY KEY索引create index index_name on table_name (column_list) ;create unique index index_name on table_name (column_list) ;--显示所有索引的信息show index from `student`--增加一个全文索引alter table `student` add fulltext `studentname`(`studentname`)--explain 分析sql执行的情况 指标看rows 查看的行数explain select * from `student`;
作用:索引在小数据用处不大,在大数据中区别明显,提高查询效率
7.2、索引原则
- 索引不是越多越好
- 不要对经常变动的数据加索引
- 小数据量的表一般不需要加索引
- 索引一般加在==常用来查询==的字段上
索引的数据结构
Hash 类型的索引
Btree:InnoDB的默认数据结构
MySQL索引背后的数据结构及算法原理:http://blog.codinglabs.org/articles/theory-of-mysql-index.html
8、权限管理和备份
8.1、用户管理
SQL命令操作
用户表:mysql.user
本质:对该表进行增删改查
--创建用户create user an identified by \'123456\'--删除用户drop user an--修改密码(当前用户)set password =password(\'111111\')--修改密码(指定用户)set password for an =password(\'111111\')--重命名rename user an to an2--用户授权 all privileges 全部的权限 ,全部的库全部的表--除了给别人授权 与root用户的差别--root用户的权限: grant all privileges on *.* to \'root\'@\'localhost\' with grant optiongrant all privileges on *.* to an--查询指定用户权限show grants for anshow grants for root@localhost --root需要加主机名字--撤销权限 revoke-- 可以指定库指定表revoke all privileges on *.* from an
8.2、MySQL备份
为什么要备份:
- 保证重要的数据不丢失
- 数据转移
数据库备份的方式:
- 直接拷贝物理文件
- 在可视化工具 导出(结构及数据)
- 使用命令行cmd导出 mysqldump 导入source
# 导出# mysqldump -h 主机 -u用户名 -p密码 数据库 [表名] > 物理磁盘位置/文件名mysqldump -hlocalhost -uroot -p123456 student student > D:/test.sql# mysqldump -h 主机 -u用户名 -p密码 数据库 [表1 表2 ...] > 物理磁盘位置/文件名mysqldump -hlocalhost -uroot -p123456 student student result > D:/test2.sql#导入#登录mysql情况下 source 备份文件source d:/test.sql#未登录 mysql -u用户名 -p密码 数据库 < 文件位置/文件名mysql -uroot -p123456 school < d:/test.sql
9.规范数据库设计
9.1、为什么需要设计
当数据库比较复杂的时候需要设计
设计作用:
- 防止数据冗余,浪费空间-节省内存空间
- 防止数据操作(插入、删除)麻烦、异常【屏蔽使用物理外键】
- 保证数据库完整性
- 方便开发系统-程序性能良好
软件开发中,关于数据库的设计:
- 分析需求:分析业务和需要处理的数据库的需求
- 概要设计:设计关系图-er图
9.2、三大范式
为什么需要数据规范化
- 信息重复
- 更新异常
- 插入异常无法正常显示信息
- 丢失有效信息
三大范式
第一范式(1NF):要求数据库每一列都是==不可分==割的原子数据项
原子性:保证每一列 不可再分
第二范式(2NF):要求每张表**只描述一件事情**
前提:满足第一范式
第三范式(3NF):确保数据表中每一列都与**主键直接相关,而非间接相关**
前提:满足第一第二范式
规范性 和 性能 的问题
- 考虑商业化的需求和目标(成本,用户体验) 数据库的性能更加重要
- 在规范性能问题的时候,需要适当的考虑规范性
- 故意给某些表增加一些冗余字段(从多表查询变成单表查询)
- 故意增加一些计算列(从大数据量降低为小数据量的查询:索引)
10、SQL注入
SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息
- 本质:sql会被拼接
如何防御SQL注入
1、检查变量数据类型和格式
2、过滤特殊符号
3、绑定变量,使用预编译语句-PrepareStatement可以防止sql注入