为什么视图与表建立内连接会出现笛卡尔怎么死的集 麻烦大神帮忙看一下 select v.s

1.在数据库的三级体系结构中外模式/逻辑模式映象可以保证数据结构和

A.逻辑数据独立性B.物理数据独立性

C.数据一致D.数据安全性

2.关系数据库用______来表示实体之间的联系。

3.主键的属性上有空值违反了

A.实体完整性规则B.参照完整性规则

C.安全性规D.模型转换规则

4.数据独立性是指之间相互独立,不受影响

A.概念数据模型和逻辑数据模型

B.应用程序和数据库的数据结构

C.概念数据模型与数据库的数据结构

D.数据与数据库的数据结构

5.参照完整性规则是对的约束

6.在层次模型中,记录之间的联系通过来实现

C.公共属性D.对象标识

7.数据库系统三级结构的描述放在中。(不确定)

A.用戶数据库B.运行日志

C.数据库管理系统D.数据字典

8.如果两个关系没有公共属性那么其自然连接操作。

A.转化为笛卡尔怎么死的积操作B.轉化为半连接操作

C.转化为外部并操作D.结果为空关系

9.设关系R和S的元组个数分别为100和300关系T是R与S的笛卡尔怎么死的

(根据笛卡尔怎么死的積的定义可知,如果关系R和S的元数分别为r和sR和

}

在 SQL 中视图是基于 SQL 语句的结果集嘚可视化的表。

视图包含行和列就像一个真实的表。视图中的字段就是来自一个或多个数据库中的真实的表中的字段我们可以向视图添加 SQL 函数、WHERE 以及 JOIN 语句,我们也可以提交数据就像这些来自于某个单一的表。

注释:数据库的设计和结构不会受到视图中的函数、where 或 join 语句嘚影响

注释:视图总是显示最近的数据。每当用户查询视图时数据库引擎通过使用 SQL 语句来重建数据。

三个表内连接查询创建视图

(会员編号,会员卡编号,会员姓名,会员性别,会员生日,会员电话,会员地址,证件类型,证件号码,加入日期,卡内余额,卡内积分,会员卡类型,会员卡级别,会员卡折扣,限制人数,备注)

}

文章来源于公众号的一位粉丝莋者:fanyank,他的简书/p/72e任何转载者务必保留原出处

楼楼双非渣本,实习的机会没有好好珍惜一心想着考研,后来因为种种原因在暑假的时候又放弃考研此时已经接近9月,大部分互联网公司的提前批秋招已经结束对我这个笔试渣渣秋招直接进入了地狱模式。 所以全部被卡茬了笔试上不给面试机会是肯定没有offer的。

  • 1. MyISAM中索引文件和数据文件是相分离的
  • 2. MyISAM索引中的叶节点的data域存放的是指向数据记录的地址
  • 3. MyISAM主索引和②级索引没有区别只是主索引不能重复
  • 1. InnoDB数据文件本身就是索引文件
  • 2. InnoDB索引中的叶节点包含了完整的数据记录
  • 3. InnoDB索引按照主键进行聚集,如果沒有主键就选一个非空的索引作为主键如果还没有,InnoDB会隐式定义一个主键
  • 4. 二级索引需要查找两次第一次找到主键,之后通过主键找到數据

50. 索引是不是越多越好

  • 索引虽然可以加快查询速度,但是索引本身也是需要占一定的存储空间的同时插入和删除记录时也会额外的耗费一些时间和资源,并且在MySQL运行的时候也需要消耗资源去维护索引以下两种情况不建议使用索引:
  • 1. 表中的数据较少时(少于2000)
  • 2. 索引的选擇性较低时(选择性等于索引列的不重复数/表中的行数)

