【17】C++岗位求职面试八股文系列文章(数据库)
系列文章目录
第一篇:语言基础
第二篇:设计模式
第三篇:数据库
第四篇:计算机网络
第五篇:操作系统
第六篇:LInux
第七篇:数据结构
第八篇:智力题
[1]Delete from、truncate、drop区别
delete 可以使用条件表达式删除部分数据,而 truncate 不能加条件表达式,所以它只能删除所有的行数据,drop也是删除所有数据delete 和 truncate 仅仅删除表数据,drop 连表数据和表结构一起删除
delete 是 DML 语句,操作完以后如果没有不想提交事务还可以回滚,truncate 和 drop 是 DDL 语句,操作完马上生效,不能回滚。
执行的速度上,drop>truncate>delete
Delete from表 清空表内容, 可以回滚 DML id下一个Truncate 表 清空表内容, 不可以回滚 DDL id为0安全性:drop和truncate删除时不记录MySQL日志,不能回滚,delete删除会记录MySQL日志,可以回滚; delete from 记录是一条条删除的,所删除的每行记录都会进入日志,而truncate一次性删除整个页,5.如果有identity产生的自增id列,delete from 删除后任然从上次的数开始增加,即种子不变,而truncate删除后,种子会恢复初始。
[2]数据库有几种
常见的关系型数据库有: MySQL、SQL Server、Oracle常见的非关系型数据库有:Redis、Memcache、MongoDb、HBase
[3]实现前41-50条数据
select * from tablename where (id not in (select top 40 id from tablename order by id)) and id in (select top 50 id from tablename order by id)
[4]mysql索引结构
索引是在MySQL的存储引擎层中实现的,而不是在服务器层实现的,存储在磁盘中

聚集索引、复合索引、前缀索引、唯一索引默认都是使用 B+tree 索引,统称为索引。
[5]Mysql逻辑架构


存储引擎负责数据的存储和提取,基于表

Innodb存储方式:

mysism存储方式:不支持事务和外键


[6]Mysql查询执行流程

外键约束针对的是子表,外键指的是主表索引,且要求主表索引是主键约束
[7]SQL优化步骤
1.查看SQL执行频率

2. 定位低效率执行SQL慢查询日志、show processlist

3. explain分析执行计划

重点看type,key,extra


避免索引失效1全值匹配
2最左前缀法则3.范围查询条件之后的字段,索引失效4不要在索引列上进行运算操作5字符串不加单引号,造成索引失效6尽量使用覆盖索引(索引列完全包含查询列),避免select *7用or分割开的条件, 如果or前的条件中的列有索引,而后面的列中没有索引,那么涉及的索引都不会被用到。8头部模糊匹配,索引失效9 in 走索引, not in 索引失效。
[8]Mysql应用优化
1使用数据库连接池2减少对MySQL的访问(避免对数据进行重复检索、增加cache层、)3负载均衡(主从复制、分布式架构)
[9]查询缓存:
1.客户端发送一条查询给服务器;2. 服务器先会检查查询缓存,如果命中了缓存,则立即返回存储在缓存中的结果。否则进入下一阶 段;3. 服务器端进行SQL解析、预处理,再由优化器生成对应的执行计划;4. MySQL根据优化器生成的执行计划,调用存储引擎的API来执行查询;5. 将结果返回给客户端。
[10]表锁行锁

无索引行锁升级为表锁。
[11]间隙锁

一个范围加了排它锁,有一个这个范围内的数,想往里插,但是由于有排它锁,加不进去,所以就成为间隙锁
[12]Mysql日志
错误日志、二进制日志(BINLOG 日志)、查询日志和慢查询日志二进制日志(DDL/DML,主从复制,不包括DQL)查询日志记录了客户端的所有操作语句
[13]主从复制
复制是指将主数据库的DDL 和 DML 操作通过 二进制日志 传到从库服务器中,然后在从库上对这些日志重 新执行(也叫重做),从而使得从库和主库的数据保持同步。

