数据库复习

1.数据库设计三范式

满足的范式越高,数据库的数据冗余越少

(1)第一范式:数据库表不包含多值属性。(属性的值是不可分割的原子数据,而不是数组或者集合)

(2)第二范式:满足第一范式的基础上,要求非主属性必须完全依赖于主键,而不是依赖于 主键的一部分。

(3)第三范式:满足第二范式的基础上,要求非主属性不能依赖于其他非主属性。


2.数据库索引

(1)数据库索引是对数据库表中一个或多个列进行排序的结构。

(2)索引的分类:普通索引(没有任何限制),唯一索引(索引列的值唯一),主键索引(主键会默认创建索引,因此主键索引是特殊的唯一索引),组合索引(对两个或多于两个列建立的索引,最左前缀:加速查询只适用于搜索列是索引的最左部分)。

(3)聚簇索引(只有InnoDB和solidDB拥有):聚簇索引不是一种特定的索引类型,而是一种数据的存储方式。聚簇索引建立的B树,其叶节点保存了索引以及数据行,而非聚簇索引,叶节点只保存行号。

非聚簇索引


聚簇索引

聚簇索引的数据的物理存放顺序与索引顺序是一致的,即:只要索引是相邻的,那么对应的数据一定也是相邻地存放在磁盘上的。

聚簇索引的优点:

A:可以把相关数据保存在一起,如:实现电子邮箱时,可以根据用户ID来聚集数据,这样只需要从磁盘读取少量的数据页就能获取某个用户全部邮件,如果没有使用聚集索引,则每封邮件都可能导致一次磁盘IO。

B:数据访问更快,聚集索引将索引和数据保存在同一个btree中,因此从聚集索引中获取数据通常比在非聚集索引中查找要快

C:使用覆盖索引扫描的查询可以直接使用页节点中的主键值

聚簇索引的缺点:

A:聚簇数据最大限度地提高了IO密集型应用的性能,但如果数据全部放在内存中,则访问的顺序就没有那么重要了,聚集索引也没有什么优势了

B:插入速度严重依赖于插入顺序,按照主键的顺序插入是加载数据到innodb表中速度最快的方式,但如果不是按照主键顺序加载数据,那么在加载完成后最好使用optimize table命令重新组织一下表

C:更新聚集索引列的代价很高,因为会强制innodb将每个被更新的行移动到新的位置

D:基于聚集索引的表在插入新行,或者主键被更新导致需要移动行的时候,可能面临页分裂的问题,当行的主键值要求必须将这一行插入到某个已满的页中时,存储引擎会将该页分裂成两个页面来容纳该行,这就是一次页分裂操作,页分裂会导致表占用更多的磁盘空间

E:聚集索引可能导致全表扫描变慢,尤其是行比较稀疏,或者由于页分裂导致数据存储不连续的时候

F:二级索引可能比想象的更大,因为在二级索引的叶子节点包含了引用行的主键列。

G:二级索引访问需要两次索引查找,而不是一次


3.数据库事务

3.1 ACID

(1)Atomicity(原子性):一个事务中的操作以原子方式执行,不可分割。

(2)Consistency(一致性)事 务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统 运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是 不一致的状态。

(3)Isolation(隔离性):一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。

(4)Durability(持久性):事务结束后对数据的修改是永久的。

3.2 四种隔离级别

参考:www.open-open.com/lib/view/open1477901691009.html

SQL标准定义的四种隔离级别:

(1)Read Uncommitted:在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。

(2)Read Committed:这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。

(3)Repeatable Read:这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。

(4)Serializable:这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。

脏读:读取到未提交的数据。

不可重复读:在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间,有另外一个事务更新的原有的数据。

幻读:幻读问题是指一个事务的两次不同时间的相同查询返回了不同的的结果集。例如:一个 select 语句执行了两次,但是在第二次返回了第一次没有返回的行,那么这些行就是“phantom” row。

