秋招备战——数据库

两种数据库

关系型数据库:MySQL、SQL Server、Oracle 存储方式是用表

非关系型数据库:MongoDB、Redis 存储方式是键值对

常用的锁有哪些

互斥锁、自旋锁、读写锁、乐观锁、悲观锁

三大范式

第一范式:要求一张表中的每一列是不可分割的原子数据

第二范式:消除部分依赖,要求一张表中的每一列都完全依赖于主键(针对于组合主键),也就是不会出现某一列只和部分主键相关;

第三范式:消除传递依赖,要求一张表中的每一列都和主键是直接依赖的,不是间接依赖。

数据库的乐观锁和悲观锁

悲观锁:

①悲观锁总是认为数据会被其他线程修改,所以在修改前强制加锁,使其他线程阻塞等待,具有强烈的独占和排他特性。

②传统的关系型数据库的行锁,表锁,读锁,写锁等,以及Java中synchronized关键字都是悲观锁的实现。

③悲观锁比较适用于写多读少的情况(多写场景)。

悲观锁实际上是“先取锁再访问”的保守策略,为数据的安全提供了保证。

扫描二维码关注公众号,回复: 16088318 查看本文章

乐观锁:

①乐观锁认为在一般情况下数据不会被其他线程修改,所以在修改前不会加锁,而是在数据提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则返回给用户错误的信息,让用户决定如何去做。

②乐观锁不会刻意使用数据库本身的锁机制,而是依据数据本身来保证数据的正确性,如加版本号字段、时间戳、AtomicInteger类的CAS(比较并交换)、MySQL中InnoDB的MVCC(多版本控制)机制等都是乐观锁的实现。

③乐观锁比较适用于读多写少的情况(多读场景)

MySQL一条语句查询慢的原因是啥?

原因:

① 电脑系统内存不足;

② 网络突然降速了;

③ 所写的SQL语句不是最优解

解决方案:两条快于一条;精准快于全表;建立索引。

Redis的五大基本类型

String 字符串、List列表、Hash散列(Value本身又是键值对)、set集合、zset有序集合。

Redis的两种持久化方式

  1. RDB将数据库中的数据定期以快照的方式存储到磁盘,保存到rdb中,并在启动时自动加载rdb文件,以达到持久化的需要;它的优点呢是数据恢复快,缺点是保存不是实时产生的。会在设置的时间内进行保存。

  2. AOF,把每一次的操作都记录到一个文件中,当redis进行重启时会将AOF文件中所有操作都执行一遍,确保恢复数据。需要开启,也有设置;优点是任何写的数据不会丢失,缺点是文件大,耗能高,数据恢复快,冗余多。

Redis的默认持久化方式是RDB

Redis中的删除策略

主要包括三种删除策略:

(1)定时删除(时间换空间)
(2)惰性删除(内存占用严重,空间换时间)
(3)定期删除(随机清理删除,前两者结合)

ACID四大特性

  1. 原子性:原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

  2. 一致性:数据库总是从一个一致性状态转移到另一个一致性的状态。一致性确保了即使在执行第三、第四条语句之间时系统崩溃,前面执行的第一、第二条语句也不会生效,因为事务最终没有提交,所有事务中所作的修改也不会保存到数据库中。

  3. 隔离性:一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。

  4. 持续性:指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。

事务的四大隔离级别

  1. 序列化:如果隔离级别为序列化,则用户之间通过一个接一个顺序地执行当前的事务,这种隔离级别提供了事务之间最大限度的隔离。

  2. 可重复读:在可重复读在这一隔离级别上,事务不会被看成是一个序列。不过,当前正在执行事务的变化仍然不能被外部看到,也就是说,如果用户在另外一个事务中执行同条 SELECT 语句数次,结果总是相同的。(因为正在执行的事务所产生的数据变化不能被外部看到)。

  3. 提交读:READ COMMITTED 隔离级别的安全性比 REPEATABLE READ 隔离级别的安全性要差。处于
    READ COMMITTED 级别的事务可以看到其他事务对数据的修改。也就是说,在事务处理期间,如果其他事务修改了相应的表,那么同一个事务的多个 SELECT 语句可能返回不同的结果。容易造成“脏读”

  4. 未提交读:READ UNCOMMITTED 提供了事务之间最小限度的隔离。除了容易产生虚幻的读操作和不能重复的读操作外,处于这个隔离级的事务可以读到其他事务还没有提交的数据,如果这个事务使用其他事务不提交的变化作为计算的基础,然后那些未提交的变化被它们的父事务撤销,这就导致了大量的数据变化。

聚簇索引和非聚簇索引区别

1. 聚簇索引

并不是一种单独的索引类型,而是一种数据存储方式。当表有了聚簇索引的时候,表的数据行都存放在索引树的叶子页中。无法把数据行放到两个不同的地方,所以一张表只允许有一个聚簇索引。InnoDB的聚簇索引实际上是将索引和数据保存中同一个B-Tree中。InnoDB通过主键聚集数据,如果没有定义主键,InnoDB会选择一个唯一的的非空索引代替。如果没有这样的索引,InnoDB会隐式定义一个主键来作为聚簇索引。

2. 非聚簇索引

又叫二级索引。二级索引的叶子节点中保存的不是指向行的物理指针,而是行的主键值。当通过二级索引查找行,存储引擎需要在二级索引中找到相应的叶子节点,获得行的主键值,然后使用主键去聚簇索引中查找数据行,这需要两次B-Tree查找。

左连接和右连接

左连接: 在 LEFT JOIN 左边的表里面数据全被全部查出来,右边的数据只会查出符合ON后面的符合条件的数据,不符合的会用NULL代替。

内连接: 相当于左连接与右连接的合并,去掉所有含NULL的数据行,剩下的就是查询出来的数据了。其实就是两边的表都必须满足条件。

消息队列

Kafka

优点:吞吐量非常大,性能非常好,集群高可用。

缺点:会丢数据,功能比较单一

使用场景:日志分析、大数据采集

RebbitMQ

优点:消息可靠性高,功能全面。

缺点:吞吐量比较低,消息积累会严重影响性能。erlang语言不好定制。

使用场景:小规模场景。

RocketMQ (阿里产品)

优点:高吞吐、高性能、高可用,功能非常全面。

缺点:开源版功能不如云上商业版。官方文档和周边生态还不够成熟。客户端只支持java

使用场景:几乎是全场景。

Linux的熟悉情况

上过这个课,安装系统,会一些简单的命令,多用户多任务的操作系统。

猜你喜欢

转载自blog.csdn.net/hallobike/article/details/126693613
今日推荐