数据库锁分类

从数据库系统角度分为三种:排他锁、共享锁、更新锁。

从程序员角度分为两种:一种是悲观锁,一种乐观锁。

1.乐观锁和悲观锁

1).乐观锁:每次不加锁,假设没有冲突去完成某项操作,如果因为冲突失败就重试,直到成功为止。就是当去做某个修改或其他操作的时候它认为不会有其他线程来做同样的操作(竞争),这是一种乐观的态度,通常是基于CAS 原子指令来实现的。CAS 通常不会将线程挂起,因此有时性能会好一些。乐观锁的一种实现方式——CAS。

2).悲观锁:还是像它的名字一样,对于并发间操作产生的线程安全问题持悲观状态,悲观锁认为竞争总是会发生,因此每次对某资源进行操作时,都会持有一个独占的锁,就像synchronized,不管三七二十一,直接上了锁就操作资源了

CAS是基于冲突检测的乐观锁(非阻塞)

lock、synchronized是悲观锁,属于抢占式,会引起其他线程阻塞。

volatile提供多线程共享变量可见性和禁止指令重排序优化

2.悲观锁按使用性质划分

1)共享锁(Share Lock)

S锁,也叫读锁。用于所有的只读数据操作。共享锁是非独占的,允许多个并发事务读取其锁定的资源

性质

1. 多个事务可封锁同一个共享页;

2. 任何事务都不能修改该页;

3. 通常是该页被读取完毕,S锁立即被释放

2)排他锁(Exclusive Lock)

X锁,也叫写锁,表示对数据进行写操作。如果一个事务对对象加了排他锁,其他事务就不能再给它加任何锁了。(某个顾客把试衣间从里面反锁了,其他顾客想要使用这个试衣间,就只有等待锁从里面打开了。)

1. 仅允许一个事务封锁此页;

2. 其他任何事务必须等到X锁被释放才能对该页进行访问;

3. X锁一直到事务结束才能被释放。

3)更新锁

U锁,在修改操作的初始化阶段用来锁定可能要被修改的资源,这样可以避免使用共享锁造成的死锁现象。

性质

1. 用来预定要对此页施加X锁,它允许其他事务读,但不允许再施加U锁或X锁;

2. 当被读取的页要被更新时,则升级为X锁;

3. U锁一直到事务结束时才能被释放。

3.悲观锁按作用范围划分为:行锁、表锁

1)行锁

锁的作用范围是行级别。

2)表锁

锁的作用范围是整张表。

数据库能够确定那些行需要锁的情况下使用行锁,如果不知道会影响哪些行的时候就会使用表锁。

数据库表与表之间关系

1.一对一关系: 两个表,在第一个表中的某一行只与第二个表中的一行相关,同时第二个表中的某一行,也只与第一个表中的一行相关,我们称这两个表为一对一关系。

情况一:一个表包含了太多的数据列

情况二:将数据分离到不同的表,划分不同的安全级别。

情况三:将常用数据列抽取出来组成一个表

2.一对多关系:

定义:有多张表,第一个表中的行可以与第二个表中的一到多个行相关联,但是第二个表中的一行只能与第一个表中的一行相关联。

一对多关系是最常见的关系类型。

3.多对多关系:

定义:有两个表,第一个表的一行可以与第二个表中的一到多个行相关联,同时,第二个表中的一行可以与第一个表中的一到多个行相关联

数据库索引分类

1.定义:

没建立索引:默认的方式是根据搜索条件进行全表扫描,遇到匹配条件的就加入搜索结果集合,时间复杂度为O(N)

建立索引: 通过不断的缩小想要获得数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件(类似于书目录), 对某一字段增加索引,查询时就会先去索引列表中一次定位到特定值的行数,大大减少遍历匹配的行数,所以能明显增加查询的速度。

首先去索引列表中查询,而我们的索引列表是B类树的数据结构,查询的时间复杂度为O(log2N),定位到特定值得行就会非常快,所以其查询速度就会非常快。

索引是一种数据结构。索引本身很大,不可能全部存储在内存中,因此索引以索引表的形式存储在磁盘中

作用:提高查询速度、确保数据的唯一性、可以加速表和表之间的连接,实现表和表之间的参照完整性、使用分组和排序子句进行数据检索时,可以减少分组和排序的时间、全文检索字段进行搜素优化

2.分类:

1)主键索引(PRIMAY KEY):

PRIMARY KEY (`id`),

