2021年国企面试数据库必备知识点包含索引、范式、事务、封锁、引擎等

上传人:孙盼 文档编号:195122574 上传时间:2021-09-04 格式:DOCX 页数:6 大小:1.30MB
返回 下载 相关 举报
2021年国企面试数据库必备知识点包含索引、范式、事务、封锁、引擎等_第1页
第1页 / 共6页
2021年国企面试数据库必备知识点包含索引、范式、事务、封锁、引擎等_第2页
第2页 / 共6页
2021年国企面试数据库必备知识点包含索引、范式、事务、封锁、引擎等_第3页
第3页 / 共6页
2021年国企面试数据库必备知识点包含索引、范式、事务、封锁、引擎等_第4页
第4页 / 共6页
2021年国企面试数据库必备知识点包含索引、范式、事务、封锁、引擎等_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《2021年国企面试数据库必备知识点包含索引、范式、事务、封锁、引擎等》由会员分享,可在线阅读,更多相关《2021年国企面试数据库必备知识点包含索引、范式、事务、封锁、引擎等(6页珍藏版)》请在金锄头文库上搜索。

1、1 关系型数据库和非关系型数据库的优缺点2 常用的sql语句包括数据库定义语言(DDL):CREATE、DROP、ALTERCREATE创建数据库:CREATE DATABASE db_name;ALTER修改数据库的表结构ALTER TABLE table_name ADD 列名称 类型;DROP删除数据库:DROP DATABASE db_name;数据库操作语言(DML):INSERT、UPDATE、DELETEINSERT向表中插入一行:INSERT INTO table_name (列1, 列2,.) VALUES (值1, 值2,.)UPDATE更新表中的一行:UPDATE 表名称

2、 SET 列名称 = 新值 WHERE 列名称 = 某值DELETE 删除表中的一行:DELETE FROM表名称 WHERE 列名称=值。数据库控制语言(DCL):Grant,RevokeGrant赋权限:CRANT select, insert, update, delete ON testdb.* TO common_user%Revoke撤销权限:REVOKE select, insert, update, delete ON testdb.* TO common_user%事务控制语言(TCL):COMMIT,ROLLBACK3 join表A有:张三,李四。 表B有:李四,王五。内连

3、接的结果:李四。外连接包括:左连接、右连接、全连接。左连接的结果:张三,李四。(返回匹配的记录,以及表 A 多余的记录)右连接的结果:李四,王五。(返回匹配的记录,以及表 B多余的记录)全连接:张三、李四、王五。4 索引4.1 聚集索引(左)和非聚集索引聚集索引规定数据在表中的物理顺序(索引的排序方式和数据的排序方式是一样的),因此一个表只能有一个聚集索引(但他可以包含多列)。它能使查询性能变好而降低Insert、Update的效率。聚集索引的使用场景:1) 查询命令的返回结果是以该字段为排序依据的。2) 查询的结果返回一个区间的值。3) 查询结果返回某值相同的大量结果集。非聚集索引:索引顺序

4、和物理存储数据不同。一张表可以创建多个。使用场景:1) 查询所获取的数据量比较少。2) 某字段的数据唯一性比较高。4.2 聚簇索引和非聚簇索引聚簇索引:把数据行和键值一起存储在二叉树的叶子节点里。非聚簇索引:叶子节点只存储键值。4.3 结合引擎理解索引Mysql有两种引擎:Innodb和MyISAMMyISAM的索引文件和数据分离存储。索引文件只保存数据记录的地址。MyISAM引擎使用B+树索引,叶节点只存放索引值,data域存放数据记录的地址。Innodb也使用B+树索引,键值和数据行一起存放在叶节点中。4.4 索引的底层实现(B+树)不使用hash表的原因:没办法高效的完成范围查找。不使用

5、二叉查找树的原因:id自增的情况下,二叉排序树极端不平衡,退回线性链表。不使用红黑树的原因(红黑树是一种旋转和变色维持自平衡的二叉树,是AVL树和二叉查找树的一种折中):是黑平衡的,不能完全解决右倾趋势。不使用AVL树(AVL是严格平衡的):每个叶节点只存储一个数据,IO开销大。B+树是一棵平衡m叉排序树。所有叶节点位于同一层,且按从小到大的顺序存放关键码,各个叶节点之间顺序连接,方便了范围查找。非叶节点仅用于索引作用,跟记录有关的信息均存放在叶子节点中。所有叶节点构成一个有序的链表(便于区间查找和便利)。B+树和B树的区别:(1) B树的节点存储的是数据,而B+树的节点存储的是索引,B+树叶

6、子节点存储所有的数据。(2) B+树叶子节点串起来形成一个链表方便范围查找和全表扫描。4.5 什么是覆盖索引,回表?覆盖索引就是select的所有列被索引覆盖,也就是仅通过检索索引就能够获取所有想要的数据,而不需要去读取表的数据。Where语句有like时,不会执行覆盖查询。5 范式1范式:数据库的每一列不可拆分。2范式:在1范式的基础上,非主键列完全依赖于主键,不能依赖一部分主键。3范式:在2范式的基础上,非主键列只依赖于主键,不能依赖于其他非主键(无传递依赖)。BCNF:在1范式的基础上,没有传递依赖。6 数据库的完整性(1) 实体完整性:主键不能为空,也不能有相同值(2) 参照完整性:外

