面试攻略(数据库相关)

数据库方面:

数据库性能优化

一、 减少数据访问(减少磁盘访问)
1. 创建并使用正确的索引(索引相当于一本字典的目录) 2. 只通过索引访问数据 3. 优化SQL执行计划
二、 返回更少数据(减少网络传输或磁盘访问)
1. 数据分页处理(客户端分页、服务器端分页、数据库分页) 2. 只返回需要的字段
三、 减少交互次数(减少网络传输)
1. batch DAL、 2. In List 3. 设置Fetch Size 4. 使用储存过程 5. 优化业务逻辑 6. 使用ResultSet游标处理记录
四、 减少服务器CPU开销(减少CPU及内存开销)
1. 使用绑定变量 2. 合理使用排序 3. 减少比较操作 4. 大量复杂运算放在客户端处理
五、 利用更多资源(增加资源)
1. 客户端多进程进行访问 2. 数据库并行处理


数据库索引、视图、存储过程、事务、触发器、游标

索引:为了加快数据处理速度,最普遍的优化方法,使数据库系统无需对整个表进行扫描,就可以得到相关数据,数据库的索引是一个表中所包含值的列表,它注明了这些值所对应的存储位置,
按照存储结构来区别(聚集索引,非聚集索引【两者相比,聚集索引在插入数据时速度要慢,查询数据时速度要快 ,如果硬盘或内存空间有限,则应限制非聚集索引的使用】 )
按照数据唯一性来区别:(唯一索引,非唯一索引)
聚集索引:每个表只能有一个聚集索引,默认是主键,在物理存储上是存在一起的,连续排列【影响物理磁盘上存放的位置】
非聚集索引:在物理存储上是不在一起的,是逻辑上的连续。
唯一索引:保证字段唯一
索引的作用:
1. 通过创建唯一索引,可以增加记录的唯一性
2. 可以大大加快数据检索的速度
3. 加速表与表的链接,
4. 使用order by 和group by 子句进行索检索数据时,可以显著减少在查询中排序和分组所占用的时间
创建索引的标准:
1. 主键 外键
2. 需要在指定范围内频繁查询的,
3. 需要排序的列
4. 在聚合函数中使用的列
不考虑创建索引的:
1. 很少有唯一值
2. 更新非常频繁的字段
3. 只有较少行数的表
创建语法
Greate [unique][clustered|nonclustered]
Index index_name
On table_name(column_name...)
解释:
Unique:表示唯一索引
Clustered:聚集索引
Nonclustered:非聚集索引,为默认索引
index_name:索引名
例:创建商品表上“商品编号”和“标题”的非聚集索引的t-sql语句
Greate nonclustered index 索引名
On 商品表名(商品编号,标题)
视图:是一种数据库对象,是一张虚拟表,只存放视图的定义,不存放数据,可以动态更新(就是说如果创建的视图中,数据有更新,检索视图,里面的数据同样会更新)
存储过程:
概念:
① 存储过程(Stored Procedure)是一组为了完成特定功能的SQL语句集。经编译后存储在数据库中。
② 存储过程是数据库中的一个重要对象,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。
③ 存储过程是由流控制和SQL语句书写的过程,这个过程经编译和优化后存储在数据库服务器中。
④ 存储过程可由应用程序通过一个调用来执行,而且允许用户声明变量。
⑤ 同时,存储过程可以接收和输出参数、返回执行存储过程的状态值,也可以嵌套调用。
(2)优点:
① 增强了SQL语句的功能和灵活性
② 不需要反复建立一系列处理步骤,保证了数据的完整性
③ 降低了网络的通信量,客户端调用存储过程只需要传存储过程名和相关参数即可,与传输SQL语句相比自然数据量少了很多
④ 增强了使用的安全性,通过存储过程可以使没有权限的用户在控制之下间接地存取数据库,从而保证数据的安全。
⑤ 可以实现集中控制,当规则发生改变时,只需要修改存储过程就可以啦。
(3)缺点:
① 调试不是很方便
② 可能没有创建存储过程的权利
③ 重新编译问题
④ 移植性问题
存储过程关键字proc
例题:
创建一个存储过程,获取所有商品的标题,类型名,团购价,地区名和商店名,按照类型和团购价升序显示,并执行 Go
If exists(select * from sysobjects where name=’存储过程名’)
Drop proc 存储过程名
(这一步目的是为了避免新建存储过程名称相同,如果存在,则删除)
Go
Greate proc 存储过程名
As
(书写查询语句)
执行语句:
Exec 存储过程名
事务:
事务:
例如甲客户转给乙客户五百,在交易中,甲已经转出,而乙机器故障导致没收到,(数据的不一致性)事务可以解决。
一个事务内的所有语句作为一个整体,全部执行或者全部不执行,当遇到错误时可以回滚事务,取消事务内所做的所有改变,从而保证数据的一致性和可恢复性
特性:
1. 一致性
2. 原子性
3. 隔离性
4. 持久性
启动事务:begin transaction
提交事务:Commit transaction
回滚事务:Rollback transaction
触发器:
①触发器是一种特殊类型的存储过程,对特定事件作出响应。事件触发,相当于事件监听。触发器对表进行插入、更新、删除的时候会自动执行的特殊存储过程,一般用在较check约束更加复杂的约束上面。 DML SQL语句,DDL触发器改变表结构。
②触发器有两个特殊的表:插入表(instered表)和删除表(deleted表)。这两张是逻辑表也是虚表。系统在内存中创建这两张表,不会存储在数据库中。而且两张表的都是只读的,只能读取数据而不能修改数据。这两张表的结果总是与被改触发器应用的表的结构相同。当触发器完成工作后,这两张表就会被删除。inserted表的数据是插入或是修改后的数据,而deleted表的数据是更新前的或是删除的数据。
游标:
游标是SQL 的一种数据访问机制 ,游标是一种处理数据的方法。众所周知,使用SQL的select查询操作返回的结果是一个包含一行或者是多行的数据集,如果我们要对查询的结果再进行查询,比如(查看结果的第一行、下一行、最后一行、前十行等等操作)简单的通过select语句是无法完成的,因为这时候索要查询的结果不是数据表,而是已经查询出来的结果集。游标就是针对这种情况而出现的。
我们可以将“ 游标 ”简单的看成是结果集的一个指针,可以根据需要在结果集上面来回滚动,浏览我需要的数据。