数据库表经常有一列或列组合,其值唯一标识表中的每一行。该列称为表的主键,该索引要求主键中的每个值都唯一。当在查询中使用主键索引时,它还允许对数据的快速访问。

2)唯一索引(UNIQUE):

CREATE UNIQUE INDEX indexName ON table(column(length))

表明此索引的每一个索引值只对应唯一的数据记录,对于单列惟一性索引,这保证单列不包含重复的值。对于多列惟一性索引,保证多个值的组合不重复。

3)常规索引(INDEX)

CREATE INDEX index_name ON table(column(length))

4)全文索引(FULLTEXT)

CREATE FULLTEXT INDEX index_content ON article(content)

查询时指定方式:SELECT * FROM tab_name WHERE MATCH (col1,col2) AGAINST (search_word);

5)聚集索引和非聚集索引

聚集索引: 数据按索引顺序存储,中子结点存储真实的物理数据

非聚集索引:存储指向真正数据行的指针

3.实现方式:

最常用——B+树索引

1)B+树中间节点没有数据,所以同样大小的磁盘页上可以容纳更多节点元素

2)B+树的查询必须最终找到叶子节点,而B-树只需要找到匹配的元素即可

3)B-树只能依靠繁琐的中序遍历,而B+树只需要在链表上遍历即可

次之——hash索引

哈希索引就是采用一定的哈希算法,把键值换算成新的哈希值,检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需一次哈希算法即可立刻定位到相应的位置,速度非常快

区别:

1)Hash 索引仅仅能满足"=",和"<=>"等值查询,能使用范围查询

2)Hash 索引无法被用来避免数据的排序操作。Hash 索引比较的是进行 Hash 运算之后的 Hash 值, 经过相应的 Hash 算法处理之后的 Hash 值的大小关系,并不能保证和Hash运算前完全一样。

3) Hash 索引不支持多列联合索引的最左匹配规则

4)在有大量重复键值情况下,哈希索引的效率也是极低的,因为存在所谓的哈希碰撞问题

4.索引匹配规则

最左匹配规则

5.索引失效:

1)where语句中带有or, 但是没有把or中所有字段加上索引

2)where语句中使用 != 或 <> 操作符

3)where语句中like查询以‘%’开头时,不会使用

4)where语句中使用not in,not exist会让索引失效

4)多列索引的第一部分没有使用索引的话,将不会使用索引,只要第一列使用了索引,后面的列不带索引也会生效

5) 如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不会使用索引

6)当全表扫描(未使用索引)比使用索引快时,不会使用

7)隐式类型转换导致索引失效,字符串转int时

8) 在 where 子句中对字段进行表达式或函数操作,这将导致引擎放弃使用索引而进行全表扫描

内连接与外连接

1.内连接,也被称为自然连接,只有两个表相匹配的行才能在结果集中出现。返回的结果集选取了两个表中所有相匹配的数据,舍弃了不匹配的数据。由于内连接是从结果表中删除与其他连接表中没有匹配的所有行,所以内连接可能会造成信息的丢失。内连接语法如下:

seselect * from t1 inner join t2 on t1.id=t2.id;

2.外连接不仅包含符合连接条件的行,还包含左表(左连接时)、右表(右连接时)或两个边接表(全外连接)中的所有数据行。 SQL外连接共有三种类型:左外连接(关键字为LEFT OUTER JOIN)、右外连接(关键字为RIGHT OUTER JOIN)和全外连接(关键字为FULL OUTER JOIN)。外连接的用法和内连接一样,只是将INNER JOIN关键字替换为相应的外连接关键字即可:

1)左外连接:即以左表为基准,到右表找匹配的数据,找不到匹配的用NULL 补齐

select * from t1 left join t2 on t1.id=t2.id

1)右外连接:即以右表为基准,到左表找匹配的数据,找不到匹配的用NULL 补齐

select * from t1 right join t2 on t1.id=t2.id; ID

3)全外连接(FULL JOIN 或 FULL OUTER JOIN):除了显示符合连接条件的记录外,在 2 个表中的其他记录也显示出来.

此外,可以用using代替on

a LEFT JOIN b USING (c1,c2,c3)

其作用相当于语句:

a LEFT JOIN b ON a.c1=b.c1 AND a.c2=b.c2 AND a.c3=b.c3

存储过程

SQL语句需要先编译然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它

语法定义:

DELIMITER //

CREATE PROCEDURE myproc(OUT s int)

BEGIN

SELECT COUNT(*) INTO s FROM students;

END

//

DELIMITER ;

优点:

