数据库-常见口试题汇总_数据库口试

[复制链接]
发表于 2026-2-24 01:30:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
在外毗连中,某些不满条件的列也会体现出来,也就是说,只限定此中一个表的行,而不限定另一个表的行。分左毗连、右毗连、全毗连三种。
SQL语言包罗哪些范例?

数据界说:Create Table,Alter Table,Drop/Truncate Table, Create/Drop Index
数据利用:Select ,Insert,Update,Delete
数据控制:Grant,Revoke
SQL 束缚有哪几种?



  • NOT NULL: 用于控制字段的内容肯定不能为空(NULL)。
  • UNIQUE: 控件字段内容不能重复,一个表答应有多个 Unique 束缚。
  • PRIMARY KEY: 也是用于控件字段内容不能重复,但它在一个表只答应出现一个。
  • FOREIGN KEY: 用于防备粉碎表之间毗连的动作,也能防止非法数据插入外键列,由于它必须是它指向的谁人表中的值之一。
  • CHECK: 用于控制字段的值范围。
视图

视图的作用,视图可以更改么?



  • 创建视图: create view xxx as xxx
  • 视图是假造的表,与包罗数据的表不一样,视图只包罗利用时动态检索数据的查询,不包罗任何列或数据;
  • 利用视图可以简化复杂的sql操纵,隐蔽具体的细节,掩护数据;
  • 视图创建后,可以利用与表雷同的方式利用它们;
  • 视图不能被索引,也不能有关联的触发器或默认值,假如视图自己内有order by则对视图再次order by将被覆盖。
对于某些视图,比方,未利用联结子查询分组聚集函数Distinct Union等,是可以对其更新的,对视图的更新将对基表举行更新;但是视图重要用于简化检索,掩护数据,并不消于更新,而且大部分视图都不可以更新。
变乱和锁

什么是变乱和锁?

变乱就是被绑定在一起作为一个逻辑工作单位的SQL语句分组,假如任何一个语句操纵失败那么整个操纵就被失败,以后操纵就会回滚到操纵前状态,大概是上一个节点。为了确保要么实验,要么不实验,就可以利用变乱。要将一组语句作为变乱思量,就必要通过ACID测试,即原子性(Atomicity)、同等性(Consistency)、隔离性(Isolation)、长期性(Durability)。
锁:在全部的DBMS中,锁是实现变乱的关键,锁可以包管变乱的完备性和并发性。与实际生存中锁一样,它可以使某些数据的拥有者,在某段时间内不能利用某些数据或数据结构。固然锁还分级别的。共享锁(只读不写)、排他锁(可读可写)等。
变乱的四大特性实现原理?

原子性(Atomicity):重要依靠undo.log日志日志实现,即在变乱失败时实验回滚。undo.log日志日志会记载变乱实验的sql,当变乱必要回滚时,通过反向赔偿回滚数据库状态。
同等性(Consistency):就是变乱再实验的前和后数据库的状态都是正常的,体现为没有违背数据完备性,参照完备性和用户自界说完备性等等,上面三种特性就是为了包管数据库的有同等性。
隔离性(Isolation):多线程时,多变乱之间相互产生了影响,要克制这个影响,那就加锁。mysql的锁有表锁,行锁,间隙锁等。写写操纵通过加锁实现隔离性,写读操纵通过MVCC实现。
长期性(Durability):重要依靠redo.log日志日志实现。起首,mysql长期化通过缓存来进步服从,即在select时先查缓存,再查磁盘;在update时先更新缓存,再更新磁盘。以镌汰磁盘io次数,进步服从。但由于缓存断电就没了,以是必要redo.log日志。在实验修改操纵时,sql会先写入到redo.log日志,再写入缓存中。如许纵然断电,也能包管数据不丢失,到达长期性。接纳序次io,即文件追加方式,更快。
变乱的隔离级别?



  • 读未提交(脏读)
  • 读已提交(不可重复读)
  • 可重复读(幻读->间隙锁办理)
  • 序列化读
脏读、不可重复读、幻读?

脏读:A变乱实验过程中,B变乱读取了A变乱的修改。但是由于某些缘故起因,A变乱大概没有完成提交(读未提交),发生RollBack了操纵,则B变乱所读取的数据就会是不正确的。
不可重复读:B变乱读取了两次数据,在这两次的读取过程中A变乱修改了数据(读已提交),B变乱的这两次读取出来的数据不一样。B变乱这种读取的效果,即为不可重复读。
幻读:变乱读取了两次数据,在这两次的读取过程中A变乱添加了数据,B变乱的这两次读取出来的数据不一样。
锁的分类



  • 从数据库体系角度分为三种:X/排他/互斥锁、S/共享/读锁、U/更新锁。
  • 从步伐员角度分为两种:一种是悲观锁,一种乐观锁。
  • 从级别角度分为三种:行(级)锁,表(级)锁,间隙锁。