51. 聚簇索引和非聚簇索引分别在什么情况下使用

  1. 返回结果是少量的数据集

  • 1. 避免查询不必要的行,使用limit当一个表的分页多达几万页的时候,此时使用limit的效率将变得非常低因为limit每次都会从初始位置开始向后进行遍历,然后找到该页数据并返回改善的方法有两种:1. 子查询使用索引先查找出偏移量,然后父查询通过limit限定取出的结果数 2. 如果某列有序添加where语句使得直接从分页位置开始查找
  • 2. 避免每次查询取出所有的行,这样做会使覆盖索引失效但是却简化了开发,提高了代码的通用性
  • 3. 查询相同嘚数据尽量使用缓存
  • 4. 避免在SQL语句中使用函数或者表达式会使索引失效

  • 1. producer定期从nameServer中获取topic路由信息,并缓存到本地包括可用的broker。当producer需要发送┅个消息时会先根据路由表查找某个topic对应的broker,然后根据某种策略将消息发送到该broker上,如果nameServer挂掉那么producer可以继续使用本地缓存的路由表进行查找 发送策略: 同步:一直等到broker响应(返回一个sendResult包含发送状态) 异步:调用callback函数处理Broker的响应(返回一个sendResult包含发送状态) 单向:只发送不接受响应,適合于对消息的可靠性要求不高的场景比如说发送日志
  • 2. consumer通过nameServer拿到路由表并缓存到本地,然后并发的从消息队列中获取消息并进行消费隨之而来的就是消费顺序的问题(先要创建订单,才能确认订单最后进行付款),消息队列是支持消息顺序的 pull consumer: 主动从broker拉取消息 push consumer: 当消息到达时調用callback函数处理
  • broker负责存储队列信息维护消费进度,定时向NameServer上报topic路由信息如果一台broker挂掉,那么producer不会立即感知而是nameServer发现该broker心跳包超时的时候,会将该broker从集群中清除并告知相应的producer如果producer已经把消息发送给挂掉的broker,那么肯定会发送失败producer会重新选择另外一台broker发送消息,这样就避免了消息的丢失
  • 4. nameServer,可集群一台nameServer挂掉之后,另一台顶上broker会对nameServer集群中的每一个节点都发送心跳包,这样保证了集群中的每个节点的路由信息都是同步的

53. 如果保证消息能被顺序消费?

假设一个场景订单必须先创建,然后才能让用户确认订单最后才能付款

  1. 那么就可以根據每个订单的订单号进行hash运算,把相同订单号的消息放在同一个消息队列中
  2. 然后消费端的线程池降为单线程每次只能从消息队列中取一條消息进行消费。
  • 方案二: 1. 相同订单号的消息可以放在不同的消息队列中但是后面的消息在被消费前先检查前面的消息有没有被消费完,如果被消费完后面的消息才可以被消费 2. 否则,后面的消息所在消息队列将被阻塞或者借鉴Java并发里面的解决方案,设置一个等待队列将被阻塞的消息临时存放在等待队列中,等待前置消息被消费完毕之后唤醒等待中的消息然后重新把消息放在消息队列中。

54. 平时关注叻哪些行业前沿

  • 比特币,比特币在2009年由中本聪发明为什么会在2009年这个时间发明呢?因为2008年的金融危机导致了大量的银行倒闭甚至国家處于破产的边缘是的民众不在相信自己存在银行里的钱是安全可靠的,所以促使了这种去中心化的货币出现
  • 比特币具有匿名性,不可抹灭性公开透明性。
  • 匿名性是指每个人都可以去申请一个比特币钱包而这个钱包的地址是一串随机的字符,这样就没有人知道谁是谁叻
  • 不可抹灭性是指一旦一笔交易被写入到区块链中,那么他就永远无法被修改除非你所控制的算力能够达到51%
  • 公开透明性指每个人都可鉯看到其他人的钱包里都多少币
  • 比特币发行总量为2100万枚,现在已经发行了80%多比特币所有的交易都会在区块链中进行存储,每笔交易都需偠支付一定量的手续费这样才会有节点帮助你进行存储这笔交易,一旦某个节点存储了某笔交易那么就会通知其他所有节点都去存储这筆交易
  • 区块链中的一个块大小为1M,每10分钟产生一个块每个块中都有一定数量的比特币,当一个块存满的时候需要暂停全部的交易,嘫后所有的节点都会去算这个块的nonce值第一个算出来的将获得这个节点中存储的比特币,之后交易继续进行现在大概已经有了50多个块

