起航学习网

- 让每个人都能学到最前沿新知识、新技能!
起航学习网
当前位置: 起航学习网 > 短期培训 > 编程语言 > 数据库面试如何才能稳操胜券

数据库面试如何才能稳操胜券

时间:2018-12-11 11:20:38来源:编程网 作者:IT培训网 已有: 名学员访问该课程

  快捷搜索:数据库面试

前言:事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态。对于一个事务内的所有操作,要么同时成功,要么全部失败回滚

数据库面试题集锦,提高面试通过率!

本文对面试/笔试过程中经常会被问到的一些关于数据库(MySQL)的问题进行了梳理和总结,包括数据库索引、数据库锁、数据库事务和MySQL优化等基础知识点,一方面方便自己温故知新,另一方面也希望为找工作的同学们提供一个复习参考。关于这块内容的初步了解和掌握,大家可以阅读《深入浅出MySQL-数据库开发优化与管理》和《数据库系统概念(美 Abraham Silbersch 着;杨冬青 李红燕 唐世 译)》两本书。

数据库有哪些范式?

第一范式:每个属性都不可再分

第二范式:符合1NF,记录唯一性约束

第三范式:数据属性不冗余

什么是数据库索引?

索引是对数据库表中一个或多个列的值进行排序的数据结构,以协助快速查询、更新数据库表中数据

索引的实现通常使用B_TREE及其变种(平衡多路查找树)

索引有什么优点?

大大加快数据的检索速度

加速表和表之间的连接

在使用分组和排序子句进行数据检索时,同样可以显着减少查询中分组和排序的时间

通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性

什么情况下不能使用索引?

以“%(表示任意0个或多个字符)”开头的LIKE语句,模煳匹配

OR语句前后没有同时使用索引

数据类型出现隐式转化(如varchar不加单引号的话可能会自动转换为int型)

对于多列索引,必须满足 最左匹配原则 (eg:多列索引col1、col2和col3,则 索引生效的情形包括 col1或col1,col2或col1,col2,col3)。

where查询语句中对字段进行NULL值判断,is null走索引,等于null不走索引

B树和Hash索引的区别和优缺点?

等值查询使用Hash算法查询更快,键值唯一,B树需要从根节点往下找

范围查找B树更合适,Hash索引有可能变成非连续的

Hash索引不支持多列联合索引的最左匹配原则,哈希索引没法完成排序

什么样的字段适合加索引?

经常作为查询条件的字段

经常作表连接的字段

经常出现在order by, group by, distinct 后面的字段

创建索引的时候需要注意什么?

非空字段:应该指定列为NOT NULL,除非你想存储NULL。在mysql中,含有空值的列很难进行查询优化,因为它们使得索引、索引的统计信息以及比较运算更加复杂。你应该用0、一个特殊的值或者一个空串代替空值;

取值离散大的字段:(变量各个取值之间的差异程度)的列放到联合索引的前面,可以通过count函数查看字段的差异值,返回值越大说明字段的唯一值越多字段的离散程度高

索引字段越小越好:数据库的数据存储以页为单位一页存储的数据越多一次IO操作获取的数据越大效率越高。

索引有哪些缺点?

时间方面:创建索引和维护索引要耗费时间,具体地,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度;

空间方面:索引需要占物理空间。

索引有哪些分类?

普通索引和唯一索引

单列索引和复合索引

聚簇索引与非聚簇索引:聚簇索引的叶子节点就是数据节点,而非聚簇索引的叶子节点仍然是索引节点,只不过有指向对应数据块的指针。(主键一般是聚簇索引)

键、自增主键、主键索引与唯一索引概念区别?

主键:指字段 唯一、不为空值 的列;

字段类型为数字、自增、并且是主键;

主键索引:是一种索引,主键是唯一索引

唯一索引:索引列的值必须唯一,但允许有空值

主键就是聚集索引吗?主键和索引有什么区别?

主键是一种特殊的唯一性索引,其可以是聚集索引,也可以是非聚集索引

