【22】C++岗位求职面试八股文第二十二篇(数据库)
系列文章目录
第一篇:语言基础
第二篇:设计模式
第三篇:数据库
第四篇:计算机网络
第五篇:操作系统
第六篇:LInux
第七篇:数据结构
第八篇:智力题
[121]索引
1、索引的目的是什么?快速访问数据表中的特定信息,提高检索速度
2、索引对数据库系统的负面影响是什么?负面影响:创建索引和维护索引需要耗费时间,这个时间随着数据量的增加而增加;索引需要占用物理空间, 不光是表需要占用数据空间,每个索引也需要占用物理空间;当对表进行增、删、改、的时候索引也要 动态维护 ,这样就降低了数据的维护速度。
3、为数据表建立索引的原则有哪些?在最频繁使用的、用以缩小查询范围的字段上建立索引。在频繁使用的、需要排序的字段上建立索引
4、什么情况下不宜建立索引?对于查询中很少涉及的列或者重复值比较多的列,不宜建立索引。对于一些特殊的数据类型,不宜建立索引,比如文本字段(text)等
[122]完整性约束包括哪些?
数据完整性(Data Integrity) 是指数据的精确(Accuracy)和可靠性(Reliability)。分为以下四类:1、实体完整性:规定表的每一行在表中是惟一的实体。2、域完整性:是指表中的列必须满足某种特定的数据类型约束,其中约束又包括取值范围、精度等规定。3、参照完整性:是指两个表的主关键字和外关键字的数据应一致,保证了表之间的数据的一致 性,防止了数据丢失或无意义的数据在数据库中扩散。4、用户定义的完整性:不同的关系数据库系统根据其应用环境的不同,往往还需要一些特殊的约束条件。用户定义的完整性即是针对某个特定关系数据库的约束条件,它反映某一具体应用必须满足的 语义要求。
与表有关的约束:包括列约束(NOT NULL(非空约束))和表约束(PRIMARY KEY、foreign key、check、UNIQUE)六大约束:默认 唯一 非空 检查 外键 主键
[123]B树、B-树、B+树、B*树之间的关系
B-tree树即B树,是一种多路搜索树(并不是二叉的)B+树的所有元素都在叶子节点上。
B树和B+树区别:关键字数量不同:B+树分支结点M个关键字,叶子节点也有M个;B树分支结点则存在 k-1 个关键码数据存储位置不同:B+树数据存储在叶子结点上;B树存储在每个结点上;查询不同:B+树是从根节点到叶子节点的路径;B树是只需要找到数据就可以分支节点存储信息不同:B+树存索引信息;B树存的是数据关键字
[124]数据库索引采⽤B+树⽽不是B树,原因也有很多,主要原因是什么?
B+树只要遍历叶⼦节点就可以实现整棵树的遍历,查询效率稳定,⽽且在数据库中基于范围的查询是⾮常频繁的,⽽B树只能中序遍历所有节点,效率太低
[125]⽂件索引和数据库索引为什么使⽤B+树
(1)⽅便扫库B树必须⽤中序遍历的⽅法按序扫库,⽽B+树直接从叶⼦结点挨个扫⼀遍就完了,B+树⽀持 range-query⾮常⽅便,⽽B树不⽀持(最主要原因)(2)B+tree的磁盘读写代价更低
(3)B+tree的查询效率更加稳定任何 关键字的查找必须⾛⼀条从根结点到叶⼦结点的路。所有关键字查询的路径⻓度相同,导致每 ⼀个数据的查询效率相当
[126]视图
视图(⼦查询)是⼀种虚拟的表,通常是有⼀个表或者多个表的⾏或列的⼦集,具有和物理表 相同的功能 ;作⽤: (1)简化了操作(2)安全性 ⽤户只能查询和修改能看到的数据 (3)逻辑上的独⽴性
[127]游标
游标是对查询出来的结果集作为⼀个单元来有效的处理。游标是处理结果集的⼀种机制,定位到结果集中的某⼀⾏,多数据进⾏读写作⽤如下: 1. 定位到结果集中的某⼀⾏ 2. 对当前位置的数据进⾏读写 3. 可以对结果集中的数据单独操作,⽽不是整⾏执⾏相同的操作 4. 是⾯向集合的数据库管理系统和⾯向⾏的程序设计之间的桥梁
[128]存储过程和函数有什么区别
存储过程和函数的区别要有:1、存储过程是SQL语句和可选控制流语句的预编译集合,而函数是由一个或多个 SQL 语句组成的子程序;2、存储过程可以在单个存储过程中执行一系列SQL语句,而自定义函数有诸多限制;3、执行方式不同(1)存储过程:存储过程可以返回参数,如记录集,函数只能返回值或者表对象。存储过程的参数有in,out,inout三种,存储过程声明时不需要返回类型。(2)函数:函数参数只有in,而函数需要描述返回类型,且函数中必须包含一个有效的return语句。
[129]Union和join
Union:两个或多个记录集(对应列要相同,上下拼接)合并两个或多个SELECT语句的结果集Join:操作对象:两个表或者多个表(横着拼接) 连接是多个集合的叉积的⼦集;满⾜条件相同的列产⽣的结果集 根据所使⽤的JOIN的类型(外部,内部,笛卡尔型),显示查询中提到的所有列的结果
[130]MySQL 中有哪几种锁?
1、表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最 低。2、行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最 高。3、页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间, 并发度一般
[131]MySQL 数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?
1、设计良好的数据库结构,允许部分数据冗余,尽量避免 join 查询,提高效率。2、选择合适的表字段数据类型和存储引擎,适当的添加索引。3、MySQL 库主从读写分离。4、找规律分表,减少单表中的数据量提高查询速度。5、添加缓存机制,比如 memcached,apc 等。6、不经常改动的页面,生成静态页面。7、书写高效率的 SQL。比如 SELECT FROM TABEL改为 SELECTfifield_1,fifield_2, fifield_3 FROMTABLE.
[132]锁的优化策略
1、读写分离2、分段加锁3、减少锁持有的时间4.多个线程尽量以相同的顺序去获取资源不能将锁的粒度过于细化,不然可能会出现线程的加锁和 释放次数过多, 反而效率不如一次加一把大锁。
[133]存储时期
• Datatime:以 YYYY-MM-DD HH:MM:SS 格式存储时期时间,精确到秒,占用 8 个字节得存储空 间,datatime 类型与时区无关
• Timestamp:以时间戳格式存储,占用 4 个字节,范围小 1970-1-1 到 2038-1-19,显示依赖于所 指定得时区,默认在第一个列行的数据修改时可以自动得修改timestamp 列得值
• Date:(生日)占用得字节数比使用字符串.datatime.int 储存要少,使用 date 只需要 3 个字节, 存储日期月份,还可以利用日期时间函数进行日期间得计算
• Time:存储时间部分得数据 注意:不要使用字符串类型来存储日期时间数据(通常比字符串占用得储存空间小,在进行查找过 滤可以利用日期得函数) 使用 int 存储日期时间不如使用 timestamp 类型
[134]MySql的索引是什么结构,如何实现的,为什么⽤B+树,还有⽤别的吗
1、B+ Tree索引是⼤多数 MySQL 存储引擎的默认索引类型。 因为不再需要进⾏全表扫描,只需要对树进⾏搜索即可,所以查找速度快很多。 因 B+ Tree 的有序性,所以除了⽤于查找,还可以⽤于排序和分组。
2、哈希索引哈希索引能以 O(1) 时间进⾏查找,但是失去了有序性:⽆法⽤于排序与分组; 只⽀持精确查找,⽆法⽤于部分查找和范围查找。 InnoDB 存储引擎有⼀个特殊的功能叫“⾃适应哈希索引”,当某个索引值被使⽤的⾮常频繁 时,会在 B+Tree 索引之上再创建⼀个哈希索引,这样就让B+Tree 索引具有哈希索引的⼀些优点,⽐如快速的哈希查找。
3、全⽂索引MyISAM 存储引擎⽀持全⽂索引,⽤于查找⽂本中的关键词,⽽不是直接⽐较是否相等。 全⽂索引使⽤倒排索引实现,它记录着关键词到其所在⽂档的映射。
4、空间数据索引MyISAM 存储引擎⽀持空间数据索引(R-Tree),可以⽤于地理数据存储。空间数据索引会从 所有维度来索引数据,可以有效地使⽤任意维度来进⾏组合查询。 必须使⽤ GIS 相关的函数来维护数
[135]什么时候⽤哈希索引什么时候⽤B+树索引呢?
B+树适⽤于普遍情况,可以查找,排序,分组,适⽤于全键值,键值范围,键前缀查找 哈希索引适⽤于精确查找
[136]B树和B+树的区别,为什么MySql⽤B+树⽽不是B树
1、 B+树的磁盘读写代价更低B+树的内部节点并没有指向关键字具体信息的指针,因此其内部节点相对B树更⼩,如果把所有同⼀内部节点的关键字存放在同⼀盘块中,那么盘块所能容纳的关键字数ᰁ也越多,⼀次性 读⼊内存的需要查找的关键字也就越多,相对IO读写次数就降低了。
2、 B+树的查询效率更加稳定由于⾮终结点并不是最终指向⽂件内容的结点,⽽只是叶⼦结点中关键字的索引。所以任何关 键字的查找必须⾛⼀条从根结点到叶⼦结点的路。所有关键字查询的路径⻓度相同,导致每⼀ 个数据的查询效率相当。
3、 B+树更便于遍历由于B+树的数据都存储在叶⼦结点中,分⽀结点均为索引,⽅便扫库,只需要扫⼀遍叶⼦结 点即可,但是B树因为其分⽀结点同样存储着数据,我们要找到具体的数据,需要进⾏⼀次中 序遍历按序来扫,所以B+树更加适合在区间查询的情况,所以通常B+树⽤于数据库索引。
4、 B+树更适合基于范围的查询B树在提⾼了IO性能的同时并没有解决元素遍历的效率低下的问题,正是为了解决这个问 题,B+树应⽤⽽⽣。B+树只需要去遍历叶⼦节点就可以实现整棵树的遍历。⽽且在数据库中 基于范围的查询是⾮常频繁的,⽽B树不⽀持这样的操作或者说效率太低。
[137]慢查询
一、开启mysql慢查询
二、查看慢查询的数量
三、分析慢查询日志
[138]Mysql调优
1、创建索引(恰当的添加索引)2、适当的用复合索引代替单索引3索引不会包含有NULL值的列
4、使用短索引短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。5不使用NOT IN和操作
6开启查询缓存。7、表的设计垂直分割表,使得固定表与变长表分割,从而降低表的复杂度和字段的数目9、读写分离方案通过对数据库进行读写分离,来提升数据的处理能力, 数据库的写操作都集中到一个数据库上,而一些读的操作呢,可以分解到其它数据库上。
[139]Mysql limit 分页机制
[140]增加中间表
对于需要经常联合查询的表,可以建立中间表以提高查询效率。通过建立中间表,把需要经常联合查询的数据插入到中间表中,然后将原来的联合查询改为对中间表的查询,以此来提高查询效率
[141]一个表中可不可以没有主键 可以
数据库自动按主键值的顺序显示表中的记录。如果没有定义主键,则按输入记录的顺序显示表中的记录。主键只是说对一种表和表关系的关联而已,还有就是在建主键的时候会自动添加个索引,某些情况下可以增加查询速度。没有主键照样可以查询
主键的作用:1)保证实体的完整性;2)加快数据库的操作速度3)在表中添加新记录时,数据库会自动检查新记录的主键值,不允许该值与其他记录的主键值重复。4) 数据库自动按主键值的顺序显示表中的记录。如果没有定义主键,则按输入记录的顺序显示表中的记录。
主键不是非要不可,可以从:1.是否满足业务要求2.数据查询效率(主键可以提高查询效率,当然合理的索引替代也可以)利用来存储大量数据,并需要经常查询的,建立主键可以加快查询效率从而降低服务器的负担. 如无此需求,建立反而多耗用服务器资源. 简单的对单表操作的话,实在没有必要。对多张没有关联的表操作的话,不设置也没有什么影响。
[142]何时用单字段索引
表的主键、外键必须有索引数据量超过300的应该有索引经常与其他表进行连接的表,在连接字段上应该建立索引经常出现在where子句中的字段,特别是大表的字段,应该建立索引索引应该建立在选择性高的字段上索引应该建立在小字段上,对于大的文本字段甚至超长字段,不要建立索引频繁进行数据操作(insert、update、delete)的表,不要建立太多的索引;
[143]Redis
string应用场景:缓存、计数、共享session、限速
Redis默认端口:6379不具有事务,但是是原子操作
Rdb默认开启,aof默认关闭
主从复制
[144]Redis缓存穿透、击穿、雪崩
缓存穿透
解决:
缓存击穿(热门key过期)
雪崩(大量key过期)
[144]String字符串扩容
[续]C++岗位求职面试八股文第二十三篇(计算机网络)
更多关于算法题解、软件开发面经、机器学习算法面经、各企业面试问题记录,关注Fintech砖,持续更新中。https://www.nowcoder.com/users/873777317
企业面试记录专栏https://www.nowcoder.com/creation/manager/columnDetail/0YBWnm
机器学习面经专栏https://www.nowcoder.com/creation/manager/columnDetail/j8nNy0
软件开发面经专栏https://www.nowcoder.com/creation/manager/columnDetail/0aXKaM
更多校园招聘常见面试问题(开发、算法、编程题目)参见CSDN博客:http://t.csdn.cn/V4qbH
欢迎关注、收藏、点赞后进行问题咨询及秋招建议
#晒一晒我的offer##牛客在线求职答疑中心##牛客解忧铺##软件开发薪资爆料##我的实习求职记录#包含C++、操作系统、数据库、计算机组成、计算机网络、设计模式、操作系统、牛客网服务器项目、综合智力题等