数据库原理读书笔记
从时间复杂度说起
对于一些普通运算时间复杂度显得不是那么重要
但是对于应对大量的数据 或者要争取毫秒级操作
那么理解这个概念就很关键了
举例:
假设要处理2000条数据
-
O(1) 算法会消耗一次运算
-
O(log(n)) 算法会消耗7次运算
-
O(n*log(n)) 算法会消耗 14,000 次运算
-
O(n^2) 算法会消耗 4,000,000 次运算
-
hash表的时间复杂度O(1)
-
平衡二叉树的时间复杂度为O(log(n))
-
搜索一个阵列的会得到O(n)
-
最好的排序算法具有 O(n*log(n)) 复杂度
-
糟糕的排序算法具有 O(n^2) 复杂度
归并排序
归并排序的核心思想是分而治之
先分后治
差分需要的次数为log(n)
但是合并对比的次数每次都是8
- 第一步,4 次合并,每次成本是 2 次运算。
- 第二步,2 次合并,每次成本是 4 次运算。
- 第三步,1 次合并,成本是 8 次运算。
所以归并排序的时间复杂度为nlog(n)
二维队列
图片地址
http://ww2.sinaimg.cn/large/7cc829d3jw1f3drdpqm1oj20cl0apdhp.jpg
一个表可以看做二维阵列
每一行代表一个主体
列用来描述主体的特征
每个列保存某一种类型数据(整数,字符串,日期)
表的时间复杂度O(n) 如果要查找国家是UK的用户 就得一行一行的遍历
可以使用红黑树存放指定的列 列中还存放了指定行的位置
B+树索引
如果要查找两个值之间的多个元素时
select * from id where between 10 and 80;
平衡二叉树需要一个个去遍历节点 时间度是log(n)
B+树就可以优化这个过程
关于B树的大概思路
我的大概思路
先构建平衡二叉树
再构造叶子层的链表(思路可能是错的)
所有叶子节点的右节点都存放当前元素
左节点存放的是
// B
// / \
// A D
// /\
// C F
c的左节点存放的B
C是父节点的右链接吗 不是则向上查找直到找到右节点
但是这样肯定浪费了算力
全局概览
核心组件:
进程管理器
网络管理器
文件系统管理器
内存管理器
安全管理器
客户端管理器
简而言之 客户端管理器是处理客户单端通信的 客户端可以是一个网站服务器或者一个最终用户…
客户端管理器
通过一系列知名的API提供不同的方式来访问数据库
比如 JDBC ODBC
- 当链接数据库时管理器先检查验证信息用户名和密码
然后检查访问数据库的授权 - 然后,管理器检查是否有空闲进程(或线程)来处理你对查询。
- 管理器还会检查数据库是否负载很重。
- 管理器可能会等待一会儿来获取需要的资源。如果等待时间达到超时时间,它会关闭连接并给出一个可读的错误信息。
- 然后管理器会把你的查询送给查询管理器来处理。
- 因为查询处理进程不是『不全则无』的,一旦它从查询管理器得到数据,它会把部分结果保存到一个缓冲区并且开始给你发送。
- 如果遇到问题,管理器关闭连接,向你发送可读的解释信息,然后释放资源。
查询管理器
整个过程查询首先被解析并判断是否合法
查询解析器来检查语法
如果关键字拼错
或者顺序不对 where在select前面这种
分析查询汇总的表和字段
是否存在
对某类型字段是否合法
然后被重写 除去了无用的操作并且加入了预优化
查询重写器
在这一步,我们已经有了查询的内部表示,重写器的目标是:
预优化查询
避免不必要的运算
帮助优化器找到合理的最佳解决方案
重写器 可以对查询进行重写
即优化
如果查询匹配了一种模式的规则 查询就会按照这条规则
来重写
如果查询可以优化就优化或者将匹配一部分复杂工作
- 视图合并:如果你在查询中使用视图,视图就会转换为它的 SQL 代码。
- 子查询扁平化:子查询是很难优化的,因此重写器会尝试移除子查询
优化前
SELECTPERSON.*
FROMPERSON
WHEREPERSON.person_keyIN
(SELECTMAILS.person_key
FROMMAILS
WHEREMAILS.mailLIKE'christophe%');
优化后
SELECT PERSON.*
FROM PERSON, MAILS
WHERE PERSON.person_key = MAILS.person_key
and MAILS.mail LIKE 'christophe%';
可优化的部分
接着被优化以便提升性能,并被转换为可执行代码和数据访问计划。
然后计划被编译
最后,被执行
原文
https://blog.csdn.net/albertfly/article/details/51318995
上一篇: 监视SQLServer数据库镜像[图文]
下一篇: 第六章 关系数据库理论