MYSQL学习笔记(六)事物,索引,备份,视图,表锁,触发器

1.Mysql事务:

就是将一组的SQL语句放在一个批次去执行,要是一条语句出错,该批次的SQL语句都会取消执行。

Mysql事物处理只支持InnoDB和BDB数据表类型。

1.1 事物的ACID原则:

原子性(Atomic):

事物中的SQL语句要么全部执行,要么全不执行,不可能停滞在中间的某个状态,若在执行中发生了错误,会进行事物的回滚(RollBack)即从事物开始处重新执行,就像从来没有执行过一样。

一致性(Consist):

一致性是指事务必须使得数据库从一个一致性状态转变到另一个一致性状态,也就是说事务在执行前,执行后都必须处于一致性状态。

拿转账转账来说,开始时A,B账户上共有100元,然后A,B之间无论进行怎样的转账操作,结束后A,B账户上还是有100元,这就是一致性。

隔离性(Isolated):

当多个用户并发的访问数据库,比如都操作一张表,数据库给每个用户开启的事物之间不能互相干扰,多个并发事物要相互隔离。

持久性(Durability):

持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

隔离所导致的一些问题

  • 脏读:指一个事务读取了另外一个事务未提交的数据
  • 不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同
  • 幻读:指在一个事务内读取到了别的事务插入的数据,导致前后读取不一致

1.2 Mysql事物的实现方法:

/*使用set语句来改变自动提交模式 */
SET autocommit = 0;   /*关闭*/
SET autocommit = 1;   /*开启*/

/* 注意
    1.MySQL中默认是自动提交
    2.使用事务时应先关闭自动提交
*/

/*开始一个事务,标记事务的起始点,在这之后的sql都是在同一个事务内*/
START TRANSACTION   

/*提交一个事务给数据库*/
COMMIT

/*将事务回滚,数据回到本次事务的初始状态*/
ROLLBACK

/*还原MySQL数据库的自动提交*/
SET autocommit =1;

-- 保存点
    SAVEPOINT 保存点名称 -- 设置一个事务保存点
    ROLLBACK TO SAVEPOINT 保存点名称 -- 回滚到保存点
    RELEASE SAVEPOINT 保存点名称 -- 删除保存点

1.3 Mysql事物的处理步骤:

首先关闭自动提交(set autocommit = 0)-----》开始一个事务,标记事务的起始点(start transaction)-----》提交事务(commit)/ 回滚(rollback)

还原Mysql数据库的自动提交(set autocommit = 1)
在这里插入图片描述

/*
课堂测试题目

A在线买一款价格为500元商品,网上银行转账.
A的银行卡余额为2000,然后给商家B支付500.
商家B一开始的银行卡余额为10000

创建数据库shop和创建表account并插入2条数据
*/

CREATE DATABASE `shop` CHARACTER SET utf8 COLLATE utf8_general_ci; 
USE `shop`; 

CREATE TABLE `account` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(32) NOT NULL,
  `cash` DECIMAL(9,2) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8

INSERT INTO account (`name`,`cash`)
VALUES('A',2000.00),('B',10000.00)

# 转账实现
SET autocommit = 0;--关闭自动提交
START TRANSACTION;--开启一个事物
UPDATE account SET cash=cash-500 WHERE `name`='A';
UPDATE account SET cash=cash+500 WHERE `name`='B';
COMMIT;
# rollback;
SET autocommit = 1; --恢复默认值

2.数据库的索引:

2.1索引的作用:
提高查询的速度
确保数据的唯一性
可以加速表表之间的连接,实现表表之间的参照完整性
使用分组和排序子句进行数据检索时,可以显著的减少分组和排序的时间
全文检索字段进行搜索简化

2.2索引的分类:

主键索引(Primary key)
唯一索引(Unique)
常规索引(Index)
全文索引(FullText)

主键索引:
主键:某个属性组可以唯一的标识一条记录。
特点:
最常见的索引类型
确保数据记录的唯一性
确定特定数据记录在数据库中的位置

