您的位置:首页 > 职场人生

关于数据库(Mysql)的一些面试(笔试)问题

2016-11-11 19:24 603 查看
首先是笔试

笔试考得更多的是一些指令:增 删 改 查。

其中查(select)考得最多。select *** from *** where ***,只会这个是远远不够的,考得很多的是子查询 select *** from *** where id in(select id from *** where ***)

我这边写的是查考的,《必知必会》还需要多看,这本书应付笔试足够了。下面再罗列一些常考的:聚类函数(AVG,COUNT,MAX,MIN,SUM)、分组数据(group by)、过滤分组(group by having)、排序(order by)、联结查询。

其他增 删 改自己看吧,主要掌握一些基础操作就行了。总之一句话,看《必知必会》。

然后是关于面试

面试问的可深可浅,主要还是看公司,曾经被一家互联网公司狂挖数据库相关的知识。所以关于数据库面试的准备,底层的原理掌握的越扎实越好,千万不要浅尝则止,不然很有可能因为数据库这块成为你成功拿到offer的拦路虎--互联网公司很看重。本人对数据库底层的原理也并没有掌握的很深,但是还是可以应付下面试,下面罗列我所有面试关于数据库的问题,重要性不分先后,想到什么写什么,我也会简单说下答案,但更多的答案还是需要去看下一些牛人的技术博客,我会给出链接:

1、知道索引吗?

索引的优点当然是快速搜索,但是也不能滥用索引,因为创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加;索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占一定的物理空间,如果要建立聚簇索引,那么需要的空间就会更大;当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这样就降低了数据的维护速度。
索引又分为聚类索引和非聚类索引。先简单讲讲个人的理解:
聚类索引:
聚类索引是索引的逻辑顺序决定表的物理顺序,可以拿查字典的例子说明,所有“z”开头的字都是放在字典的最后几页,“z”这个字母在字母表中顺序即为字典在正文中的顺序。
非聚类索引
索引的逻辑顺序与表中的物理顺序并没有关系,再拿查字典的例子说明,对于一个不认识的字,我们只能根据偏旁去搜索,具有相同偏旁的字在字典正文中并不是顺序放在一起。
索引是通过二叉树的结构来存储的,对于聚类索引,叶子结点即为数据结点,对于非聚类索引,叶子结点还是索引结点,作为指针指向对应的数据。
具体描述,可参看http://www.cnblogs.com/aspnethot/articles/1504082.html
索引还可以分为主键索引、唯一索引、普通索引、全文索引,这些索引怎么创建,具体了解下全文索引。还有就是复合索引,复合索引其实是给多个字段加索引。这时面试官会问,如果给a,b,c三个字段加了索引,我是否可以按a,b查找?是否可以按b,c索引?前者可以,后者不行。这里给几篇博文吧:
https://segmentfault.com/a/1190000000473085; https://www.zhihu.com/question/31109426

2、存储过程用过吗?说一下:

所谓存储过程就是预编译的SQL语句,支持模块化设计,说白了就是创建一次,在程序中可以被多次调用。例如某次操作需要执行多次SQL,就可以把这个SQL做一个存储过程。存储过程比单纯的SQL语句执行要快,因为它是预编译的。

3、常用的数据库有哪些?用过redis吗?

mysql sqlserver。建议看下它们的区别,我没被问到过。
问到redis,首先你得知道它是一种缓存服务器,那么问题又来了,有哪些缓存服务器,它们之间的区别,这个百度下一大片,也不给具体链接了。详细了解下redis的支持的类型,以及你在项目中是怎么用的,没用过也没事,你能讲清楚redis是怎么一回事,面试官也不会为难你。

4、讲下事务:

事务四个特性:原子性、一致性、隔离性、持久性。分别讲下四个特性是怎么回事。

5、事务的隔离性:

这里涉及到数据库的脏读、不可重复读、幻读,然后是对这三个的限制,分为:
1. 允许脏读、不可重复读、幻读 (Read uncommitted)
2. 不允许脏读、允许不可重复读、幻读 (Read committed)
3. 不允许脏读、不可重复读,允许幻读 (Repeatable read)
4. 不允许脏读、不可重复读、幻读 (Serializable)
千万不要去翻译后面的英文,你也不好记,就照着前面的回答没毛病。这里推荐一个微信公众号,里面有一篇讲关于事务的,讲得很详细,有兴趣可以关注下 ImportNew
然后我简单说下脏读、不可重复读、幻读的区别,或者说理解吧:
脏读:A、B两个事务,A读取一条数据,并修改了这个数据,但没有commit,这时B也读取了这条数据,此时A回滚了数据,那么此时B的行为就是脏读;
不可重复读:A、B两个事务,A读取一条数据,此时B也读取这条数据,这时两个事务读取的到的数据是一样的,此时A修改了这条数据,然后B又去读取这条数据,此时数据变了,同样的两个操作,前后两次的结果不一样,这就是不可重复读。其实这种现象并没有毛病,可以理解,但是在一些变态的场景下是不允许的,毕竟这种现象是事务之间没有隔离造成的,所以有些情况下是允许不可重复读的;
幻读:A、B两个事务,A搜索所有结果,如数据的总数,此时B添加了一条数据,A再次操作之前的操作,发现数据总数增加了,是不是有一种见鬼了的感觉,怎么突然冒出一条新数据,其实这种现象也并没有毛病,可以被理解,道理跟不可重复读一样,只是隔离级别不一样而已。

6、数据库底层是用什么结构实现的,你大致画一下:

底层用B+树实现,结构图参考:
http://blog.csdn.net/cjfeii/article/details/10858721 http://blog.csdn.net/tonyxf121/article/details/8393545

7、范式你知道哪些?

主要掌握第一范式、第二范式、第三范式。
我简单讲下这三个范式:
第一范式:数据库字段不可再被分解,我的理解是数据库中的一个字段的值不建议加入多个值,然后用“,”分割,如name字段中填“zyq,byq”。
第二范式:数据库的记录依赖于主键,即一个主键可以唯一标识一条记录
第三范式:数据库一个字段的属性不依赖于其他表的属性,这个举个例子吧:两张表,员工表和部门表,员工表中不建议出现在部门表中已有的字段,这样会导致数据的累赘或者说重复。

8、什么情况下适合建立索引?

1. 为经常出现在关键字order by、group by、distinct后面的字段,建立索引。

2. 在union等集合操作的结果集字段上,建立索引。其建立索引的目的同上。

3. 为经常用作查询选择的字段,建立索引。

4. 在经常用作表连接的属性上,建立索引。

5. 考虑使用索引覆盖。对数据很少被更新的表,如果用户经常只查询其中的几个字段,可以考虑在这几个字段

上建立索引,从而将表的扫描改变为索引的扫描。

9、数据库优化做过啊?

这个具体找下数据库优化吧,我也没有深入了解。

10、数据库分页查找语句怎么写?

用limit,参考如下:
http://qimo601.iteye.com/blog/1634748

11、MYSQL数据库引擎你知道那些?它们的区别呢?

http://www.jb51.net/article/38004.htm
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: