数据库

数据库知识点

(1)存储引擎

存储引擎
数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。

存储引擎主要有: 1. MyIsam , 2. InnoDB, 3. Memory, 4. Archive, 5. Federated 6.TokuDB

(2)InnoDB(B+树)

InnoDB 底层存储结构为B+树, B树的每个节点对应innodb的一个page, page大小是固定的,一般设为 16k。其中非叶子节点只有键值,叶子节点包含完成数据。

InnoDB
适用场景:
1)经常更新的表,适合处理多重并发的更新请求。
2)支持事务。
3)可以从灾难中恢复(通过 bin-log 日志等)。
4)外键约束,只有这个引擎支持外键。
5)支持自动增加列属性 auto_increment。

(3)TokuDB( Fractal Tree-节点带数据)

TokuDB 底层存储结构为 Fractal Tree,Fractal Tree 的结构与 B+树有些类似, 在 Fractal Tree中, 每一个 child 指针除了需要指向一个 child 节点外,还会带有一个 Message Buffer ,这个Message Buffer 是一个 FIFO 的队列,用来缓存更新操作。

例如,一次插入操作只需要落在某节点的 Message Buffer 就可以马上返回了,并不需要搜索到叶子节点。这些缓存的更新会在查询时或后台异步合并应用到对应的节点中。

TukuDB
TokuDB 在线添加索引,不影响读写操作, 非常快的写入性能, Fractal-tree 在事务实现上有优势。 他主要适用于访问频率不高的数据或历史数据归档。

(4)MyIASM

MyIASM是 MySQL默认的引擎,但是它没有提供对数据库事务的支持,也不支持行级锁外键,因此当 INSERT(插入)或 UPDATE(更新)数据时即写操作需要锁定整个表,效率便会低一些。

ISAM 执行读取操作的速度很快,而且不占用大量的内存和存储资源。在设计之初就预想数据组织成有固定长度的记录,按顺序存储的。

ISAM 是一种静态索引结构。

缺点是它不支持事务处理。

(5)Memory

Memory(也叫 HEAP)堆内存:使用存在内存中的内容来创建表。每个 MEMORY 表只实际对应一个磁盘文件。 MEMORY 类型的表访问非常得快,因为它的数据是放在内存中的,并且默认使用HASH 索引。但是一旦服务关闭,表中的数据就会丢失掉。 Memory 同时支持散列索引和 B 树索引, B树索引可以使用部分查询和通配查询,也可以使用<,>和>=等操作符方便数据挖掘,散列索引相等的比较快但是对于范围的比较慢很多。

(6)索引

索引(Index)是帮助 MySQL 高效获取数据的数据结构。 常见的查询算法、顺序查找、二分查找、二叉排序树查找、分块查找、平衡多路搜索树 B 树(B-tree)、哈希散列法。

常见索引原则:

  1. 选择唯一性索引
    唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录。

  2. 为经常需要排序分组联合操作的字段建立索引。

  3. 为常作为查询条件的字段建立索引。

  4. 限制索引的数目:
    越多的索引,会使更新表变得很浪费时间。

  5. 尽量使用数据量少的索引。

  6. 如果索引的值很长,那么查询的速度会受到影响。

  7. 尽量使用前缀来索引。

  8. 如果索引字段的值很长,最好使用值的前缀来索引。

  9. 删除不再使用或者很少使用的索引。

  10. 最左前缀匹配原则,非常重要的原则。

  11. 尽量选择区分度高的列作为索引。
    区分度的公式是表示字段不重复的比例。

  12. 索引列不能参与计算,保持列“干净”:带函数的查询不参与索引。.

  13. 尽量的扩展索引,不要新建索引。

(7)数据库三范式

范式是具有最小冗余的表结构。 三范式解析如下:

第一范式(1st NF - 列都是不可再分)

第一范式的目标是确保每列的原子性:如果每列都是不可再分的最小数据单元(也称为最小的原子单元),则满足第一范式(1NF)。
第一范式
第二范式(2nd NF- 每个表只描述一件事情)

首先满足第一范式,并且表中非主键列不存在对主键的部分依赖。 第二范式要求每个表只描述一件事情。

第二范式
第三范式(3rd NF- 不存在对非主键列的传递依赖)

第三范式定义是,满足第二范式,并且表中的列不存在对非主键列的传递依赖。 除了主键订单编号外,顾客姓名依赖于非主键顾客编号。

第三范式

(8)数据库事务

事务(TRANSACTION)是作为单个逻辑工作单元执行的一系列操作, 这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行 。 事务是一个不可分割的工作逻辑单元。

事务必须具备以下四个属性,简称 ACID 属性。

原子性(Atomicity)
1. 事务是一个完整的操作。事务的各步操作是不可分的(原子的);要么都执行,要么都不执行。
一致性(Consistency)
2. 当事务完成时,数据必须处于一致状态。
隔离性(Isolation)
3. 对数据进行修改的所有并发事务是彼此隔离的, 这表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务。
永久性(Durability)
4. 事务完成后,它对数据库的修改被永久保持,事务日志能够保持事务的永久性。

(9)存储过程(特定功能的 SQL 语句集)

一组为了完成特定功能的 SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。存储过程是数据库中的一个重要对象。

