数据库知识点技术干货

数据库相关问题与解答

2019-02-10  本文已影响144人  AI贺贺

收集常见数据库问题

  1. 锁机制介绍:行锁、表锁、排他锁、共享锁,悲观锁、乐观锁。
    行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。
    表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。

MySQL的表级锁有两种模式:表共享读锁(Table Read Lock)和表独占写锁(Table Write Lock)。

读锁:也叫做共享锁,即多个用户可以同时的进行并发读操作
写锁:也叫排他锁,在进行写锁的时候,其它的操作无法进行

悲观锁:每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。比如Java synchronized。

乐观锁:每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在提交更新的时候会判断一下在此期间别人有没有去更新这个数据。乐观锁适用于读多写少的应用场景,这样可以提高吞吐量。

  1. 乐观锁的业务场景及实现方式;
    乐观锁(Optimistic Lock):
    每次获取数据的时候,都不会担心数据被修改,所以每次获取数据的时候都不会进行加锁,但是在更新数据的时候需要判断该数据是否被别人修改过。如果数据被其他线程修改,则不进行数据更新,如果数据没有被其他线程修改,则进行数据更新。由于数据没有进行加锁,期间该数据可以被其他线程进行读写操作。

乐观锁:比较适合读取操作比较频繁的场景,如果出现大量的写入操作,数据发生冲突的可能性就会增大,为了保证数据的一致性,应用层需要不断的重新获取数据,这样会增加大量的查询操作,降低了系统的吞吐量。

Java的CAS操作则是一种乐观方式,不断的循环,当目标值与期望值相等的时候认为操作是成功的。

  1. 事务介绍,分布式事物的理解,常见的解决方案有哪些,什么是两阶段提交、三阶段提交;
    数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。

分布式事务:一个大型项目涉及到多个库的操作,这些操作在一个事务中完成。

CAP理论,Base理论。

解决方案:

参考:常用的分布式事务解决方案

  1. MySQL记录binlog的方式主要包括三种格式?每种格式的优缺点是什么?

参考:MySQL binlog相关分析

  1. 分布式事务的原理2阶段提交,同步\异步\阻塞\非阻塞;
    两段式提交是把分布式事务分为两个阶段:都有事务管理器发起(协调者)

一个故事:
出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。
1 老张把水壶放到火上,立等水开。(同步阻塞)
老张觉得自己有点傻
2 老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞)
老张还是觉得自己有点傻,于是变高端了,买了把会响笛的那种水壶。水开之后,能大声发出嘀~~~~的噪音。
3 老张把响水壶放到火上,立等水开。(异步阻塞)
老张觉得这样傻等意义不大
4 老张把响水壶放到火上,去客厅看电视,水壶响之前不再去看它了,响了再去拿壶。(异步非阻塞)

所谓同步异步,只是对于水壶而言。
普通水壶,同步;响水壶,异步。
虽然都能干活,但响水壶可以在自己完工之后,提示老张水开了。这是普通水壶所不能及的。
同步只能让调用者去轮询自己(情况2中),造成老张效率的低下。
所谓阻塞非阻塞,仅仅对于老张而言。
立等的老张,阻塞;看电视的老张,非阻塞。
情况1和情况3中老张就是阻塞的,媳妇喊他都不知道。虽然3中响水壶是异步的,可对于立等的老张没有太大的意义。所以一般异步是配合非阻塞使用的,这样才能发挥异步的效用。

  1. 数据库事务隔离级别,MySQL默认的隔离级别、Spring如何实现事务、JDBC如何实现事务、嵌套事务实现、分布式事务实现;

Spring基于Aop,底层用的还是JDBC,参考Spring事务原理分析

JDBC则是首先设置autoCommit(false),然后在commit或rollback。

嵌套事务则根据数据库的传播行为,如下:

当传播行为是PROPAGATION_NESTED,底层的JDBC类型必须是3.0

参考:Spring事务传播行为详解

  1. SQL的整个解析、执行过程原理;
    SQL解析是一项复杂的技术,一般都是由数据库厂商来掌握,当然也有公司专门提供SQL解析的API。如果做数据库中间件,就必须要进行SQL解析。

SQL解析与优化是属于编译器范畴,和C等其他语言的解析没有本质的区别。其中分为,词法分析、语法和语义分析、优化、执行代码生成。对应到MySQL的部分,如下图


image

具体参考:SQL解析在美团点评中的应用

  1. SQL行转列
    参考:MySQL行转列实现和总结
  1. 为什么要使用索引?
    当使用全表扫描的时候,要把所有的数据加载进内存中,进行扫描,数据量很大的时候,速度会非常慢。很多时候,我们要尽量避免全表扫描,依靠索引,我们就能大幅提升查询的速度。

  2. 什么样的信息能成为索引?

唯一键,普通键,主键都可以。

  1. 索引的数据结构?
    二叉查找树,B树,B+树,Hash
  1. 密集索引与稀疏索引的区别?

密集索引文件中每个搜索码都对应一个索引值
稀疏索引只为某些索引码的某些值建立索引项。

1.稠密索引比稀疏索引更快地定位一条记录。
2.稀疏索引所占空间小,并且插入和删除时所需的维护开销也小。

MyIsam是稀疏索引,而InnoDB使用的是密集索引

image.png
  1. 如何定位并优化慢查询SQL

mysql配置文件可以配置执行时间大于多少位慢SQL,记录到日志中,从慢查询日志中找到SQL,用explain查看SQL执行信息,然后进行优化,至少达到range,要求是ref,如果可以达到const最好。

主键索引未必比普通索引的速度快,在特定场景下使用合适的索引。

  1. 联合索引的最左匹配原则,原因

MySQL会一直向右匹配直到遇到范围查询(<,>,between,like)就停止匹配,=和in可以乱序比如,a=1 and b=2 and c=3,建立(a,b,c)索引可以任意顺序,MySQL的查询优化器会帮你优化为索引可以识别的形式。

在联合索引的时候,MySQL会先对第一个列进行排序,然后再对第二个列进行排序,依次类推,如果直接用第二个列的话,那么就利用不到索引了。

最后

待完善,补充

上一篇 下一篇

猜你喜欢

热点阅读