欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数据库原理读书笔记

程序员文章站 2022-05-09 09:02:47
...

从时间复杂度说起

对于一些普通运算时间复杂度显得不是那么重要
但是对于应对大量的数据 或者要争取毫秒级操作
那么理解这个概念就很关键了

举例:
假设要处理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

相关标签: 数据库原理