存储过程优化思路:
1. 尽量利用一些 sql 语句来替代一些小循环,例如聚合函数,平均函数等。
2. 中间结果存放于临时表,加索引。
3. 少使用游标。 sql 是个集合语言,对于集合运算具有较高性能。而 cursors 是过程运算。比如对一个 100 万行的数据进行查询。游标需要读表 100 万次,而不使用游标则只需要少量几次读取。
4. 使用 try-catch 处理错误异常。
5. 查找语句尽量不要放在循环内。
6. 事务越短越好。 sql server 支持并发操作。如果事务过多过长,或者隔离级别过高,都会造成并发操作的阻塞,死锁。导致查询极慢, cpu 占用率极高。

(10)触发器(一段能自动执行的程序)

触发器是一段能自动执行的程序,是一种特殊的存储过程, 触发器和普通的存储过程的区别是:触发器是当对某一个表进行操作时触发。 诸如: update、 insert、 delete 这些操作的时候,系统会自动调用执行该表上对应的触发器。 SQL Server 2005 中触发器可以分为两类: DML 触发器和DDL 触发器,其中 DDL 触发器它们会影响多种数据定义语言语句而激发,这些语句有 create、alter、 drop 语句。

(11)数据库并发策略

并发控制一般采用三种方法,分别是乐观锁和悲观锁以及时间戳。

乐观锁
乐观锁认为一个用户读数据的时候,别人不会去写自己所读的数据。
悲观锁就刚好相反,觉得自己读数据库的时候,别人可能刚好在写自己刚读的数据,其实就是持一种比较保守的态度。
时间戳就是不加锁,通过时间戳来控制并发出现的问题。

悲观锁
悲观锁就是在读取数据的时候,为了不让别人修改自己读取的数据,就会先对自己读取的数据加锁,只有自己把数据读完了,才允许别人修改那部分数据,或者反过来说,就是自己修改某条数据的时候,不允许别人读取该数据,只有等自己的整个事务提交了,才释放自己加上的锁,才允许其它用户访问那部分数据。

时间戳
时间戳就是在数据库表中单独加一列时间戳,比如“TimeStamp”, 每次读出来的时候,把该字段也读出来,当写回去的时候,把该字段加1,提交之前 ,跟数据库的该字段比较一次,如果比数据库的值大的话,就允许保存,否则不允许保存,这种处理方法虽然不使用数据库系统提供的锁机制,但是这种方法可以大大提高数据库处理的并发量。

以上悲观锁所说的加“锁”,其实分为几种锁,分别是: 排它锁(写锁) 和共享锁(读锁)

(12)数据库锁

行级锁

行级锁是一种排他锁,防止其他事务修改此行;在使用以下语句时, Oracle 会自动应用行级锁:

  1. INSERT、 UPDATE、 DELETE、 SELECT … FOR UPDATE [OF columns] [WAIT n | NOWAIT]。
  2. SELECT … FOR UPDATE 语句允许用户一次锁定多条记录进行更新。
  3. 使用 COMMIT 或 ROLLBACK 语句释放锁。

表级锁

表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分 MySQL 引擎支持。最常使用的 MYISAM 与 INNODB 都支持表级锁定。表级锁定分为表共享读锁(共享锁)与表独占写锁(排他锁)。

页级锁
页级锁是 MySQL 中锁定粒度介于行级锁和表级锁中间的一种锁。表级锁速度快,但冲突多,行级冲突少,但速度慢。所以取了折衷的页级,一次锁定相邻的一组记录。 BDB 支持页级锁。

(13)Redis 分布式锁

  1. 获取锁的时候,使用 setnx(SETNX key val:当且仅当 key 不存在时, set 一个 key为 val 的字符串,返回 1;若 key 存在,则什么都不做,返回 0)加锁,锁的 value值为一个随机生成的 UUID,在释放锁的时候进行判断。 并使用 expire 命令为锁添加一个超时时间,超过该时间则自动释放锁。

  2. 获取锁的时候调用 setnx, 如果返回 0,则该锁正在被别人使用,返回 1 则成功获取锁。 还设置一个获取的超时时间,若超过这个时间则放弃获取锁。

  3. 获取锁的时候调用 setnx, 如果返回 0,则该锁正在被别人使用,返回 1 则成功获取锁。 还设置一个获取的超时时间,若超过这个时间则放弃获取锁。

(14)分区分表

分库分表有垂直切分和水平切分两种。

垂直切分(按照功能模块)
将表按照功能模块、关系密切程度划分出来, 部署到不同的库上。例如,我们会建立定义数据库 workDB、用户数据库 userDB、日志数据库 logDB 等,分别用于存储项目数据定义表、用户数据表、日志数据表等。
垂直切分
水平切分(按照规则划分存储)
当一个表中的数据量过大时,我们可以把该表的数据按照某种规则,例如 userID 散列,进行划分,然后存储到多个结构相同的表,和不同的库上。

水平切分

(15)CAP

CAP 原则又称 CAP 定理,指的是在一个分布式系统中, Consistency(一致性)、 Availability (可用性)、Partition tolerance(分区容错性),三者不可得兼。

一致性(C):

  1. 在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份 最新的数据副本)

可用性(A):
2. 在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性)

分区容忍性(P):
3. 以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性, 就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值