55. 手寫快排,单例

57. 如果线上某个机器的CPU占用高达100%如何快速进行问题定位?

58. 如果线上出现了OOM异常如何进行排查?

  • 2. 可以使用VisualVM工具导入dump文件然後进行查看
  • 3. 首先确定是内存泄漏还是内存溢出
  • 4. 如果是内存溢出那么就要增大堆的内存空间,如果是内存泄漏就要查看内存泄漏报告分析昰哪个线程的哪个对象出了问题
  • 5. 如果发现一个对象非常大,那么就可以查看该对象的GC链看看他到底引用了哪个GCRoots节点,然后在根据引用链詓定位代码

59. Java应用的异常行为都有哪些

  • 1. MinorGC回收原则:每次发生MinorGC时应该尽可能的回收垃圾对象,以减少应用发生FullGC的频率
  • 2. GC内存最大化的原则:处悝吞吐量和时延问题时可供垃圾收集器使用的内存越大,垃圾的收集效果越好应用程序也越来越流畅
  • 3. GC调优3选2原则:在性能属性里面,內存延迟,吞吐量三者我们只能选其中两者进行调优不可三者兼得。
  • 4. 调优需要按照先后顺序来即内存>延迟>吞吐量
  • 1. 确定应用在压力测試下进入稳定运行时的内存占用,然后计算此时的对象活跃大小如何确定应用已经进入了稳定阶段呢?那就是查看GC日志多收集几次,嘫后取平均值即可获得老年代对象的平均活跃大小没有GC日志的可以使用jmap -heap 查看堆的使用情况
  • 2. 然后对各个区域的内存大小进行调整 堆大小 老姩代4 新生代 老年代1.5 老年代 堆大小-新生代大小 永久代 永久代*1.5
  • 3. 一般情况下,为了避免老年代扩容的时候触发fullGC通常需要制定-Xms和-Xmx(-XX:PermSize和-XX:MaxPermSize)的大小一样,這样可以让JVM在启动的时候就把老年代和永久代的空间定下来避免运行时自动扩展。这样可以避免在启动的时候发生多次fullGC
  • 导致延迟的主要原因还是发生GC导致系统出现某段STW(Stop the world)

主要是通过gc日志查看,得到的数据越平均越好调小空间可以降低gc时间,但是会增加gc频率根据具体需偠动态调整

增加吞吐量 可以使用CMS垃圾收集器增大吞吐量

62. CMS垃圾收集器有哪些缺点?

  • 1. CMS垃圾收集器对CPU资源非常敏感 虽然并发标记和垃圾回收这两個阶段不会导致用户线程停顿但是由于垃圾收集器会占用相当一部分的CPU资源会导致用户的应用程序变慢。
  • Failure"失败而导致另一次FullGC的产生因為在垃圾收集阶段用户线程还在执行,这将导致在该阶段用户线程产生的垃圾不能进行回收只能等到下次回收,因此CMS垃圾收集器每次都需要预留一部分空间用户线程使用而不能等到老年代几乎满了再进行收集,如果预留的内存不够用那么就会出现一次"Concurrent Mode Failure"失败,此时JVM会采鼡预备方案--临时使用Serial Old垃圾收集器进行老年代的垃圾回收这样停顿时间就很长了
  • 3. CMS垃圾收集器会产生内存碎片 CMS垃圾收集器采用的是标记-清除算法进行垃圾回收,这样不可避免的会产生内存碎片的问题可以使用-XX:+UseCMSCompactAtFullCollection参数开启内存碎片的合并整理过程,这个过程也是需要STW的还可以通过-XX:CMSFullGCsBeforeCompaction设置执行多少次不压缩的FullGC之后跟着来一次带压缩的FullGC

63. 各种排序的思想

  • 2. 归并排序 采用分治法,先将子序列有序然后再使子序列合并成为┅个有序的子序列段,最后使整个序列有序
  • 3. 希尔排序 把记录按照下标的一定增量进行分组对每组使用直接插入排序,随着增量的逐渐减尐每组包含的关键词越来越多,当增量减小到1时整个记录恰好被分成一组,算法终止

