事务&索引&三大范式


数据库中的事务、索引、以及三大范式

事务

事务的基本原则 ACID

原子性 (Atomicity)

要么都成功,要么都失败

一致性 (Consistency)

事务提交后的数据要保持一致

隔离性 (Isolation)

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

持久性 (Durability)

事务提交后的数据持久化保存在数据库中,提交后不可逆

隔离所导致的一些问题

脏读

一个事务读取了另一个事务未提交的数据

不可重复读

一个事务读取表中某一行时,多次读取的结果不同

虚读或幻读

在一个事务内读取到了另一个事务插入的数据,导致前后数据读取不一致

手动模拟事务执行过程

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

CREATE TABLE `account` (
	`id` INT(10) NOT NULL AUTO_INCREMENT COMMENT '账户id',
	`name` VARCHAR(30) NOT NULL COMMENT '姓名',
	`money` DECIMAL(9,2) NOT NULL COMMENT '账户余额', /*小数点前最多9位,小数点后2位*/
	PRIMARY KEY(`id`)
)ENGINE=INNODB, DEFAULT CHARSET=utf8;

INSERT INTO `account`(`name`,`money`) 
VALUES ('A',1000),('B',1000);

/*
模拟事务的执行过程
例:转账过程
*/
/*关闭自动提交*/
SET autocommit = 0; 
/*开启一个(组)事务*/
START TRANSACTION;
/*执行事务的多条SQL语句*/
UPDATE `account` SET `money`=`money`-500 WHERE `name` = 'A';
UPDATE `account` SET `money`=`money`+500 WHERE `name` = 'B';
/*提交事务,数据持久化*/
COMMIT;
/*回滚*/
ROLLBACK;
/*开启自动提交*/
SET autocommit = 1; 

索引

索引分类

主键索引(PRIMARY KEY)

一张数据表只能有一个主键索引,索引列值不允许有空值,通常在创建表时一起创建。

唯一索引 (UNIQUE KEY)

建立在UNIQUE字段上的索引被称为唯一索引,一张表可以有多个唯一索引,索引列值允许为空,列值中出现多个空值不会发生重复冲突。

普通索引 (KEY/INDEX)

建立在普通字段上的索引被称为普通索引。默认为普通索引。

全文索引 (FULLTEXT)

部分引擎才有,用于快速定位数据

使用方法 (创建表时添加或创建表后再添加)

-- 显示索引
SHOW INDEX FROM student

-- 添加全文索引
ALTER TABLE `school`.`student` ADD FULLTEXT INDEX `studentname`(`studentname`)

-- 分析sql执行情况
EXPLAIN SELECT * FROM `student`
EXPLAIN SELECT * FROM `student` WHERE MATCH(`studentname`) AGAINST('张伟')

索引原则

  • 索引不是越多越好
  • 经常变动的数据不要加索引
  • 小数据量的表不需要加索引
  • 索引一般加在经常查询的字段上

三大范式

第一范式(1NF)

原子性:保证每一列不可再分

第二范式(2NF)

前提:满足第一范式
每张表只描述一个事情

第三范式(3NF)

前提:满足第一范式和第二范式
要确保表的每一列都与主键直接相关,不能间接相关

规范性 vs 性能

  • 关联查询的表不能超过三张
  • 要考虑数据库的性能,有时也可以违反三大范式,故意增加一些冗余列,将多表查询变为单表查询

文章作者: AkiiLucky
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 AkiiLucky !
评论
  目录