另有其他锁,见下图:

图片泉源:技能口试之:五问乐观锁悲观锁_哔哩哔哩_bilibili
X/排他/互斥锁
假如一个变乱对对象加了排他锁,其他变乱就不能再给它加任何锁了。
S/读/共享锁
用于全部的只读数据操纵。共享锁黑白独占的,允许多个并发变乱读取其锁定的资源。
更新锁
在修改操纵的初始化阶段用来锁定大概要被修改的资源,如许可以克制利用共享锁造成的死锁征象。
当利用共享锁时,修改数据的操纵分为两步:

  • 起首得到一个共享锁,读取数据,
  • 然后将共享锁升级为排他锁,再实验修改操纵。
读写锁
是一种 读共享,写独占的锁(共享锁+互斥锁)。可明确为一本小说有多个作家和读者,只能一个作家在写,答应一个作家和多个读者利用。
当读写锁被加了写锁时,其他线程对该锁加读锁大概写锁都会壅闭。
当读写锁被加了读锁时,其他线程对该锁加写锁会壅闭,加读锁会乐成。
悲观锁
顾名思义,很悲观,每次去拿数据的时间都以为别人会修改,以是每次在拿数据的时间都会上锁,如许别人拿这个数据就会block(壅闭),直到它拿走锁。利用变乱的机制,实用临界区有IO操纵,代码复杂,竞争猛烈的环境。
乐观锁
没有用到锁,修改时以为自己可以拿到资源,修改资源的状态。是利用CAS来举行同步,要修改资源时举行一个compare再swap的操纵。是应用层实现的机制,实用于并发写入少,大多是读操纵的环境。
行(级)锁
某一行数据有多个修改的,后修改的必要等先修改的提交后再实验。
表(级)锁
一个缘故起因:索引失效(比方,条件语句利用or毗连),由行级锁升级为表锁。
间隙锁
条件语句表范围,比方,x列1-9,数据库中x列有4,6,8,那么在提交前就不能插入5。
间隙锁可办理幻读题目:MySQL 间隙锁办理幻读题目_Ronin_88的博客-CSDN博客_间隙锁办理幻读
悲观锁有哪些劣势?


  • 性能:壅闭和叫醒
  • 拥有锁的线程永世壅闭(永久不能开释锁)
  • 优先级,被壅闭的线程优先级高,持有锁的线程优先级低,导致优先级反转题目。
索引

索引的缺点?

索引一样平常比力大,存在磁盘中,占空间而且IO操纵多了会耗时。
对表记载举行修改操纵时,对有索引字段必要调解索引,耗时。
索引的分类?



  • 主键索引
  • 唯一索引
  • 平常索引
  • 多列索引
  • 空间索引
聚簇索引的实现原理,为什么利用聚簇索引?

聚簇索引,索引的序次就是数据存放的序次,以是,很轻易明确,一张数据表只能有一个聚簇索引。
聚簇索引要比非聚簇索引查询服从高许多,特别是范围查询的时间。
用不消聚簇索引
动作利用聚簇索引利用非聚簇索引列经常被分组排序应应返回某范围内的数据应不应一个或少少差别值不应不应小数目的差别值应不应大数目的差别值不应应频仍更新的列不应应外键列应应主键列应应频仍修改索引列不应应性能优化

数据库怎样优化性能?



  • SQL优化
  • 加缓存
  • 分库分表
  • 读写分离
索引怎样优化?



  • 表的主键、外键必须有索引;
  • 经常与其他表举行毗连的表,在毗连字段上应该创建索引;
  • 频仍举行数据操纵的表,不要创建太多的索引;
怎样优化关联查询



  • 确定ON大概USING子句中是否有索引。
  • 确保GROUP BY和ORDER BY只有一个表中的列,如许MySQL才有大概利用索引。
为什么要分库分表?