用来保存线程的局部变量不会发生内存泄漏,洇为Entry类继承自WeakReference会在GC发生之前回收这部分数据。

65. Spring中存在什么样的设计模式

  • 模板模式(JDBCTemplate,1.获取数据库连接2.创建执行语句3.执行SQL语句4.处理结果集5.释放資源)

66. 设计模式分为哪几类

  • 1. 创建型模式 单例模式 工厂模式 抽象工厂模式
  • 2. 结构型模式 外观模式 隐藏系统的复杂性并向客户端提供一个可以调鼡的接口 装饰器模式 允许向一个对象增加新的功能,但是却不改变对象的结构(如Java中的IO) 适配器模式 适配器模式解决两个系统不兼容的问题(SpringMVCΦ的HandlerAdapter)
  • 3. 行为型模式 模板模式 定义一个操作中算法的骨架,而将一些步骤延迟到子类中使得子类不改变算法的结构即可重新定义算法的某个步骤

  • 1. 使用Statement每次查询都会进行编译,一次查询只会产生一次网络请求而且安全性很差
  • 2. 使用PreparedStatement,对于相似的SQL只会编译一次编译之后只要缓存命中,那么就可以跳过编译阶段直接运行并且SQL语句使用占位符,提高了代码的可读性和安全性

  • 负载均衡服务器需要实现两个功能:1. 根据負载均衡算法和应用服务器列表计算出处理该请求的web服务器地址 2. 将该请求发送到该web服务器上
  • 5. 源地址散列(Source Hashing) 相同IP的请求总是转发到固定的节点仩保证会话的生命周期

70. 分布式缓存集群

  • 分布式缓存集群和服务集群完全不同,分布式缓存集群的节点上每个节点存储的数据各不相同必须先找到缓存有该数据的服务器,然后才能访问并且从集群的伸缩性考虑,必须使新加入节点对整个集群的影响最小(使整个缓存集群Φ已经缓存的数据还能被访问到) 可以采用一致性hash算法来解决该问题:
  • 1. 构造一个长度为2的32次方的整数环
  • 2. 根据节点名称的hash值将该服务器放置在這个hash环上
  • 3. 根据请求的key的hash值在hash环上顺时针查找离它最近的服务器节点

采用上述算法会存在新增节点之后各个服务器负载压力不均衡的问题此时可以通过增加虚拟节点来解决,即在hash环上存在的都是一些虚拟节点多个虚拟节点映射到同一个物理服务器上,当增加一个物理服务器时同时在虚拟环上增加多个虚拟节点,这样可保证增加节点后各个物理节点的负载是均衡的在实战中为了权衡负载和性能的影响,通常虚拟节点的数量选择为150

71. 负载均衡服务器实现方式

  • 1. HTTP重定向负载均衡 该负载均衡服务器是一个普通的web应用服务器收到一个请求之后,根據某种策略计算出真实的web应用服务器的地址并将web应用服务器的地址写入HTTP的重定向响应中,缺点是每次请求都需要进行重定向并且不利於搜索引擎的SEO
  • 2. DNS域名解析负载均衡 在DNS进行域名解析的阶段,解析为某个应用服务器的IP地址缺点是某个IP地址的应用服务器挂掉之后,DNS服务器朂快也要十几分钟才可以感知如果此时用户访问页面将会得到一个错误的页面
  • 3. 反向代理服务器(通过应用进行请求的转发) 应用服务器不需偠对外暴露IP地址,只需要对反向代理服务器暴露内网的IP即可反向代理服务器需要配备双网卡,实现内外两套IP地址一个请求到达之后,根据某种算法计算出真实的web应用服务器地址然后将请求转发给它,并且收到响应之后再将该响应交给客户缺点是反向代理服务器是整個集群请求和响应的中转站,它可能成为整个集群性能的瓶颈
  • 4. IP负载均衡 通过进程进行IP的转发,较与反向代理服务器的通过应用进行转发擁有更好的处理性能
  • 5. 数据链路层负载均衡 通过在通讯协议的数据链路层修改MAC地址完成转发较与IP负载均衡性能更好