数据库左连接,右连接,内外连接以及自连接

数据库左连接
左连接(left join)即为两张表进行连接时,是以处于left join语句左侧的表为基准去匹配left join语句右边的表,如果左表中的一条数据在右表中能找到与之对应的一条数据,那么就会出现在以虚表形式存在的结果表中,如果没有找到,那么会以null来代替右表中的数据去匹配左表。这样会有一个鲜明的对比,左表中的每一条数据中的对象在右表中的某个属性的存在性是一目了然的。同时在使用on 进行连接时,on的作用仅仅是进行两张表的上诉连接,发挥匹配的功能,它选出来的是满足这种匹配的所有结果,而并不一定是用户所需要的,这时候就要使用where进行条件判断,从而筛选出真正需要的信息。
数据库右连接
右连接(right join)本质上是相当于将上述的左连接的这个过程反过来,以连接语句right join右侧的表为基准去匹配左边的表,剩下的道理是一样的,不再赘述。
数据库内连接
内连接(inner join)就是在用两张表进行匹配的时候,如果表中任意一条数据在另一张表中都是找不到对应数据的话,那么在结果表中是不会有这一条数据的。也就是说必须是两张表中任意两条能够互相对应着的数据才能被存入到结果表中,有点类似于取交集的味道。这种适用于一旦某条数据为空便没有意义的场景,这时给它设成null也就毫无意义了。表中的数据也因此显得简练很多。
数据库自连接
外链接(outer join)与内连接是相反的,就是说,如果某张表中的数据在另一张中找不到对应的条目并不影响它依然出现在查询的结果中,这对于两张表都是满足的,两边都有出现null的可能,这就有一点数学里的并集的意思。
数据库外连接
自连接(self join)可能看起来有点晦涩难懂,但是实际上换个角度你就会豁然开朗,你可以把它这个过程想象成两张一样的表进行左连接或右连接,这样就会简单多了,其中一张表通过设别名的方式成为了虚表,但是共享原标中的信息。应用场景是这样的,就是表的一个字段和另一个字段是相同性质的东西,譬如员工与上司,他们本质也都是员工,在员工表中,员工的直接上司编号会以另一个字段的形式出现,但是他的上司的编号也是会出现在员工编号这个字段里。那么在这种情况下,假如需要去查询某一位员工的上司的信息,在已知该员工编号的条件下,可以根据他的编号去获得上司的编号,进而通过上司的编号去获得上司的信息。

其他

关系型数据库和非关系型数据库区别
关系型数据库:
优点
1、容易理解:二维表结构是非常贴近逻辑世界一个概念,关系模型相对网状、层次等其他模型来说更容易理解;
2、使用方便:通用的SQL语言使得操作关系型数据库非常方便;
3、易于维护:丰富的完整性(实体完整性、参照完整性和用户定义的完整性)大大减低了数据冗余和数据不一致的概率;
4、支持SQL,可用于复杂的查询。
5.支持事务
缺点
1、为了维护一致性所付出的巨大代价就是其读写性能比较差;
2、固定的表结构;
3、不支持高并发读写需求;
4、不支持海量数据的高效率读写
关系型数据库:Oracle、DB2、Microsoft SQL Server、Microsoft Access、MySQL
非关系型数据库:
1、使用键值对存储数据;
2、分布式;
优点
无需经过sql层的解析,读写性能很高
基于键值对,数据没有耦合性,容易扩展
存储数据的格式:nosql的存储格式是key,value形式
缺点
不提供sql支持
死锁怎么解决
找到进程号,kill 进程
有哪些锁
概念
乐观锁 自己实现,通过版本号
悲观锁 共享锁,多个事务,只能读不能写,加 lock in share mode
排它锁 一个事务,只能写,for update
行锁 作用于数据行
表锁 作于用表
发布了65 篇原创文章 · 获赞 34 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/My_ben/article/details/93159055