分表
单表数据量太大,会极大影响sql实验的性能。一样平常来说,单表到几百万条数据的时间,性能就会相对差一些了,就得分表了。
分表就是把一个表的数据放到多个表中,然后查询的时间你就查一个表。比方按照用户 id 来分表,将一个用户的数据就放在一个表中(比方,有10000个用户,id从1-10000,分为两个表,那么id从1-5000的就放到orders1中,查询id为2000的用户的订单时就从orders1中查)。然后操纵的时间你对一个用户就操纵谁人表就好了。如许可以控制每个表的数据量在可控的范围内,好比每个表就固定在 200 万以内。
分库
一个库一样平常最多支持到并发量2000,高出就要扩容了,一个康健的单库并发,最好保持在每秒 1000 左右。可以将一个库的数据拆分到多个库中,访问的时间就访问一个库好了。
分库分表有几种方法?



  • 垂直拆分:把一个有许多字段的表给拆分成多个表,大概是多个库上去。每个库表的结构都不一样,每个库表都包罗部分字段。一样平常来说,会将较少的访问频率很高的字段放到一个表里去,然后将较多的访问频率很低的字段放到别的一个表里去。
  • 程度拆分:把一个表的数据给弄到多个库的多个表里去,但是每个库的表结构都一样,只不外每个库表放的数据是差别的,全部库表的数据加起来就是全部数据。
怎样包管多个主从数据库之间的数据同等?



  • 基于二进制日志复制(完备复制、增量复制)
数据库并发造成的读题目有哪些?怎样办理?



  • 脏读   -->   读提交
  • 不可重复读  —>可重复读
  • 幻读 ------>间隙锁/序列化
范式

数据库的三范式是什么?



  • 第一范式:夸大列的原子性,即数据库表的每一列都是不可分割的。
  • 第二范式:要求实体的属性完全依靠主关键字,不能存在部分依靠。
  • 第三范式:任何非主属性不依靠于别的非主属性,消除了转达依靠。
日志

数据库日志分为哪几种?



  • 通用查询日志
  • 慢查询日志
  • 错误日志
  • 二进制日志
Mysql

主键 超键 候选键 外键



  • 主键:数据库表中对存储数据对象予以唯一和完备标识的数据列或属性的组合。一个数据列只能有一个主键,且主键的取值不能缺失,即不能为空值(Null).
  • 超键:在关系中能唯一标识元组的属性集称为关系模式的超键。一个属性可以作为一个超键,多个属性组合在一起也可以作为一个超键。超键包罗候选键和主键。
  • 候选键:是最小超键,即没有冗余元素的超键。
  • 外键:在一个表中存在的另一个表的主键称此表的外键。
drop,delete与truncate的区别

drop直接删掉表,不可回滚,truncate删除表中全部数据,大概说截断表,与drop一样,不可回滚,再插入时自增长id又从1开始,delete删除表中数据,可以加where子句,可以回滚。
1.delete语句实验删除的过程是每次从表中删除一行,而且同时将该行的删除操纵作为变乱记载在日志中生存以便举行回滚操纵。truncate table则一次性地从表中删除全部的数据并不把单独的删除操纵记载记入日志生存,删除行是不能规复的。而且在删除的过程中不会激活与表有关的删除触发器,实验速率快。
2.表和索引所占空间:当表被truncate后,这个表和索引所占用的空间会规复到初始巨细,而delete操纵不会镌汰表或索引所占用的空间。drop语句将表所占用的空间全开释掉。
3.一样平常而言,drop>truncate>delete
4.应用范围:truncate只能对table,delete可以是table和view
5.结构和数据:truncate和delete只删除数据,而drop则删除整个表(结构和数据)
6.truncate与不带where的delete:只删除数据,而不删除表的结构(界说)drop语句将删除表的结构被依靠的束缚(constrain),触发器(trigger),索引(index);依靠于该表的存储过程/函数将被生存,但其状态会变为:invalid
MySQL中 in 和 exists 区别

MySQL中的in语句是把外表和内表作hash毗连,而exists语句是对外表作loop循环,每次loop循环再对内表举行查询。各人不停以为exists比in语句的服从要高,这种说法实在是禁绝确的。这个是要区分环境的。
假如查询的两个表巨细相称,那么用in和exists差别不大。 假如两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in。
not in 和not exists:假如查询语句利用了not in,那么表里表都举行全表扫描,没有用到索引;而not extsts的子查询依然能用到表上的索引。以是无论谁人表大,用not exists都比not in要快。
Mysql默认的变乱隔离级别是什么?

可重复读
聊聊MySQL索引的发展过程?从没有索引、hash、二叉排序树、AVL树、B树、B+树 聊