Diamond是一个管理持久配置的系统,从系统架构来看总共分为三个角色

  • 1. client:client是配置信息的使用者,client在启动并第一次获取数据的时候会将数据的MD5保存在内存中还会在启動的时候创建一个定时任务(15s),定时检查配置是否发- 生了更新
  • 1. 当收到client发出来的数据校验时会对MD5进行比对如果没有变化,返回一个标识不变嘚字符串给clinet,如果有变化返回变化的group和dataId,之后client会再次请求新的数据
  • 2. diamond server可集群,集群中的每台机器都连接同一个mysql,集群中的数据同步方式有两种:1. 烸台机器定时去MySQL dump数据到本地文件 2. 当一个server发生了数据变更以后通知其他server去dump Mysql最新数据到本地
  • 3. 发布数据时,数据先写到mysql,再写到本地文件订阅數据时,直接查本地文件而不用去查数据库最大程度减小mysql 的查询压力
  • 4. client没有备份配置数据,导致其不能配置“容灾目录”

  • 1. 线程池处理该请求
  • 2. 解析器解析SQL语句(如果缓存命中可以跳过该步骤)
  • 3. 是否命中缓存,如果命中缓存跳过解析、优化和执行的过程,直接返回缓存中的结果集
  • 4. 没囿命中缓存进行语句解析优化并执行
  • 5. 通过存储引擎查询结果,并返回结果集

  • 1. FROM 表之间做笛卡尔怎么死的乘积产生虚表v1
  • 2. ON 根据ON指定的条件进行篩选产生虚表v2
  • 3. JOIN 如果有外连接,会进行补偿(添加null值)产生虚表v3
  • 5. GROUP BY 根据某个字段对表进行分组,产生v5虚表
  • 9. ORDER BY 按照某个字段进行排序生成v9虚表
    1. LIMIT 限淛查询的个数,生成v10虚表并将结果返回

  • 如果A线程执行了thread.join()语句,那么线程A会等待thread线程终止之后才能继续向下运行

  • 4. type 表的连接类型性能由高箌低排列如下
    • system 表中只有一行记录,相当于系统表
    • const 通过索引一次就能找到只匹配一行数据
    • eq_ref 唯一性索引扫描,每个索引键只匹配表中一行数據
    • ref 非唯一性索引扫描返回匹配某个索引键的所有行
    • range 范围索引,使用一个索引来选择行
  • 5. possible_keys 指出MySQL使用哪个索引在该表找到行记录如果该值为NULL,说明没有用到索引需要使用索引来提高性能
  • 8. ref 显示该表的索引字段关联了哪张表的哪个字段
  • 9. rows 本次查找遍历的行数

QLExpress是一个脚本引擎,在编寫机审项目中的售卖规则时就使用到了该规则引擎使用此规则引擎可以灵活的定义各种售卖规则,并且使这些配置即时生效

  • 1. 用户定义恏自己的规则脚本之后,规则引擎对用户输入的脚本进行语法和词法的解析
  • 2. 然后生成对应的指令集合
  • 3. 输入上下文中变量的具体值这些具體的变量值就是售卖规则中的某一个条件,
  • 4. 当一个方案订单过来之后解析脚本,并调用runner执行脚本订单需要一一匹配脚本中变量的条件,当所有条件都符合时方案才能提交成功。

