概述
常见的数据库面试题
1. 你怎么设计数据库
答:首先应该分为几个步骤(拿点餐系统举例),应该先定好库和表,防止后期增加字段带来的代码重写以及逻辑错误
1. 需求分析阶段:看客户需求,本项目使用的目的方向,应有的数据字典(例如:红烧肉)
2. 概念设计阶段:对用户需求综合归纳形成概念模型(E-R图)
3. 逻辑设计阶段:表之间的关联(套餐和套餐中的餐品关联,不能只删餐品不管套餐),讲概念结构转换为某个DBMS所支持的数据模型
4. 物理设计阶段:为逻辑数据模型选取一个最适合应用环境的物理结构,使用什么数据库(MySql,SQL Server)
5. 数据库实施阶段:建立数据库,编写以及备份sql文件,分发给组员sql文件
6. 数据库维护阶段:根据实际业务发展对其更改(想增加打折业务)以及对数据的监控,管理日志,防止宕机对其造成不可挽回的数据丢失
2. 什么是数据库索引,索引的种类有哪些?
答:在聊这个问题前我们应该思考为什么要加索引,索引有什么用,为什么加索引能提高搜索效率
1. 从MySql的底层出发:从底层来看,那MySql来举列子,mysql底层是一个B+树,而B+树的叶子节点是一个双向链表,双向链表中每个节点存储的数据,使用B+树是为了方便范围查找,加入我要查第100个数据,那么我找第一个叶子结点往后递归100次就可以了,每个叶子节点都有data数据(用来存储这一条的所有字段数据,像是一个实体类的对象),非叶子节点内只有索引数据。
2. 为什么只有叶子节点有数据,而非叶子节点没有数据呢:这里设计计算机底层的I-O操作,计算机IO操作一次的只拿一个节点的数据(如果节点内有实体类对象的数据),就会非常慢,但是如果非叶子节点只放索引数据,则可以一次拿很多个节点,能大幅度降低IO次数,更快,耗费的性能也会降低
3. 索引的种类有5种:
1. 普通索引:最基本的索引,没有任何限制
2. 唯一索引:索引列必须唯一,不能重复,允许为null,
3. 全文索引:MySQL从3.23.23版开始支持全文索引和全文检索,FULLTEXT索引仅可用于 MyISAM 表;他们可以从CHAR、VARCHAR或TEXT列中作为CREATE TABLE语句的一部分被创建,或是随后使用ALTER TABLE 或CREATE INDEX被添加。对于较大的数据集,将你的资料输入一个没有FULLTEXT索引的表中,然后创建索引,其速度比把资料输入现有FULLTEXT索引的速度更为快。不过切记对于大容量的数据表,生成全文索引是一个非常消耗时间非常消耗硬盘空间的做法。
4. 单例、多例索引(联合索引):MySql查询的时候只能用一个索引,会从多个索引中选择一个限制最严格的索引来使用
5. 组合索引:单列索引的组合。我感觉和覆盖索引没啥差别,假设现在有一张表(test)有a,b,c,d,e这么几个字段,其中我们为a,b,c列添加一个索引叫a_b_c,这个就是组合索引。
4. 聚集索引和非聚集索引的区别:
1. 聚集索引:索引与data数据相邻,例如它的父节点
2. 非聚集索引:不相邻,索引字段是非主键的时候就是非聚集索引,
3. 什么情况写设置了索引但无法使用(什么情况下索引会失效)?
答:有一下七种情况
1.有or必全有索引;
2.复合索引未用左列字段;
3.like以%开头;
4.需要类型转换;
5.where中索引列有运算;
6.where中索引列使用了函数;
7.如果mysql觉得全表扫描更快时(数据少);
4. 说说对数据库语句优化有哪些方法?
答:
5. Statement接口与PreparedStatement接口区别?
答:Statement接口在创建语句对象时,不带参数,进行查询更新操作时,再传入完整的SQL 语句。
而PreparedStatement接口创建预处理语句对象时,传入带?的SQL语句,进行查询更新操作时,不带参数。
PreparedStatement接口代码可读性高,无需拼接SQL语句,语句和代码分离。
PreparedStatement接口执行效率高,它预编译和缓存了结构相同的SQL语句,想String常量池。
PreparedStatement接口安全性更高,避免了产生SQL漏洞注入。
6. 在进行数据库编程时,连接池有什么作用?
答:为了避免频繁的创建新的连接导致的性能浪费,创建线程池后,由连接池来管理连接,使用完毕不用关闭,使用代理设计模式,关闭则是将其放入池中,而不是关闭,下次开启的时候是从池中取出一个连接来使用,防止资源浪费
7. 事务的ACID是指什么?
答:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)
原子性:保证事务是一个不可分割的工作单位,要么都发生,要么都不发生,有错误进行回滚
一致性:事务前后数据的完整性必须保持一致
隔离性:数据库为每一个用户开启的事务,不能被别的事务的操作干扰,多个事务并发的时候要进行隔离
持久性:事务提交之后,对数据库中的数据改变是永久性的
8. 数据库的四种隔离级别有什么?
答:读未提交、读已提交、可重复度、串行化
读未提交:可避免脏读,不可重复读,幻读的发生
读已提交:不可避免脏读,可避免不可重复读,幻读的发生(Oracle)
可重复度:不可避免脏读,不可重复读,可避免幻读的发生(MySql)
串行化:不可避免脏读,不可重复读,不幻读的发生
9. 数据库中的三大范式
1. 第一范式:数据库表的每一列都是不可分割的原子数据项,不能是集合、数组等非原子数据项。即表中的某个列有多个值时,必须拆分为不同的列。简而言之,第一范式每一列不可再拆分,称为原子性
2. **在满足第一范式的前提下,表中的每一个字段都完全依赖于主键。**所谓完全依赖是指不能存在仅依赖主键一部分的列。简而言之,第二范式就是在第一范式的基础上所有列完全依赖于主键列。当存在一个复合主键包含多个主键列的时候,才会发生不符合第二范式的情况。比如有一个主键有两个列,不能存在这样的属性,它只依赖于其中一个列,这就是不符合第二范式。
简而言之,第二范式需要满足:
1. 一张表只描述一件事情
2. 表中的每一个列都依赖于主键
3. 在满足第二范式的前提下,表中的每一列都直接依赖于主键,而不是通过其它的列来间接依赖于主键。简而言之,第三范式就是所有列不依赖于其它非主键列,也就是在满足2NF的基础上,任何非主列不得传递依赖于主键。所谓传递依赖,指的是如果存在"A → B → C"的决定关系,则C传递依赖于A。因此,满足第三范式的数据库表应该不存在如下依赖关系:主键列 → 非主键列x → 非主键列y
最后
以上就是整齐唇膏为你收集整理的数据库常见问题的全部内容,希望文章能够帮你解决数据库常见问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复