你创建主键的时候,自动就创建了主键的聚集索引。

什么是数据库事务?

事务是一个不可分割的数据库操作序列,也是数据库并发控制的基本单位,其执行的结果必须使数据库从一种一致性状态变到另一种一致性状态。对于一个事务内的所有操作,要么同时成功,要么全部失败回滚

事务有哪些特征?

原子性(Atomicity):事务所包含的一系列数据库操作要么全部成功执行,要么全部回滚;

一致性(Consistency):事务的执行结果必须使数据库从一个一致性状态到另一个一致性状态;

隔离性(Isolation):并发执行的事务之间不能相互影响;

持久性(Durability):事务一旦提交,对数据库中数据的改变是永久性的。

事务并发会带来什么问题?

脏读:一个事务读取了另一个事务未提交的数据

不可重复读:一个事务多次读取同一条数据,期间被另外一个事务修改,得到了不同的结果

幻读:一个事务把所有的数据改成某一个值,另外一个新的事务插入一条不为这个值的数据,第一个事务读到了一条特殊的数据,这时候就产生了幻读

事务有哪些隔离级别?

读未提交(READ UNCOMMITTED):无法避免脏读,不可重复读,幻读,好处快

读已提交READ COMMITTED:可避免脏读,无法避免不可重复读,幻读,变慢了

重复读REPEATABLE READ:可避免脏读,不可重复读,无法避免幻读

串行SERIALIZABLE:可以避免脏读,不可重复读,幻读,效率低慢

mysql的事务支持?

MyISAM:不支持事务,用于只读程序提高性能;

InnoDB:支持ACID事务、行级锁、并发;

Berkeley DB:支持事务。

怎么发现有问题的SQL?

通过MySQL的慢查询日志,我们可以查询出执行的次数多占用的时间长的SQL、可以通过pt_query_disgest(一种mysql慢日志分析工具)分析Rows examine(MySQL执行器需要检查的行数)项去找出IO大的SQL以及发现未命中索引的SQL,对于这些SQL,都是我们优化的对象

SQL语句怎么优化?

应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描

应尽量避免在 where 子句中对字段进行null值判断,否则将导致引擎放弃使用索引而进行全表扫描

优化嵌套查询:子查询可以被更有效率的连接(Join)替代

很多时候用 exists 代替 in 是一个好的选择

索引优化

经常作查询选择的字段、经常作表连接的字段以及经常出现在order by、group by、distinct 后面的字段中建立索引

少用like,or,符合索引,注意顺序

数据库表结构的优化:数据库表结构的优化包括选择合适数据类型、表的范式的优化、表的垂直拆分和表的水平拆分等手段。

选择合适数据类型

使用较小的数据类型解决问题;

使用简单的数据类型(mysql处理int要比varchar容易);

尽可能的使用not null 定义字段;

尽量避免使用text类型,非用不可时最好考虑分表;

表的范式的优化

一般情况下,表的设计应该遵循三大范式。

表的垂直拆分

把不常用的字段单独放在同一个表中;

把大字段独立放入一个表中;

把经常使用的字段放在一起

表的水平拆分

对同一张表拆成多个子表,一般根据关键业务Id进行拆分

hash,取余,最好分成2的指数张表,&操作比取余快

系统配置的优化

硬件的优化

NOSQL数据库 —— Redis

什么是存储过程,有哪些优缺点?

进一步地说,存储过程是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后再给这个代码块取一个名字,在用到这个功能的时候调用他就行了

存储过程只在创建时进行编译,以后每次执行存储过程都不需再重新编译,而一般 SQL 语句每执行一次就编译一次,所以使用存储过程可提高数据库执行效率

当SQL语句有变动时,可以只修改数据库中的存储过程而不必修改代码

减少网络传输,在客户端调用一个存储过程当然比执行一串SQL传输的数据量要小

通过存储过程能够使没有权限的用户在控制之下间接地存取数据库,从而确保数据的安全。

缺点

不便于调试。基本上没有较好的调试器

无法适应数据库的切割

临时表和正常表

临时表优先级较高,如果同时存在,先操作临时表

sql连接查询

内连接(默认)

外连接:左连接,右连接,全连接:将左右两个表中的数据都查询出来

交叉连接:笛卡尔积

UNION:并集

说一说drop、delete与truncate的区别?

delete用来删除表的全部或者一部分数据行,执行delete之后,用户需要提交(commmit)或者回滚(rollback)来执行删除或者撤销删除, delete命令会触发这个表上所有的delete触发器

Truncate删除表中的所有数据,这个操作不能回滚,也不会触发这个表上的触发器,TRUNCATE比delete更快,占用的空间更小;

Drop命令从数据库中删除表,所有的数据行,索引和权限也会被删除,所有的DML触发器也不会被触发,这个命令也不能回滚。

什么叫视图?游标是什么

视图是一种虚拟的表,通常是有一个表或者多个表的行或列的子集,具有和物理表相同的功能,可以对视图进行增,删,改,查等操作。特别地,对视图的修改不影响基本表。相比多表查询,它使得我们获取数据更容易。

游标是对查询出来的结果集作为一个单元来有效的处理。游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行。可以对结果集当前行做修改。一般不使用游标,但是需要逐条处理数据的时候,游标显得十分重要。

什么是触发器trigger?

在特定的时间和事件触发,如在插入前(before insert)

什么是悲观锁和乐观锁?

悲观锁:当数据库执行select … for update时会获取被select中的数据行的行锁,因此其他并发执行的select … for update如果试图选中同一行则会发生排斥(需要等待行锁被释放),因此达到锁的效果。select for update获取的行锁会在当前事务结束时自动释放,因此必须在事务中使用

乐观锁:乐观锁的特点先进行业务操作,只在最后实际更新数据时进行检查数据是否被更新过,若未被更新过,则更新成功;否则,失败重试

读多写少更适合用乐观锁,读少写多更适合用悲观锁

MySQL存储引擎中的MyISAM和InnoDB区别?

MyISAM(5.5以前默认):

不支持事务

存储结构:3个文件

存储空间:MyISAM可被压缩,占据的存储空间较小,支持静态表、动态表、压缩表三种不同的存储格式

可移植性、备份及恢复:MyISAM的数据是以文件的形式存储,所以在跨平台的数据转移中会很方便,同时在备份和恢复时也可单独针对某个表进行操作。

事务支持:MyISAM强调的是性能,每次查询具有原子性,其执行数度比InnoDB类型更快,但是不提供事务支持

MyISAM只支持表级锁

在MyISAM中,如果执行大量的SELECT,MyISAM是更好的选择

MyISAM不支持外键

InnoDB:

支持事务,行级锁,并发

一个文件

存储空间:InnoDB需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。

可移植性、备份及恢复:InnoDB免费的方案可以是拷贝数据文件、备份 binlog,或者用 mysqldump,在数据量达到几十G的时候就相对痛苦了

事务支持:InnoDB提供事务、外键等高级数据库功能,具有事务提交、回滚和崩溃修复能力。

InnoDB支持事务和行级锁

对于InnoDB,如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表

InnoDB支持外键

文章出自:http://qh.itpxw.cn/peixun/software/201845353.html

文章标题:数据库面试如何才能稳操胜券



免责声明:本站文章均由入驻起航学习网的会员所发或者网络转载,所述观点仅代表作者本人,不代表起航学习网立场。如有侵权或者其他问题,请联系举报,必删。侵权投诉

你也许会喜欢如下的文章?
(责任编辑:IT培训网)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
培训学校
IT培训网 访问该机构站点 报名留言 加为好友 用户等级:注册会员 用户级别:10 机构名称:IT培训网 联 系 人:罗老师 联系电话:13783581536 联系手机:13783581536 在线客服:起航学习网客服 在 线 QQ:起航学习网客服 电子邮件: 网站域名:http://www.itpxw.cn 注册时间:2016-07-18 11:07 最后登录:2024-02-20 13:02
推荐内容