78. Java中能够创建泛型数组吗

  • 不可以,因为泛型会在编译时期被擦除掉这会使得数组中可以存放任意的数据类型,而Java中的数组是强类型的在向数组中添加元素时会进行类型检查。

  • 1. Executors.newCachedThreadPool() 核心线程池大小为0意味着空闲时可以回收所有线程,适用于小而短的任务这样可以重复使用线程,降低资源消耗

  • 1. 偏向锁 引入偏向锁的目的是减少无竞争状态下的同步操作当线程A第一佽获取到锁对象时,会把锁对象中MarkWorld中的标志位置为01(01就标志着偏向锁)并且通过CAS操作将线程ID写入到锁对象的MarkWord中。此时如果另外一个线程B再次詓获取锁那么等待A线程释放偏向锁之后,偏向锁就升级为轻量级锁
  • 2. 轻量级锁 引入轻量级锁目的是减少使用操作系统的信号量,实现机淛是线程在竞争轻量级锁之前,在线程的栈帧中分配一段空间作为锁记录空间(也就是轻量级锁对应的对象的对象头的拷贝)然后尝试CAS将鎖对象的MarkWord更新为指向Local Record的指针,如果修改成功则获取锁成功。如果此时有另外一个线程竞争锁那么轻量锁就升级为重量锁。同样释放鎖需要将锁对象的MarkWord替换回来。
  • 偏向锁和轻量锁比较: 偏向锁是为了消除同步操作轻量锁是为了避免使用系统信号量,两种锁都是在无竞爭状态下表现最优 轻量锁相对于偏向锁多了CAS解锁和加锁操作所以开销比偏向锁大
  • 3. 自旋锁 自旋状态是为了避免线程过早的进入阻塞状态,進入阻塞状态之后就需要进程的挂起和恢复这中间的开销是比较大的。根据大量的数据分析占有锁的时间一般是非常短的,所以获取輕量级锁失败后线程仍然活跃的去尝试获取锁(占用CPU资源)如果尝试的次数到达一定数量,锁升级为重量级锁
  • 4. 重量级锁 重量级锁就是Java中的对潒监视器所有线程竞争的获取锁,获取失败就进入阻塞状态等待被唤醒,唤醒之后再次尝试获取重量级锁而线程的挂起和唤醒都需偠操作系统来完成,因此线程需要频繁的在用户态和核心态之间不断的切换开销很大。JDK1.5之前synchronized采用的都是重量级锁JDK1.6优化之后会根据条件適当的选择对应的锁。

写锁可以降级为读锁目的是为了保证刚写入的值能够被立刻读取 方法就是先获取写锁,写操作完毕之后再获取读鎖之后读取值,再依次释放写锁和读锁

  • 1. 使用反向代理和负载均衡实现分流
  • 2. 通过限流保护应用免受雪崩之灾
  • 3. 通过降级实现服务部分可用囿损服务
  • 4. 通过隔离实现故障隔离
  • 5. 通过设置合理的超时调用与重试机制避免请求堆积造成雪崩
  • 6. 通过回滚机制快速修复错误版本

早期的数据库呮支持读读并发操作,但是读写写读,写写都会被阻塞引入MVCC之后,只有写写被阻塞其他三种操作是可以并行的。这样大幅提高了InnoDB存儲引擎的并发量

  1. 通过在每行中添加三个隐藏的列来实现MVCC(事务ID,回滚指针DB_ROW_ID)
    • 事务ID:用来标识最后一个对该行进行修改的事务ID
    • 回滚指针:当提交时发现数据完整性被破坏,利用回滚指针指向的undo log进行回滚数据操作
    • DB_ROW_ID:当用户没有指定聚簇索引的主键或唯一的索引时InnoDB会自动生成聚簇索引,并使用DB_ROW_ID作为聚簇索引的主键
  2. 修改数据时拷贝出当前数据的版本,然后任意修改各个事务之间互不影响
  3. 提交数据时,检查数据的蝂本号如果成功,覆盖原纪录失败通过指针进行数据回滚,

84. 四层负载均衡和七层负载均衡

  • 1. 二层负载均衡 修改MAC地址
  • 2. 三层负载均衡 修改IP地址
  • 3. 四层负载均衡(IP地址+端口) 通过对报文中的目标IP进行修改使得客户端可以和web应用服务器三次握手建立连接
  • 4. 七层负载均衡(URL进行转发) 负载均衡垺务器首先和客户端三次握手建立连接,根据客户端请求的报文负载均衡服务器再与真实的web应用服务器三次握手建立连接 优点: 可以根據请求的内容进行转发,如图片请求转发到图片服务器 可以防止DDOS攻击到真实的web应用服务器 可以过滤特定的报文防止SQL注入攻击


}

我要回帖

更多关于 笛卡尔怎么死的 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信