1主库写,从库读,减少主库压力2从库备份3主库崩溃,从库可以用
[14]mysql和redis⽐优势、劣势
Redis : 是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。


缓存雪崩:缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机
缓存击穿:热点key在某个时间点过期的时候,而恰好在这个时间点对这个Key有大量的并发请求过来,从而大量的请求打到db。
缓存穿透:查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,进而给数据库带来压力。
[15]redis除了做缓存,还能当啥
Redis缓存“(1)从Redis缓存中获取数据,如果存在数据,直接返回值。 (2)如果不存在,执行数据库的查询方法 (3)将数据库中的值放入缓存,并返回值

分布式锁: 通过 Redis 来做分布式锁是一种比较常见的方式。通常情况下,我们都是基于 Redisson 来实现分布式锁。
限流:一般是通过 Redis + Lua 脚本的方式来实现限流。
消息队列 :Redis 自带的 list 数据结构可以作为一个简单的队列使用。Redis5.0 中增加的 Stream 类型的数据结构更加适合用来做消息队列。它比较类似于 Kafka,有主题和消费组的概念,支持消息持久化以及 ACK 机制。
复杂业务场景 :通过 Redis 以及 Redis 扩展(比如 Redisson)提供的数据结构,我们可以很方便地完成很多复杂的业务场景比如通过 bitmap 统计活跃用户、通过 sorted set 维护排行榜
[16]mysql怎么处理并发访问呢
mysql高并发的解决方法有:1.优化SQL语句,使用索引;2、优化数据库字段;3、加缓存;4、分区;5、读写分离6垂直拆表;7、水平拆表(最后)。
[17]介绍一下数据库分页
SELECT语句默认返回所有匹配的行,为了返回第一行或前几行,可使用LIMIT子句,以实现分页查询。LIMIT子句的语法如下:总之,带一个值的LIMIT总是从第一行开始,给出的数为返回的行数。带两个值的LIMIT可以指定从行号为第一个值的位置开始。在偏移量非常大的时候,优化LIMIT分页:
- 是尽可能地使用索引覆盖扫描,而不是查询所有的列
- 如果在一个位置列上有索引,并且预先计算出了边界值:LIMIT查询转换为已知位置的查询,让MySQL通过范围扫描获得对应的结果
[18]覆盖索引
覆盖索引是指一个非主键索引包含或者覆盖了所有需要查询的字段的值,不需要根据索引回表查询数据,减少了树的搜索次数,显著提升性能。
覆盖索引必须要存储索引列的值,因此MySQL只能用BTree索引做覆盖索引


区别在与叶子节点中,主键索引存储了整行数据,而非主键索引中存储的值为主键id,
如何使用覆盖索引:建立联合索引


[19]表中可以无主键吗?
可以,1.是否满足业务要求2.数据查询效率(主键可以提高查询效率,当然合理的索引替代也可以)这两个角度权衡是否需要主键。
[20]介绍一下SQL中的聚合函数
常用的聚合函数有COUNT()、AVG()、SUM()、MAX()、MIN()
COUNT()函数:COUNT()函数统计数据表中包含的记录行的总数,或者根据查询结果返回列中包含的数据行数,它有两种用法:• COUNT()计算表中总的行数,不管某列是否有数值或者为空值。
• COUNT(字段名)计算指定列下总的行数,计算时将忽略空值的行。
• Count()统计所有列,有翻译过程;count(1)统计所有行
AVG()函数():AVG()函数通过计算返回的行数和每一行数据的和,求得指定列数据的平均值。
SUM()函数:SUM()是一个求总和的函数,返回指定列值的总和。
MAX()函数:MAX()返回指定列中的最大值。MAX()函数不仅适用于查找数值类型,也可应用于字符类型。
MIN()返回查询列中的最小值。
[续]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##实习,投递多份简历没人回复怎么办##我的实习求职记录##软件开发薪资爆料##23届找工作求助阵地#包含C++、操作系统、数据库、计算机组成、计算机网络、设计模式、操作系统、牛客网服务器项目、综合智力题等