1.存储过程因为 SQL 语句已经预编译过了,因此运行的速度比较快

2.存储过程在服务器端运行,减少客户端的压力

3.允许模块化程序设计,就是说只需要创建一次过程,以后在程序中就可以调用该过程任意次,类似方法的复用

4.减少网络流量

5. 增强了使用的安全性

缺点:调试麻烦(至少没有像开发程序那样容易),可移植性不灵活(因 为存储过程是依赖于具体的数据库)

数据库的三级范式

第一范式(1NF):数据表中的每一列(每个字段)必须是不可拆分的最小单元,也就是确保每一列的原子性;

第二范式(2NF):满足1NF后,要求表中的所有列,都必须依赖于主键,而不能有任何一列与主键没有关系,也就是说一个表只描述一件事情;

第三范式(3NF):必须先满足第二范式(2NF),要求:表中的每一列只与主键直接相关而不是间接相关,(表中的每一列只能依赖于主键)任何非主属性不依赖于其它非主属性

事物

1. 原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开 始前的状态,就像这个事务从没有执行过一样

2. 一致性:在事务开始和完成时,数据库中的数据都保持一致的状态,数据的完整性约束没有被破坏。(事务的执行使得数据库从一种正确状态转换成另一种正确状态)。具体 来说就是,比如表与表之间存在外键约束关系,那么你对数据库进行的修改操作就必需要 满足约束条件,即如果你修改了一张表中的数据,那你还需要修改与之存在外键约束关系 的其他表中对应的数据,以达到一致性

3.隔离性:一个事务的执行不能被其他事务干扰。为了防止事务操作间的混淆,必须串行化或序列化请 求,使得在同一时间仅有一个请求用于同一数据。(在事务正确提交之前, 不允许把该事务对数据的任何改变提供给任何其他事务)。(事务处理过程中的中间状态 对外部是不可见的)。隔离性通过锁就可以实现

4.持久性:一个事务一旦提交,它对数据库中数据的改变就应该是永久性的,并不会被回滚

BEGIN 或 START TRANSACTION:显示地开启一个事务;

COMMIT:提交事务,并使已对数据库进行的所有修改称为永久性的;

ROLLBACK:回滚会结束用户的事务,并撤销正在进行的所有未提交的修改

数据库的隔离性实现

1.脏读:是指在一个事务处理过程里读取了另一个未提交的事务中的数据

2.不可重复读:是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了

3.幻读:是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样

区别:

1.不可重复读和脏读的区别是:脏读是某一事务读取了另一个事务未提交的脏数据,而不可重复读则是读取了前一事务提交的数据

2.幻读和不可重复读都是读取了另一条已经提交的事务(这点就脏读不同),所不同的是不可重复读查询的都是同一个数据项,而幻读针对的是一批数据整体(比如数据的个数)

MySQL数据库四种隔离级别:

在MySQL数据库中默认的隔离级别为Repeatable read (可重复读), 在Oracle数据库中,只支持Serializable (串行化)级别和Read committed (读已提交)这两种级别,其中默认的为Read committed级别

1.Serializable (串行化):可避免脏读、不可重复读、幻读的发生。

2.Repeatable read (可重复读):可避免脏读、不可重复读的发生。

3.Read committed (读已提交):可避免脏读的发生。

4.Read uncommitted (读未提交):最低级别,任何情况都无法保证。

判断表的字段值是否为空

1.查询字段值为空的语法:where <字段名> is null

2.查询字段值不为空的语法:where <字段名> is not null 或者where NoT(<字段名> IS NULL)

关键字汇总

alter、update、drop、delete、desc、show、use、truncate、insert into、as、

distinct、group by、order by、desc、limit、LIKE、in、inner join...on、left(right、full) join....on、union

if、between ... and ....、not、