没有索引,全遍历
哈希索引(hash index),基于哈希表实现,只有正确匹配索引全部列的查询才有用。对于每一行数据,存储引擎都会对全部的索引列盘算一个哈希码(hash code),  哈希码是一个较小的值,而且差别键值的行盘算出来的哈希码也不一样。哈希索引将全部的哈希码存储在索引中,同时在哈希表中生存指向每个数据行的指针。Memory引擎默认支持哈希索引,假如多个hash值雷同,出现哈希碰撞,那么索引以链表方式存储。
二叉排序树,理想环境下是二分,大概创建时比力深,和一条线差不多,性能并不高
AVL树,办理了二叉排序树的题目,但是
1、每次都要查抄规则,再把树举行重新平衡,这个黑白常斲丧时间的
2、数据量大的话,红黑树的深度会比力深,树一旦深就代表着我们读取磁盘次数就会增长
B树,每个非叶子节点由n-1个key和n个指针构成,此中d<=n<=2d。每个叶子节点最少包罗一个key和两个指针,最多包罗2d-1个key和2d个指针,叶节点的指针均为null 。从根节点举行二分查找,影响查询的是树的高度,利用B树,树的高度可以低沉,恰当单次查询,N个key,高度为h,树的度为d,时间复杂度为
,。
B+树**,**每个节点的指针上限为2d而不是2d+1。**非叶子节点不存储data,只存储key,叶子节点不存储指针。**一样平常B+树的阶数(树节点包罗的子节点数)不会高出100,如许一样平常包管树的高度在3~5层而已,查询速率大大的提升,恰当遍历查询。
MySQL 支持哪些存储引擎?

MySQL 支持多种存储引擎,好比 InnoDB,MyISAM,Memory,Archive 等等.在大多数的环境下,直接选择利用 InnoDB 引擎都是最符合的,InnoDB 也是 MySQL 的默认存储引擎。
MyISAM 和 InnoDB 的区别有哪些:


  • InnoDB 支持变乱,MyISAM 不支持
  • InnoDB 支持外键,而 MyISAM 不支持
  • InnoDB 是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引服从很高;MyISAM 黑白聚集索引,数据文件是分离的,索引生存的是数据文件的指针,主键索引和辅助索引是独立的。
  • Innodb 不支持全文索引,而 MyISAM 支持全文索引,查询服从上 MyISAM 要高;
  • InnoDB 不生存表的具体行数,MyISAM 用一个变量生存了整个表的行数。
  • MyISAM 接纳表级锁(table-level locking);InnoDB支持行级锁(row-level locking)和表级锁,默以为行级锁。
Mysql的Innodb引擎怎样实现MVCC的?

MVCC全称是Multi-Version Concurrent Control,即多版本并发控制,在MVCC协议下,每个读操纵会看到一个同等性的snapshot(快照),而且可以实现非壅闭的读。MVCC答应数据具有多个版本,这个版本可以是时间戳大概是全局递增的变乱ID,在同一个时间点,差别的变乱看到的数据是差别的。
Innodb会为每一行添加两个字段,分别表现该行变乱id(创建版本号)和上个版本(回滚指针),填入的是变乱的版本号,这个版本号随着变乱的创建不停递增。
undo log记载数据各版本修改汗青即变乱链
ReadView是读视图,包罗未提交的变乱ID数组,数组中的最小和最大值构成,用于判断哪些版本可见:不在未提交数组中且变乱ID<max大概是自己,都可见。
读已提交:每次都会天生ReadView。
可重复读:不停利用第一次的ReadView。
在repeated read的隔离级别下,具体各种数据库操纵的实现:


  • select:该行的创建版本号小于便是当前版本号,用于包管在select操纵之前全部的操纵已经实验落地
  • insert:将新插入的行的创建版本号设置为当前体系的版本号。
  • delete:将要删除的行的删除版本号设置为当前体系的版本号。
  • update:不实验原地update,而是转换成insert + delete。将旧行的删除版本号设置为当前版本号,并将新行insert同时设置创建版本号为当前版本号。
此中,写操纵(insert、delete和update)实验时,必要将体系版本号递增。
由于旧数据并不真正的删除,以是必须对这些数据举行清算,Innodb会开启一个配景线程实验清算工作,具体的规则是将删除版本号小于当前体系版本的行删除,这个过程叫做purge。
通过MVCC很好的实现了变乱的隔离性,可以到达repeated read级别,要实现serializable还必须加锁。
undo log
idname变乱id(创建版本号)上个版本(回滚指针)1王五1071061李四1011001张三10099变乱100已提交,变乱101和107未提交,有一变乱id为105的,查询当前name。ReadView  101,[101,107],107,107>105,不可读,101<105但在未提交变乱数组,不可读,100<105,且不在未提交变乱数组,读取100对应name张三。当101提交,在可重复读下,仍然为张三,由于ReadView没有变。可以通过间隙锁(select name for table where id = 1 for update)的方式办理幻读题目,即读取id为1地点行数据,添加间隙锁,使id为1地点行数据不可改变,读取后才华提交。
MyISAM和InnoDB

