数据库基础知识(面试)

1.高并发数据库常遇到的问题

脏读,幻读,重复读

2.数据库高并发时如何分担数据库压力?

(1)使用redis缓存
在 Web 层和 DB(数据库)层之间加一层 cache 层,主要目的:减少数据库读取负担,提高数据读取速度,如果需要高可用,可以使用哨兵模式,当一台机器不可用时,立即转移到另一台服务器上,使用端无感知。

(2)主从读写分离
当数据库的写压力增加,cache 层(如 Memcached)只能缓解数据库的读取压力。读写集中在一个数据库上让数据库不堪重负。使用主从复制技术(master-slave 模式)来达到读写分离,以提高读写性能和读库的可扩展性。读写分离就是只在主服务器上写,只在从服务器上读,基本原理是让主数据库处理事务性查询,而从数据库处理 select 查询,数据库复制被用于把事务性查询(增删改)导致的改变更新同步到集群中的从数据库。

(3) 分库分表
水平拆分
对于访问极为频繁且数据量巨大的单表来说,首先要做的是减少单表的记录条数,以便减少数据查询所需的时间,提高数据库的吞吐,这就是所谓的分表【水平拆分】。使得数据能够较为均衡地分布到多张表中,一般采取分片策略,多个表为一组。

垂直拆分
分表能够解决单表数据量过大带来的查询效率下降的问题,但是却无法给数据库的并发处理能力带来质的提升。所以需要根据业务来进行分库,例如用户表和订单表,每个业务单独放在一个库中,即分库【垂直拆分】。

3.redis 缓存数据库的五种数据类型

String,Hash,List,Set,Zset

4.模糊查询下数据查询过慢,如何在数据库做优化以及提高返回数据速度?

1.使用全文索引
全文索引主要使用的是 倒排索引 实际就是将要插入的文本按照相应的词进行拆分,然后额外建立一张表,存储这些出现的单词,并做出相应的统计。

5.mysql和mongodb的区别

数据库模型 非关系型 关系型
存储方式 以类JSON的文档的格式存储 以表的方式存储
查询语句 MongoDB查询方式(类似JavaScript的函数)函数式的查询 SQL语句
数据处理方式 基于内存,将热数据存放在物理内存中,从而达到高速读写,冷数据持久化 不同引擎有不同的存储方式
成熟度 新兴数据库,成熟度较低 成熟度高
广泛度 NoSQL数据库中,比较完善且开源,使用人数在不断增长 开源数据库,市场份额不断增长
事务性 仅支持单文档事务操作,弱一致性 支持事务操作
占用空间 占用空间大 占用空间小
join操作 MongoDB没有join MySQL支持join
1.mysql和mongodb存储形式不同,mysql采用表存储,mongodb采用类似于json文档格式存储。
2. mysql支持事务操作,而mongodb不支持
3.mysql有join操作,而mongodb没有
4.mysql需要使用sql来进行查询,而mongodb使用类似函数式来查询,类似JavaScript 的函数

6.redis面试

redis和session的区别

1.什么是redis

Redis 是一个使用 C 语言写成的,开源的高性能key-value非关系缓存数据库。它支持存储的value 类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和 hash(哈希类型)。Redis的数据都基于缓存的,所以很快,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。Redis也可以实现数据写入磁盘中,保证了数据的安全不丢失,而且Redis的操作是原子性的。

2.redis的优点

(1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都很低
(2)支持丰富数据类型,支持string,list,set,sorted set,hash
(3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行
(4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除

3.Redis 相比 Memcached 有哪些优势?

1、Memcached 所有的值均是简单的字符串, redis 作为其替代者, 支持更为丰富的数据类
2、Redis 的速度比 Memcached 快
3、Redis 可以持久化其数据

4.Memcache 与 Redis 的区别都有哪些?

1、存储方式 Memecache 把数据全部存在内存之中, 断电后会挂掉, 数据不能超过内存大小。 Redis有部份存在硬盘上, 这样能保证数据的持久性
2、数据支持类型 Memcache 对数据类型支持相对简单。 Redis 有复杂的数据类型。
3、使用底层模型不同 它们之间底层实现方式以及与客户端之间通信的应用协议不一样。 Redis 直接自己构建了 VM 机制 ,因为一般的系统调用系统函数的话, 会浪费一定的时间去移动和请求。

5. Redis 是单进程单线程的?

Redis 是单进程单线程的, redis 利用队列技术将并发访问变为串行访问, 消除了传统数据库串行控制的开销。

6.Redis有两种持久化方式

AOF持久化(即Append Only File持久化)
则是将Redis执行的每次写命令记录到单独的日志文件中,当重启Redis会重新将持久化的日志中文件恢复数据。当两种方式同时开启时,数据恢复Redis会优先选择AOF恢复。

RDB:是Redis DataBase缩写快照
RDB是Redis默认的持久化方式。按照一定的时间将内存的数据以快照的形式保存到硬盘中,对应产生的数据文件为dump.rdb。通过配置文件中的save参数来定义快照的周期。

RDB优点:

  • 只有一个文件 dump.rdb,方便持久化
  • 容灾性好,一个文件可以保存到安全的磁盘。
  • 性能最大化,fork 子进程来完成写操作,让主进程继续处理命令,所以是 IO 最大化。使用单独子进程来进行持久化,主进程不会进行任何 IO 操作,保证了 redis 的高性能
  • 相对于数据集大时,比 AOF 的启动效率更高。
    缺点:
  • 数据安全性低。RDB 是间隔一段时间进行持久化,如果持久化之间 redis 发生故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候)
  • AOF(Append-only fifile)持久化方式: 是指所有的命令行记录以 redis 命令请 求协议的格式完全持久化存储保存为 aof 文件。

7.数据库char和varchar

char类型的长度是固定的,varchar的长度是可变的。

8.什么数据不适合建索引

  • 频繁更新的字段不适合建立索引
  • where条件中用不到的字段不适合建立索引
  • 可以确定表数据比较少不需要建立索引
  • 数据重复且发布比较均匀的字段不适合建索引(如性别,真假值)
  • 参与列计算的列不适合建索引

9.什么字段适合建立索引

  • 频繁作为where条件语句查询字段
  • 关联字段需要建立索引
  • 排序字段可以建立索引
  • 分组字段可以建立索引(因为分组前提是排序)
  • 统计字段可以建立索引(如.count(),max())

10.数据库数据过大时候,sql如何优化

  • 保证在实现功能的基础上,尽量减少对数据库的访问次数;
  • 通过搜索参数,尽量减少对表的访问行数,最小化结果集,从而减轻网络负担;
    能够分开的操作尽量分开处理,提高每次的响应速度;
  • 在数据窗口使用SQL时,尽量把使用的索引放在选择的首列;
  • 算法的结构尽量简单;
  • 在查询时,不要过多地使用通配符如SELECT * FROM T1语句,要用到几列就选择几列
  • 在可能的情况下尽量限制尽量结果集行数
    在没有建索引的情况下,数据库查找某一条数据,就必须进行全表扫描了,对所有数据进行一次遍历,查找出符合条件的记录。在数据量比较小的情况下,也许看不出明显的差别,但是当数据量大的情况下,这种情况就是极为糟糕的了。
  • 尽量使语句符合查询优化器的规则避免全表扫描而使用索引查询
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值