leetcode+数据库(7.3-7.4)


到上海来了,上海的天气真是又闷又热。今天休息整理了一下只学习了两个小时。在前面已经复习完了计组和计网,总的来说基本上都可以理解了。从今天起就开始继续学习和复习数据库相关知识


惯例每天刷一下leetcode:

leetcode 76:最小覆盖子串

总来说就是使用了滑动窗口,当没覆盖的时候右边滑动,覆盖之后左边滑动缩小窗口。一只这么做下去,然后每一次都需要判断是否覆盖,这里的话需要一些技巧。题解的方法使用了哈希表去优化O(n2)的查询过程,变成了O(n)。讨论区里面有很多人说可以使用countnum来进一步加快,目前最后四个测试样例没过。

leetcode 53最大子数组和

给定一个数组,找出其中连续序列和最大的值。采用动态规划求解。分析该类问题,最明显的特征就是可以从小规模问题来进一步求解大规模问题,可以采用动态规划进行求解,而分治法是平行的将问题分解为多个子问题进行求解。

leetcode 56合并区间问题

先对于左端点进行排序,排序完成后可以知道,此时构成将来的区间的小区间一定是聚集的。可以用反证法证明,然后再逐步合并即可。合并时有的时候反面的条件更加好写。

leetcode 189轮转数组

比较简单,主要考察了vector容器的使用。


数据库:

Oracle和Mysql中sql语句的执行方式:

总的来说都会经历一个语义检查的过程,不同的是Oracle检查完之后才查缓存而Mysql一上来就进行缓存查询,然后再经过解析器,优化器,执行器进行解析执行。相比较于其他的数据库系统,mysql最大的优势是支持不同的存储引擎。可以分为三层,连接层,SQL层和存储层。

软解析和硬解析,软解析共享池中有缓存,硬解析重新生成执行计划。

接下来主要讲讲在MySQL中SQL的解析过程:(主要参考了小林coding)

如上图所示,MySQL是一个典型的客户端,服务端模式设计,我们主要讲讲服务端干了点啥。

有的人把MySQL分为三层,即连接层,SQL层,存储层。有的人分为两层Server层和存储层,anyway其实都差不多。

首先是连接器,用于和客户端建立连接。验证密码和身份。这里有一个长连接和短连接的问题,如果一直是短连接,每次SQL事务都要进行一次连接,效率不高,但是如果一直是长连接,随着时间增长长连接所建立的对象所占内存会增加。解决方式主要有两种,首先是服务端定期断开长连接,第二是客户端主动调用函数终止连接,释放内存。

连接完成之后,根据客户端所提供的SQL语句,服务器去缓存中查询是否具有缓存结果。但是实际使用中来看MySQL缓存策略并不是很有用,在8.0版本后就已经被删除了。

解析器:词法分析,形成语法树。

执行器: 预处理,对比表名,列名是否一样,优化器,决定按照什么方式进行检索的代价最小。

执行器和存储引擎的交互方式:

主键索引查询:主键等值查询。

全表扫描:使用不到索引因此全表扫描。

索引下推:回表。


然后学习了一下SQL的基本语法:

数据库建表的基本原则: 1.建立的表越少越好 2.数据库表的字段越少越好 3.联合主键的字段越少越好 4. 使用的主键和外键越多越好。

SLECT 基本语法,基本了解一下就行,起别名,DISTINCT ,ORDER BY, DESC,ASC,LIMIT 等。关键字不可以调换顺序:

SELECT ... FROM ... WHERE ... GROUP BY ... HAVING ... ORDER BY ...

通配符(%代表一个或者多个字符,_表示一个字符),IN,日期等等。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值