AI智能
改变未来

Mysql数据库概念小记-2

文章目录

  • 6、事务
  • 6.1、事务基本概念
  • 7、索引
    • 7.1、索引的分类
    • 7.2、索引原则
  • 8、权限管理和备份
    • 8.1、用户管理
    • 8.2、MySQL备份
  • 9.规范数据库设计
    • 9.1、为什么需要设计
    • 9.2、三大范式
  • 10、SQL注入
  • 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)唯一的标识,主键不可重复,只能有一个作为主键(单一主键和联合主键)
  • 唯一索引(UNIQUE KEY)
      避免重复的列出现(字段值不能相同),唯一索引可以重复,多个列都可以标为唯一索引
  • 常规索引(KEY / INDEX)
      默认的,index,key关键字来设置
  • 全文索引(FulllText)
      在特定的数据库引擎下才有(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注入

  • 赞(0) 打赏
    未经允许不得转载:爱站程序员基地 » Mysql数据库概念小记-2