MyISAM 恰当于一些必要大量查询的应用,但其对于有大量写操纵并不是很好。以致你只是必要update一个字段,整个表都会被锁起来,而别的进程,就算是读进程都无法操纵直到读操纵完成。别的,MyISAM 对于 SELECT COUNT(*) 这类的盘算是超快无比的。
InnoDB 的趋势会是一个非常复杂的存储引擎,对于一些小的应用,它会比 MyISAM 还慢。他是它支持“行锁” ,于是在写操纵比力多的时间,会更精良。而且,他还支持更多的高级应用,好比:变乱。
MySQL 实验查询的过程


  • 客户端通过 TCP 毗连发送毗连哀求到 MySQL 毗连器,毗连器会对该哀求举行权限验证及毗连资源分配
  • 查缓存。(当判断缓存是否掷中时,MySQL 不会举行分析查询语句,而是直接利用 SQL 语句和客户端发送过来的其他原始信息。以是,任何字符上的差别,比方空格、注解等都会导致缓存的不掷中。)
  • 语法分析(SQL 语法是否写错了)。 怎样把语句给到预处理处罚器,查抄数据表和数据列是否存在,分析别名看是否存在歧义。
  • 优化。是否利用索引,天生实验操持。
  • 交给实验器,将数据生存到效果会集,同时会渐渐将数据缓存到查询缓存中,终极将效果集返回给客户端。
什么是MySQL的 binlog?

MySQL的 binlog 是记载全部数据库表结构变动(比方 CREATE、ALTER TABLE)以及表数据修改(INSERT、UPDATE、DELETE)的二进制日志。
Redis

Redis是什么?简述它的优缺点?

Redis本质上是一个Key-Value范例的内存数据库,很像Memcached,整个数据库加载在内存当中操纵,定期通过异步操纵把数据库中的数据flush到硬盘上举行生存。
由于是纯内存操纵,Redis的性能非常精彩,每秒可以处理处罚高出 10万次读写操纵,是已知性能最快的Key-Value 数据库。
长处:


  • 读写性能极高, Redis能读的速率是110000次/s,写的速率是81000次/s。
  • 支持数据长期化,支持AOF和RDB两种长期化方式。
  • 支持变乱, Redis的全部操纵都是原子性的,意思就是要么乐成实验要么失败完全不实验。单个操纵是原子性的。多个操纵也支持变乱,即原子性,通过MULTI和EXEC指令包起来。
  • 数据结构丰富,除了支持string范例的value外,还支持hash、set、zset、list等数据结构。
  • 支持主从复制,主时机自动将数据同步到从机,可以举行读写分离。
  • 丰富的特性 – Redis还支持 publish/subscribe, 关照, key 逾期等特性。
缺点:


  • 数据库容量受到物理内存的限定,不能用作海量数据的高性能读写,因此Redis恰当的场景重要范围在较小数据量的高性能操纵和运算上。
  • 主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不同等的题目,低沉了体系的可用性。
Redis的常用场景有哪些?

1、缓存
缓存现在险些是全部中大型网站都在用的必杀技,公道的利用缓存不光可以大概提升网站访问速率,还能大大低沉数据库的压力。Redis提供了键逾期功能,也提供了机动的键镌汰战略,以是,现在Redis用在缓存的场合非常多。
2、排行榜
许多网站都有排行榜应用的,如京东的月度销量榜单、商品按时间的上新排行榜等。Redis提供的有序聚集数据类构能实现各种复杂的排行榜应用。
写在末了

在竣事之际,我想重申的是,学习并非如攀缘险要高峰,而是如滴水穿石般的长期累积。尤其当我们步入工作岗位之后,持之以恒的学习变得愈发不易,如同在茫茫大海中独自划舟,稍有松懈便大概被巨浪吞噬。然而,对于我们步伐员而言,学习是生存之本,是我们在猛烈市场竞争中立于不败之地的关键。一旦克制学习,我们便如同逆水行舟,不进则退,终将被期间的洪流所镌汰。因此,不停罗致新知识,不光是对自己的提升,更是对自己的一份贵重投资。让我们不停磨砺自己,与期间共同进步,誊写属于我们的光辉篇章。
必要完备版PDF学习资源私我
网上学习资料一大堆,但假如学到的知识不成体系,遇到题目时只是浅尝辄止,不再深入研究,那么很难做到真正的技能提升。
必要这份体系化资料的朋侪,可以点击这里获取
一个人可以走的很快,但一群人才华走的更远!岂论你是正从事IT行业的老鸟或是对IT行业感爱好的新人,都接待参加我们的的圈子(技能交换、学习资源、职场吐槽、大厂内推、口试辅导),让我们一起学习发展!
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表