事务,视图,索引

事务:一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。
事务的属性:
原子性:事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生;
一致性:事务必须使数据库从一个一致状态变换到另外一个一致状态;
隔离性:一个事务的执行不受其他事务的干扰;
持久性:一个事务一旦被提交,它对数据库的改变就是永久的。

事务的创建

隐式事务:事务没有明显的开启和结束。
显式事务:设置提交功能为禁用,事务具有明显的开启和结束的标记
步骤1:开启事务
set autocommit=0;
start transaction;# 可以省略
步骤2:编写事务中的sql语句
语句1;
语句2;
步骤3:结束事务
commit;或者rollback;

数据库的隔离级别

对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采用必要的隔离机制,就会导致各种并发问题:
脏读:对于两个事务T1、T2,T1读取了已经被T2更新但还没有被提交的字段。之后,若T2回滚,T1读取的内容就是临时且无效的。
不可重复读:对于两个事务T1、T2,T1读取了一个字段,然后T2更新了该字段。之后,T1再次读取同一个字段,值就不同了。
幻读:对于两个事务T1、T2,T1从一个表中读取了一个字段,然后T2在该表中插入了一些新的行。之后,若T1再次读取同一个表,就会多出几行。

视图

从mysql5.0.1版本开始提供视图功能。一种虚拟存在的表,行和列的数据来自自定义视图的查询中使用的表,并且是在使用视图时动态生成的,只保存了sql逻辑,不保存查询结果。

创建视图:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
/*
语法:
create view 视图名
as
查询语句;
*/
# 查询邮箱中包含a字符的员工名、部门名和工种信息
CREATE VIEW myview1
AS
SELECT last_name,department_name,job_title FROM employees e
JOIN departments d ON e.department_id=d.department_id
JOIN jobs j ON e.job_id=j.job_id;

SELECT * FROM myview1 WHERE last_name LIKE "%a%";

好处:
1.重用sql语句
2.简化复杂的sql操作,不必知道它的查询细节
3.保护数据,提高安全性

删除视图:drop view 视图名1,视图名2,…
视图与表的区别:
视图只是保留了sql逻辑,没有保存数据,虽然可以增删改查,但是一般只作查询使用。

索引的分类

索引是帮助数据库高效获取数据的数据结构。建立索引时会将数据排序,类似于图书的目录,根据目录中的索引查找到对应的页码。
分为:

  • 主键索引(primary key)
    • 唯一的标识,主键不可重复,只能由一个列作为主键
  • 唯一索引(unique key)
    • 避免重复列的出现,唯一索引可以重复,多个列都可以标识为唯一索引
  • 常规索引 (key/index)
    • 默认的
  • 全文索引(fulltext)
    • 特定的数据库引擎才有

创建索引的三种方式

方式一:创建表的时候

1
2
3
4
5
6
7
CREATE TABLE user(
id INT,
name varchar(20),
age TINYINT,
PRIMARY KEY (`id`),
UNiQUE KEY `UX_name` (`name`)
)

方式二:使用alter table命令,创建普通索引、UNIQUE索引或PRIMARY KEY索引。

1
ALTER TABLE table_name ADD INDEX index_name (column_list);

方式三:使用create index命令,增加普通索引或unique索引

1
CREATE INDEX index_name ON table_name (column_list);

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

索引原则

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