后台开发人员面试内容——数据库(二)相关推荐

  1. 后台开发人员面试内容——JVM虚拟机(四)

    一.Java类加载机制 类从被加载到虚拟机内存中开始,到卸载出内存,它的整个生命周期包括:加载(Loading).验证(Verification).准备(Preparation).解析(Resolut ...

  2. 后台开发人员面试内容——Redis非关系数据库(三)

    主要介绍:Redis概念,特点,数据存储类型,持久化方式及其优缺点,通讯协议,五种架构模式,缓存穿透.缓存雪崩.缓存并发及其的解决办法 关系数据库: 关系型数据库最典型的数据结构是表,由二维表及其之间 ...

  3. 后台开发人员面试内容——计算机网络(五)

    计算机网络 一.OSI七层网络协议: 应用层--表示层--会话层--传输层--网络层--数据链路层--物理层 五层体系机构: 应用层--传输层(TCP报文.UDP数据包)--网络层(IP数据报或分组) ...

  4. 后台开发人员面试内容——操作系统(一)

    操作系统 并发编程的3个基本概念 1.原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行 2.可见性:指当多个线程访问同一个变量时,一个线程修改了这个变量的值 ...

  5. 2018平安科技春季校招后台开发人员面试经历

    步骤 1.在线IQ.EQ测试,EQ测试题量大,选正能量.积极的选项即可. 2.通过1之后隔天会收到在线笔试邀请,附笔试地址链接.牛客网的题,12道单选,4道多选,两道编程,内容上涵盖了网络基础,jav ...

  6. 2021年4月19日 深圳头条后台开发实习面试(二面)(含总结)

    title: 2021年4月19日 深圳头条后台开发实习面试(二面) tags: 面经 2021年4月19日 深圳头条后台开发实习面试(二面) 自我介绍 面试直接跟我讲你想让我问哪个方面的问题呢?(这 ...

  7. think in java interview-高级开发人员面试宝典(二)

    think in java interview-高级开发人员面试宝典(二) 分类: 面经2013-08-05 00:4318634人阅读评论(58)收藏举报 目录(?)[+] 从现在开始,以样题的方式 ...

  8. 2021年4月19日 深圳头条后台开发实习面试(一面)(含总结)

    title: 2021年4月19日 深圳头条后台开发实习面试(一面) tags: 面经 2021年4月19日 深圳头条后台开发实习面试(一面) 自我介绍 谈了一下数学建模的经历,以及跟我现在做的深度学 ...

  9. 作为一名后台开发人员,你必须知道的两种过滤器

    前段时间在网上看到一篇关于过滤器的文章,感觉非常硬核.又因为这个知识点是后台开发中必知必会的技能点,所以分享给大家,一起学习,共同进步! 下面是正文. 对于海量数据处理业务,我们通常需要一个索引数据结 ...

最新文章

  1. 几种替代MATLAB的工具,堪称完美!
  2. 随机梯度下降(Stochastic gradient descent)和 批量梯度下降(Batch gradient descent )的公式对比、实现对比
  3. Android CTS 测试总结【转】
  4. 百度为什么发现不了旗下网站的恶意代码?
  5. 数字型变量可以直接计算
  6. java.lang.IllegalStateException: Not connected to server
  7. java 品尝饮料,java细节经典题型
  8. layoutSubviews调用
  9. oracle解压后不能运行,求救:oracle10安装后net Manager等工具无法启动
  10. CreateaJointCurve.txt
  11. 【例9.3】求最长不下降序列
  12. python载入图片序列_python – 使用matplotlib显示图像序列
  13. 苹果系统升级服务器,苹果操作系统升级 正式挥别PowerPC
  14. 华为手机相册怎么镜像翻转_怎么制作照片视频?利用手机相册快速制作卡点视频...
  15. 深度linux怎样设置显卡,在Deepin系统中安装英伟达NVIDIA显卡驱动的方法
  16. 设计模式——仲裁模式
  17. 2、智慧变电站 - 地面、围墙绘制及动态贴图
  18. openstack 单节点 ubuntu 12.04 server 安装步骤 转自陈沙克老师博客
  19. OpenCvSharp (C# OpenCV) OCR实现中英文识别 文字识别(附WinForm完整源码)
  20. SOLIDWORKS Electrical无缝集成电气和机械设计

热门文章

  1. linux查看samba目录的配额,问Samba中一个共享目录,怎么限制其容量大小?不是用户级quota!!...
  2. Linux中断与进程切换,结合中断上下文切换和进程上下文切换分析Linux内核的一般执行过程...
  3. 化工设备与反应器 第三章 直梁的弯曲
  4. 额外篇 | basemap(下)
  5. 听说Attention与Softmax更配哦~
  6. 北京/杭州 | 阿里巴巴达摩院自然语言智能生物医学团队招聘研究型实习生
  7. 直播预告 | 中国工程院院刊:信息与电子工程领域青年学术前沿论坛
  8. 从200多篇顶会论文看推荐系统前沿方向与最新进展
  9. UC伯克利摘最佳论文、Hugging Face获最佳demo,EMNLP 2020奖项公布
  10. ICLR 2020 | 可提速3000倍的全新信息匹配架构(附代码复现)