7、键不能为空,(3) 用户自定义完整性:对字段属性的约束。7 事务事务是数据库中的一个单独执行单元,由有限的数据库操作序列构成。这些操作要么全执行,要么全都不执行。ACID属性:原子性、一致性、隔离性、持久性。原子性:事务要么全部完成、要么全部取消。隔离性:两个或多个事务同时执行,将事务的操作隔离开来。持久性:一旦事务提交,不管发生什么,数据要保存在数据库中。一致性:事务执行前后,数据库必须保持一致的状态。依赖原子性和隔离性。隔离级别:串行化:最高级别的隔离,两个同时执行的事务串行执行。可重复读:事务成功新增一条数据(已提交),对其他事务是可见的。会出现幻影读。(幻影读:T1新增了一条数据,T2

8、两次count结果不一样。) 事务成功修改一条数据对其他数据则是不可见的。提交的读(不可重复读):事务成功修改的数据对其他数据可见,会出现幻影读和不可重复读,(不可重复读:T1修改的数据使T2两次读取的数据不一样)未提交的读:事务未成功修改的数据对其他数据可见,会出现幻影读、不可重复读和脏读。(脏读:T2读取了T1修改的数据,T1又回滚了。)8 封锁1 共享锁S和排他锁X排它锁(Exclusive):X锁,又称写锁。共享锁(Shared):S锁,又称读锁。规定:如果一个事务对对象A添加了X锁,就可以对对象进行读取和更新操作,此过程其他事务不能对该对象增加任何锁。如果一个事务对对象A加了S锁,就

9、可以对对象A进行读取操作,但是不能进行更新操作,加锁期间,其他事务可以对A加S锁,不能加X锁。只有S锁和S锁是兼容的。意向锁(IX/IS):一个事务在对某个数据行加X锁之前,必须先获得表的IX锁。一个事务在对某个数据行家S锁之前,必须先获得表的IS锁或者更强的锁。IX/IS锁之间都是兼容的。S锁与S锁/IS锁之间是兼容的。封锁协议:一级封锁协议:事务要修改数据时必须加X锁。直至修改完毕释放。可以解决丢失修改问题。二级封锁协议:在一级锁的基础上,要求事务读取数据时必须加S锁,读完立即释放。可以解决脏读的问题。三级封锁协议:在二级的基础上,要求事务读取数据时必须加S锁,直至事务结束时释放。解决不可

10、重复读的问题。可串行化调度是指通过并发控制,使得并发执行的事务结果与某个串行执行的事务结果相同。2 乐观锁与悲观锁悲观锁:总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。Java中synchronized和ReentrantLock等独占锁就是悲观锁思想的实现。乐观锁:总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁

11、,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和CAS算法实现。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库提供的类似于write_condition机制,其实都是提供的乐观锁。在Java中java.util.concurrent.atomic包下面的原子变量类就是使用了乐观锁的一种实现方式CAS实现的。版本号方法:在数据表中加上一个版本号version字段,当程序更新数据时,不仅要读取数据,也要读取数据的版本号。提交更新时判断version是否有冲突。有冲突则更新失败。CAS【compareAndSwap】:当多个线程尝试使用CAS同时更新同一个

12、变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试。CAS是一种非阻塞式的同步方式。内存位置V,预期值A,新值B。如果V=A时,CAS通过原子方式用新值B来更新V的值,否则不会执行任何操作3 MVCC多版本并发控制只适用于可重复读和不可重复读两种级别,提供一种类似快照的方式,使得读和写不冲突。是一种用来解决读-写冲突的无锁并发控制,也就是为事务分配单向增长的时间戳,为每个修改保存一个版本,版本与事务时间戳关联,读操作只读该事务开始前的数据库的快照。 这样在读操作不用阻塞写操作,写操作不用阻塞读操作的同时,避免了脏读和不可重

13、复读9 引擎Innodb引擎:Innodb引擎提供了对数据库ACID事务的支持。并且还提供了行级锁和外键的约束。它的设计的目标就是处理大数据容量的数据库系统。使用的是聚簇索引(叶子节点存储了主键和整行数据)。MyIASM引擎(原本Mysql的默认引擎):不提供事务的支持,也不支持行级锁和外键。使用的非聚簇索引(叶子节点存储了主键和数据记录的地址)。适用大量查询少量的插入的情形。MEMORY引擎:所有的数据都在内存中,数据的处理速度快,但是安全性不高。MyISAM的查询性能更优;Innodb的插入性能更优;为什么MyISAM的查询性能更优?因为MyISAM是非聚集索引,叶子节点存储的是数据的物理

14、地址,查询到物理地址再去对应的位置查找数据就可以了。Innodb底层是聚集索引,mysql会在建表的时候建立主键索引树,而其他字段的索引树的叶子节点存储的是主键的值,查找到主键的值之后再去主键索引树里查找数据,因此MyISAM的查询性能更优。最左前缀匹配:创建多列联合索引时,把where子句中使用最频繁的一列放在最左边,mysql索引查询遵循最左前缀匹配原则,即创建一个(k1,k2,k3)的索引,相当于创建了(k1),(k1,k2), (k1,k2,k3)三个索引。10 优化1 对查询进行优化,应该尽量避免全表扫描,首先尽量在Where和order by涉及的列上建立索引。2尽量避免在where上使用!=或者is null或者,否则引擎会放弃使用索引而进行全表扫描。11 varchar和char的区别Char是定长字段,申请了char(10),无论实际存储多少内容,该字段都占用10个字符。Varchar是变长的,申请的是最大长度,占用的空间是实际使用的长度+1,最后一个字符的位置保存占用的长度。因此在能确定使用的长度时使用char因为char的查询效率高,不能确定时使用varchar。12 varchar(10)和int(10)的区别Varchar(10)表示申请的空间长度,也就是可存储的最大长度。Int(10)代表的是展示给用户的长度,不足的补0,不影响其在数据库的存储。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > IT计算机/网络 > 数据库

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号