数据库相关概念

文章介绍了数据库的基本概念,包括索引的种类如普通索引、唯一索引、主键索引和全文索引,以及索引的结构如BTree和Hash。讨论了数据库的三大范式,即1NF、2NF和3NF,强调了事务的ACID特性及不同隔离级别。还提到了视图、触发器和存储过程的功能与应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

索引

索引是用来提高数据的查询效率

在表结构以外,索引会创建新的排序结构,所以在增删改时,需要维护排序结构正确性。导致增删改的效率降低。

索引的分类

  • 普通索引
    只排序,用于提升查询的速度
  • 唯一索引
    要求字段必须唯一,可以为null
  • 主键索引
    主键必须唯一,不能为null
  • 全文索引
    以英文单词为单位来去创建的索引,基本不用【一般用于给文章添加关键字】。
    搜索引擎:ES可以快速在文章中找关键字
  • 空间索引
    针对空间数据类型【向量、坐标】。

索引的结构

  • BTree【B+树】
  • Hash【哈希表】

联合索引

由两个或两个以上的字段共同组成的索引。

  • 特点:

先以第一个字段进行排序,然后第一个字段相同的记录,再按照第二个字段进行排序。
最左前缀原则
索引(a字段、b字段)
在这里插入图片描述

MySql的引擎

  • InnoDb,现在默认引擎
    支持聚集索引和非聚集索引
    主键就是聚集索引,其他索引为非聚集索引

    支持事务

  • MyISAM,以前的默认引擎
    支持全文索引
    都是非聚集索引

    不支持事务
    效率更高

聚集索引和非聚集索引

  • 聚集索引:索引中的每一个结点,就是一条记录
  • 非聚集索引:索引上的每一个结点包含两个部分,一部分是索引字段的值,另一部分是记录所在位置

数据库的三大范式范式

规范关系型数据库的设计

第一范式【1NF】——原子性

数据表的字段是不可再分
不可再分是相对于具体业务需求

第二范式【2NF】——依赖性

一个表应该有一个主键,其他字段都应该依赖于主键。
主键:Primary Key 一个表中,记录的唯一标识。
外键:Foreign Key 字段的约束条件,用来将两个表进行关联。

当一个表中的记录与另一个表中的记录需要进行关联时,在当前表中添加一个外键,与另一个表的主键进行关联。
要求:外键字段的值,必须来源于另一个表。或者只能是null.

第三范式【3NF】——去冗余

主键之外的所有字段,必须直接依赖于主键,不能存在依赖的传递。
存在间接依赖时,会有数据的冗余,此时需要拆分表。

事务

  1. 事务:一组不可分割的SQL语句,这组语句要么都执行成功,要么都执行失败。
  2. 特性ACID

    原子性Atomicity:事物是不可分割的。
    一致性Consistency:事物无论成功还是失败,事务执行前后,数据库的状态时一致的。
    隔离性Isolation:多个事务并发执行,不应该相互影响。
    持久性Durability:事务提交后,对数据库的修改是永久性。

  3. 操作
    开启事务前:
    	begin;
    	or
    	start transaction;
    提交事务:
    	commit;
    回滚事务:
    	rollback;
    
  4. 事物并发问题
    事务的并发会导致数据的不一致性。

脏读
一个事务读取到了另一个事务未提交的数据。
不可重复读
同一事务在读取同一数据时,出现前后两次读取到的数据不一致。
幻读
一个事务,读取不到另一个事务的插入或删除的记录。
在一次事务中,无论执行几次selec * from结果都一样。
若在一次select之前有其他事务的insert/delete操作,则该次seelct会出现幻读。
在这里插入图片描述

  1. 事务的隔离级别
  1. 读未提交 READ-UNCOMMITED
    一个事务可以读取其它事务未提交的数据。
    允许出现脏读、不可重复读、幻读。
  2. 读已提交 READ-COMMITED
    一个事务不会读取另一个事务未提交的数据。
    不允许出现脏读,但是会出现不可重复读、幻读。
  3. 可重复读 REPEATABLE-READ
    一个事务在访问一个记录时,其它事务不能访问这一条记录。
    不会出现脏读、不可重复读,但是会出现幻读。
    MySQL数据库的默认的隔离级别就是可重复读
  4. 串行化/序列化 SARILAZABLE
    事务只能排队操作同一个数据。
    一个事务在访问一张表时,其它事务不能访问。
    不会出现脏读、不可重复读、幻读。
    效率低。
  1. 隔离级别的操作
    Mysql默认可重复读
    Oracle默认读已提交

    1)查看隔离级别:show variables like '%isolation%';
    查看全局隔离级别:SELECT @@GLOBAL.transaction_isolation;
    查看会话隔离级别:SELECT @@SESSION.transaction_isolation;
    2)修改隔离级别:
    设置会话隔离级别:set session transaction isolation level read UNCOMITTED;

  2. 原理
    MySQL InnoDB 引擎下,事务的隔离级别是通过MVCC机制完成,MVCC多版本并发控制。
    MCVV实在执行事务时,根据执行的时间生成数据库的快照。
    读未提交:你做任何事情。
    读已提交:查询语句在查询数据时,只查询事务提交后的记录,未提交的事务,是事务开启前的快照。
    可重复读:查询数据时,只查询当前事务启动前,所有表的快照。
    串行化:不使用MVCC给表添加读锁和写锁。【读锁:是共享锁、多个事务可以同时读取同一数据;写锁:排他锁、当一个事务写数据时,则其他事务不能执行操作。】
    MyISAM引擎不支持事务。

视图View

并不是一张在数据库中存在的表,只是一条查询的SQL语句。他所展示的数据来源于具体的物理表。
可以像使用表一样使用视图。

在进行增删改时,有一定的限制【在于合不合理】,

优点:

1) 可以简化数据库的操作
2) 保护数据,只能部分用户查看部分数据权限。

缺点:

1)不能随便地增删改
2)可能会带来更低的效率

触发器

在一个表进行增insert、删delete、改update操作时,触发一个事件。这个事件可以执行一段SQL语句。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

三种触发器

  1. insert

     使用new访问新的插入记录
    
  2. delete

     使用old访问刚删除的记录
    
  3. update

     使用old访问修改前的记录
     使用new访问修改后的记录
    

触发器时机

  1. Befor 在增删改操作前,执行触发器
  2. After 在增删改操作后,执行触发器

多条SQL

如果一个触发器中包含多条SQL,使用begin-end来包裹SQL语句

create trigger 触发器名 
after/before insert/delete/update
on 表名
for each row
begin
	SQL语句
end

函数和存储过程

类似于Java中的方法。
在数据库中,也可以将SQL封装起来,放在函数或存储过程中。

函数

在这里插入图片描述

  1. 创建函数
ceate function 函数名(参数列表)
Return 返回类型 
deterministic
begin
	SQL语句
end
  1. 调用函数
select 函数名(实参列表);
  1. 函数特点
    1)传递参数、参数只能是入参;
    2)只能返回一个简单的数据,不能返回查询结果集。

存储过程

  1. 创建存储过程
create procedure 过程名(参数列表)
begin
	SQL
end

在这里插入图片描述
3. 调用存储过程

set @a=;
Call 存储过程名(参数列表)

在这里插入图片描述

在这里插入图片描述
5. 特点:
1)参数有三种类型:in 输入/out 返回结果/inout即使输入也是返回结果
2)可以返回结果集,可以返回多个结果。

函数和存储过程的优缺点

优点
1)可以对SQL来进行封装,简化随数据库的操作
2)方便DBA与程序员配合工作。是数据库与系统开发相分离。
3)减少客户端与数据库网络通讯的压力。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值