数据库相关概念
索引
索引是用来提高数据的查询效率
在表结构以外,索引会创建新的排序结构,所以在增删改时,需要维护排序结构正确性。导致增删改的效率降低。
索引的分类
- 普通索引
只排序,用于提升查询的速度 - 唯一索引
要求字段必须唯一,可以为null - 主键索引
主键必须唯一,不能为null - 全文索引
以英文单词为单位来去创建的索引,基本不用【一般用于给文章添加关键字】。
搜索引擎:ES可以快速在文章中找关键字 - 空间索引
针对空间数据类型【向量、坐标】。
索引的结构
- BTree【B+树】
- Hash【哈希表】
联合索引
由两个或两个以上的字段共同组成的索引。
- 特点:
先以第一个字段进行排序,然后第一个字段相同的记录,再按照第二个字段进行排序。
最左前缀原则
索引(a字段、b字段)
MySql的引擎
-
InnoDb,现在默认引擎
支持聚集索引和非聚集索引
主键就是聚集索引,其他索引为非聚集索引支持事务
-
MyISAM,以前的默认引擎
支持全文索引
都是非聚集索引不支持事务
效率更高
聚集索引和非聚集索引
- 聚集索引:索引中的每一个结点,就是一条记录
- 非聚集索引:索引上的每一个结点包含两个部分,一部分是索引字段的值,另一部分是记录所在位置
数据库的三大范式范式
规范关系型数据库的设计
第一范式【1NF】——原子性
数据表的字段是不可再分
不可再分是相对于具体业务需求
第二范式【2NF】——依赖性
一个表应该有一个主键,其他字段都应该依赖于主键。
主键:Primary Key 一个表中,记录的唯一标识。
外键:Foreign Key 字段的约束条件,用来将两个表进行关联。
当一个表中的记录与另一个表中的记录需要进行关联时,在当前表中添加一个外键,与另一个表的主键进行关联。
要求:外键字段的值,必须来源于另一个表。或者只能是null.
第三范式【3NF】——去冗余
主键之外的所有字段,必须直接依赖于主键,不能存在依赖的传递。
存在间接依赖时,会有数据的冗余,此时需要拆分表。
事务
- 事务:一组不可分割的SQL语句,这组语句要么都执行成功,要么都执行失败。
- 特性ACID:
原子性Atomicity:事物是不可分割的。
一致性Consistency:事物无论成功还是失败,事务执行前后,数据库的状态时一致的。
隔离性Isolation:多个事务并发执行,不应该相互影响。
持久性Durability:事务提交后,对数据库的修改是永久性。 - 操作
开启事务前: begin; or start transaction; 提交事务: commit; 回滚事务: rollback;
- 事物并发问题
事务的并发会导致数据的不一致性。
脏读:
一个事务读取到了另一个事务未提交的数据。
不可重复读:
同一事务在读取同一数据时,出现前后两次读取到的数据不一致。
幻读:
一个事务,读取不到另一个事务的插入或删除的记录。
在一次事务中,无论执行几次selec * from结果都一样。
若在一次select之前有其他事务的insert/delete操作,则该次seelct会出现幻读。
- 事务的隔离级别
- 读未提交 READ-UNCOMMITED
一个事务可以读取其它事务未提交的数据。
允许出现脏读、不可重复读、幻读。- 读已提交 READ-COMMITED
一个事务不会读取另一个事务未提交的数据。
不允许出现脏读,但是会出现不可重复读、幻读。- 可重复读 REPEATABLE-READ
一个事务在访问一个记录时,其它事务不能访问这一条记录。
不会出现脏读、不可重复读,但是会出现幻读。
MySQL数据库的默认的隔离级别就是可重复读 。- 串行化/序列化 SARILAZABLE
事务只能排队操作同一个数据。
一个事务在访问一张表时,其它事务不能访问。
不会出现脏读、不可重复读、幻读。
效率低。
-
隔离级别的操作
Mysql默认可重复读
Oracle默认读已提交
1)查看隔离级别:show variables like '%isolation%';
查看全局隔离级别:SELECT @@GLOBAL.transaction_isolation;
查看会话隔离级别:SELECT @@SESSION.transaction_isolation;
2)修改隔离级别:
设置会话隔离级别:set session transaction isolation level read UNCOMITTED;
-
原理
MySQL InnoDB 引擎下,事务的隔离级别是通过MVCC机制完成,MVCC多版本并发控制。
MCVV实在执行事务时,根据执行的时间生成数据库的快照。
读未提交:你做任何事情。
读已提交:查询语句在查询数据时,只查询事务提交后的记录,未提交的事务,是事务开启前的快照。
可重复读:查询数据时,只查询当前事务启动前,所有表的快照。
串行化:不使用MVCC给表添加读锁和写锁。【读锁:是共享锁、多个事务可以同时读取同一数据;写锁:排他锁、当一个事务写数据时,则其他事务不能执行操作。】
MyISAM引擎不支持事务。
视图View
并不是一张在数据库中存在的表,只是一条查询的SQL语句。他所展示的数据来源于具体的物理表。
可以像使用表一样使用视图。
在进行增删改时,有一定的限制【在于合不合理】,
优点:
1) 可以简化数据库的操作
2) 保护数据,只能部分用户查看部分数据权限。
缺点:
1)不能随便地增删改
2)可能会带来更低的效率
触发器
在一个表进行增insert、删delete、改update操作时,触发一个事件。这个事件可以执行一段SQL语句。
三种触发器
-
insert
使用new访问新的插入记录
-
delete
使用old访问刚删除的记录
-
update
使用old访问修改前的记录 使用new访问修改后的记录
触发器时机
- Befor 在增删改操作前,执行触发器
- After 在增删改操作后,执行触发器
多条SQL
如果一个触发器中包含多条SQL,使用begin-end来包裹SQL语句
create trigger 触发器名
after/before insert/delete/update
on 表名
for each row
begin
SQL语句
end
函数和存储过程
类似于Java中的方法。
在数据库中,也可以将SQL封装起来,放在函数或存储过程中。
函数
- 创建函数
ceate function 函数名(参数列表)
Return 返回类型
deterministic
begin
SQL语句
end
- 调用函数
select 函数名(实参列表);
- 函数特点
1)传递参数、参数只能是入参;
2)只能返回一个简单的数据,不能返回查询结果集。
存储过程
- 创建存储过程
create procedure 过程名(参数列表)
begin
SQL
end
3. 调用存储过程
set @a=值;
Call 存储过程名(参数列表)
5. 特点:
1)参数有三种类型:in 输入/out 返回结果/inout即使输入也是返回结果
2)可以返回结果集,可以返回多个结果。
函数和存储过程的优缺点
优点:
1)可以对SQL来进行封装,简化随数据库的操作
2)方便DBA与程序员配合工作。是数据库与系统开发相分离。
3)减少客户端与数据库网络通讯的压力。