唯一索引:
作用:避免同一个表中,数据列中值的重复
和主键索引的区别:主键索引只能有一个,唯一索引可以有多个

常规索引:
作用:快速定位特定数据
注意:
INDEX和KEY都可以设置常规索引
应加在查询找条件的字段
不宜添加太多的常规索引,影响数据的插入,删除,修改操作
在这里插入图片描述
全文索引:
作用:快速定位特定数据
注意:
只能用于MyISAM类型的数据表
只能用于 varchar,text,char数据列类型
适合大型数据集

2.3创建 / 删除索引:

/*
#方法一:创建表时
      CREATE TABLE 表名 (
                字段名1  数据类型 [完整性约束条件…],
                字段名2  数据类型 [完整性约束条件…],
                [UNIQUE | FULLTEXT | SPATIAL ]   INDEX | KEY
                [索引名]  (字段名[(长度)]  [ASC |DESC]) 
                );


#方法二:CREATE在已存在的表上创建索引
        CREATE  [UNIQUE | FULLTEXT | SPATIAL ]  INDEX  索引名 
                     ON 表名 (字段名[(长度)]  [ASC |DESC]) ;


#方法三:ALTER TABLE在已存在的表上创建索引
        ALTER TABLE 表名 ADD  [UNIQUE | FULLTEXT | SPATIAL ] INDEX
                             索引名 (字段名[(长度)]  [ASC |DESC]) ;
                             
                             
#删除索引:DROP INDEX 索引名 ON 表名字;
#删除主键索引: ALTER TABLE 表名 DROP PRIMARY KEY;


#显示索引信息: SHOW INDEX FROM student;
*/

/*增加全文索引*/
ALTER TABLE `school`.`student` ADD FULLTEXT INDEX `studentname` (`StudentName`); 

/*EXPLAIN : 分析SQL语句执行性能*/
EXPLAIN SELECT * FROM student WHERE studentno='1000';

/*使用全文索引*/
EXPLAIN SELECT *FROM student WHERE MATCH(studentname) AGAINST('love');

索引在小数据量时作用不大,但是在大数据的时候区别十分明显

2.4索引的准则:

索引不是越多越好
不要对经常变动的数据加索引
小数据量的表不建议加索引
索引一般应加在查找条件的字段

2.5索引的两大类型:hash 和 btree

hash:查询单条快,查询范围慢;

btree:b+树,层数越多,数据量指数级增长,我们就用它,因为innodb默认支持他

#我们可以在创建上述索引的时候,为其指定索引类型,分两类
hash类型的索引:查询单条快,范围查询慢
btree类型的索引:b+树,层数越多,数据量指数级增长(我们就用它,因为innodb默认支持它)

#不同的存储引擎支持的索引类型也不一样
InnoDB 支持事务,支持行级别锁定,支持 B-tree、Full-text 等索引,不支持 Hash 索引;
MyISAM 不支持事务,支持表级别锁定,支持 B-tree、Full-text 等索引,不支持 Hash 索引;
Memory 不支持事务,支持表级别锁定,支持 B-tree、Hash 等索引,不支持 Full-text 索引;
NDB 支持事务,支持行级别锁定,支持 Hash 索引,不支持 B-tree、Full-text 等索引;
Archive 不支持事务,支持表级别锁定,不支持 B-tree、HashFull-text 等索引;

3.Mysql的备份:

数据库备份的重要性:保证重要数据不会丢失,方便数据的转移

Mysql数据库备份的方法:数据库管理工具 eg:navicat;直接拷贝数据库文件和相关配置文件;Mysqldump命令行导出。

--Mysqldump -h主机-u用户名 -p密码 数据库 [表名1 表名2 表名3] >物理磁盘位置/文件名
Mysqldump -hlocalhost -uroot -p123456 school student >D:/a.sql
--导入
--登陆的情况下切换到指定的数据库
--source备份文件
source d:/a.sql

mysql -u用户名 -p密码 库名<备份文件

4.视图:

/* 视图 ------------------
什么是视图:
    视图是一个虚拟表,其内容由查询定义。同真实的表一样,视图包含一系列带有名称的列和行数据。但是,视图并不在数据库中以存储的数据值集形式存在。行和列数据来自由定义视图的查询所引用的表,并且在引用视图时动态生成。
    视图具有表结构文件,但不存在数据文件。
    对其中所引用的基础表来说,视图的作用类似于筛选。定义视图的筛选可以来自当前或其它数据库的一个或多个表,或者其它视图。通过视图进行查询没有任何限制,通过它们进行数据修改时的限制也很少。
    视图是存储在数据库中的查询的sql语句,它主要出于两种原因:安全原因,视图可以隐藏一些数据,如:社会保险基金表,可以用视图只显示姓名,地址,而不显示社会保险号和工资数等,另一原因是可使复杂的查询易于理解和使用。
 */
-- 创建视图
CREATE [OR REPLACE] [ALGORITHM = {
   
   UNDEFINED | MERGE | TEMPTABLE}] VIEW view_name [(column_list)] AS select_statement
    - 视图名必须唯一,同时不能与表重名。
    - 视图可以使用select语句查询到的列名,也可以自己指定相应的列名。
    - 可以指定视图执行的算法,通过ALGORITHM指定。
    - column_list如果存在,则数目必须等于SELECT语句检索的列数

-- 查看结构
    SHOW CREATE VIEW view_name 

-- 删除视图
    - 删除视图后,数据依然存在。
    - 可同时删除多个视图。
    DROP VIEW [IF EXISTS] view_name ...

-- 修改视图结构
    - 一般不修改视图,因为不是所有的更新视图都会映射到表上。
    ALTER VIEW view_name [(column_list)] AS select_statement

-- 视图作用
    1. 简化业务逻辑
    2. 对客户端隐藏真实的表结构

-- 视图算法(ALGORITHM)
    MERGE        合并
        将视图的查询语句,与外部查询需要先合并再执行!
    TEMPTABLE    临时表
        将视图执行完毕后,形成临时表,再做外层查询!
    UNDEFINED    未定义(默认),指的是MySQL自主去选择相应的算法。

5.锁表

/* 锁表 */
表锁定只用于防止其它客户端进行不正当地读取和写入
MyISAM 支持表锁,InnoDB 支持行锁
-- 锁定
    LOCK TABLES tbl_name [AS alias]
-- 解锁
    UNLOCK TABLES

6.触发器:

/* 触发器 */ ------------------
    触发程序是与表有关的命名数据库对象,当该表出现特定事件时,将激活该对象
    监听:记录的增加、修改、删除。

-- 创建触发器
CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt
    参数:
    trigger_time是触发程序的动作时间。它可以是 before 或 after,以指明触发程序是在激活它的语句之前或之后触发。
    trigger_event指明了激活触发程序的语句的类型
        INSERT:将新行插入表时激活触发程序
        UPDATE:更改某一行时激活触发程序
        DELETE:从表中删除某一行时激活触发程序
    tbl_name:监听的表,必须是永久性的表,不能将触发程序与TEMPORARY表或视图关联起来。
    trigger_stmt:当触发程序激活时执行的语句。执行多个语句,可使用BEGIN...END复合语句结构

-- 删除
DROP TRIGGER [schema_name.]trigger_name

可以使用old和new代替旧的和新的数据
    更新操作,更新前是old,更新后是new.
    删除操作,只有old.
    增加操作,只有new.

-- 注意
    1. 对于具有相同触发程序动作时间和事件的给定表,不能有两个触发程序。

-- 字符连接函数
concat(str1[, str2,...])

-- 分支语句
if 条件 then
    执行语句
elseif 条件 then
    执行语句
else
    执行语句
end if;

-- 修改最外层语句结束符
delimiter 自定义结束符号
    SQL语句
自定义结束符号

delimiter ;        -- 修改回原来的分号


-- 语句块包裹
begin
    语句块
end

猜你喜欢

转载自blog.csdn.net/jingli456/article/details/113564866