如何避免幻读:由于 SESSION_A 第一次的查询开始于 SESSION_B 插入数据前,所以创建了一个以SELECT操作的时间为基准点的 read view,避免了幻读的产生。所以在 SESSION_A 的事务结束前,无法看到 SESSION_B 对表 read_view 做出的任何更改 (insert,delete,update)

大致的区别在于不可重复读是由于另一个事务对数据的更改所造成的而幻读是由于另一个事务插入或删除引起的。

隔离级别

3.3 乐观锁和悲观锁

(1)乐观锁:乐观锁假设数据一般情况下不会造成冲突,因此在提交更新的时候才对数据是否存在冲突进行检验。如果存在数据冲突则更新失败。具体的实现是位数据库表添加一个version字段,每次更新操作都会修改version。提交时使用CAS操作修改version,如果修改成功,则更新数据成功,否则操作失败。

(2)悲观锁:事务开始时即获取数据的排他锁,防止其他进程读取或修改该段数据。

在实际生产环境里边,如果并发量不大且不允许脏读,可以使用悲观锁;但如果系统的并发非常大的话,悲观锁定会带来非常大的性能问题,所以我们就要选择乐观锁定的方法.。


4.数据库视图

在SQL中,view 是基于SQL语句的结果集可视化的表

CREATE VIEW view_name AS SELECT column_name(s) FROM table_name WHERE condition;

参考:blog.csdn.net/buhuikanjian/article/details/53105416

优点:

(1)将经常使用的数据定义为视图,简化了以后的操作。

(2)安全性,用户只能查询和修改能看到的数据。

视图和表的区别:

(1)视图是已经编译好的sql语句,是基于sql结果集的可视化的表,并不占有实际的物理空间。

(2)表里的数据增加或者删除的时候,视图里的内容也随着变化

(3)视图的建立和删除只影响视图本身,不影响对应的基本表

(4)一般来说你可以用update,insert,delete等sql语句修改表中的数据,而对视图只能进行select操作。但是也存在可更新的视图,对于这类视图的update,insert和delete等操作最终会作用于与其相关的表中数据。因此,表是数据库中数据存储的基础,而视图只是为了满足某种查询要求而建立的一个对象


5. B树和B+树

https://www.jianshu.com/p/ea8d0418d4ed

https://blog.codinglabs.org/articles/theory-of-mysql-index.html

6. SQL基础

1. 内连接:返回左表和右表的交集部分

2. 左外连接:返回全部的左表数据,右表符合搜索条件的部分展示,不存在的部分显示NULL

3. 右外连接:返回全部的右表数据,左表符合搜素条件的部分展示,不存在的部分显示NULL

4. group by使用

(1)select 类别, avg(数量) AS 平均值 from product group by 类别;  //获取每种类别商品数量的平均值

(2)select 类别, sum(数量) as 数量之和 from product  group by 类别  //获取每种类别商品数量之和

(3)where 子句的作用是在对查询结果进行分组前,即在分组之前过滤数据。where条件中不能包含聚合函数。

(4)having 子句的作用是筛选满足条件的组,即在分组之后过滤数据。条件中经常包含聚合函数。

(5)select 类别, sum(数量) as 数量之和 from product group by 类别 having sum(数量) > 18

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容

  • 索引分析工具:explain 数据库优化。表很大之后,insert变得很慢,如何优化? 缓存; 分库分表; 索引;...
    孟辜阅读 768评论 0 0
  • title: 数据库复习小记date: 2020-07-06 09:48:28 [TOC] 0. 前言 大三下,只...
    dounine阅读 914评论 0 2
  • 本文是2017年秋季北大研究生课程《数据库原理与技术》的复习笔记。视角为数据库系统自身的设计与实现,主要包括存储、...
    maxkibble阅读 1,246评论 0 3
  • 数据库的三级模式: 模式:也称逻辑模式,是数据库中全体数据的逻辑结构和特征的描述,是所有的用户的公共数据视图。外模...
    Jeasky阅读 288评论 0 0
  • 数据库知识作为面试必考题,在面试的过程中占比很好,尤其是后端开发,一定要精通,尤其是索引和事务,每个专业的面试官都...
    秃头哥编程阅读 748评论 1 2