数据库面试题
- **不断更新中**
- 21. 如何防范SQL注入式攻击
- 22. 默认的系统数据库有哪些
- 23. 默认创建一个数据库,会生成那些文件
- 24. 创建数据库时,能不能把数据文件和日志文件分开
- 25. 什么是索引覆盖(Index Covering)查询?
- 26.存储过程和函数的区别
- 27. 聚集索引和非聚集索引的区别
- 28.索引的优缺点,什么时候使用索引,什么时候不能使用索引
- 29. 数据库优化
- 30. 索引分类索引失效条件
- 31. 数据库的主从复制
- 32. long query怎么解决
- 33. varcher 和 char的使用场景
- 34. 数据库连接池的作用
- 35. 分库分表,主从复制,读写分离
- 36. 数据库三范式
- 37. 数据库中的join的inner join,outer join,coors join
- 38. 有哪些锁,selete时怎么加排它锁
- 39. 死锁怎么解决
- 40. 最左匹配原则
- 41. SQLServer 是一种大型数据库,他的储存容量只受储存介质的限制,请问他是通过什么方式实现这种无线容量机制的
不断更新中
21. 如何防范SQL注入式攻击
一, 不使用动态SQL拼接
二, 利用在表单输入的内容构造SQL命令之前,把所有输入内容过滤一番
对于动态构造SQL的场合时
- 替代单引号,把所有单独出现的单引号改成两个单引号,防止攻击者修改SQL命令的含义.
- 删除用户输入内容中所有的连字符.
- 对于用来执行查询的数据库账户,限制其权限,用不同的用户账户执行语句操作.
- 用存储过程来执行所有的查询
- 限制输入的字符串长度
- 检查用户输入合法性,确保用户输入内容只包含合法的数据
- 对用户登录名称和密码加密保存
- 检查提取数据的查询所返回的记录数量
22. 默认的系统数据库有哪些
- master(主) : 是SQL Server中最重要的一个数据库,记录系统中所有的信息
- tempdb(临时) : 存在SQL Server会话期间临时性的数据库
- model(模板) : 是模板库,建立数据库的一些模板
- msdb(计划任务): 提供SQL Server中所有的代理服务
23. 默认创建一个数据库,会生成那些文件
- 主文件(.mdf)
- 日志文件(.ldf)
- 次要文件(.ndf)
24. 创建数据库时,能不能把数据文件和日志文件分开
可以分开,起到优化作用,把数据库文件放到高速读写区,把日志文件放到低速读写区
25. 什么是索引覆盖(Index Covering)查询?
是指数据可以通过索引获取,而不用接触表.
比如: 非聚集复合索引: 建立索引字段时正好覆盖了条件查询中所涉及到的字段
26.存储过程和函数的区别
- 存储过程可以有返回参数,函数只能返回值或者表对象
- 函数必须有返回值,存储对象可有可无
- 存储过程一般作为一个独立的部分来执行,而函数可以作为查询语句的一部分来调用
27. 聚集索引和非聚集索引的区别
根本区别: 表中记录的排列顺序和索引的排列顺序是否一致
28.索引的优缺点,什么时候使用索引,什么时候不能使用索引
优点: 提高查询速度
缺点: 更新数据时效率低,应为要同时更新索引
对数据进行频繁查询建立索引,频繁更新时不建议使用索引
29. 数据库优化
- SQL尽量使用索引
- 对SQL语句进行优化
- 子查询变成 left join
- limit分布优化,先利用ID定位,再分页
- or 条件优化,多个or条件可以用union all对结果进行合并
- 不必要的排序
- where代替having ,having检索完所有记录,再进行过滤
- 避免嵌套查询
- 对多个字段进行等值查询时,联合索引
30. 索引分类索引失效条件
- 普通索引: 最基本索引,没有任何限制
- 唯一索引: 与普通索引类似,不同的是,索引列的值必须唯一,但允许有空值
- 主键索引: 特殊的唯一索引,不允许有空值
- 全文索引: 针对较大数据,生成全文索引耗时间,好空间
- 组合索引: 为了更多的提高mysql效率可建立组合索引,遵循"最左前缀"原则
失效条件 - 条件是or,如果想条件生效,给or每个字段加索引
- like查询,以%开头
- 内部函数
- 对索引类进行计算
31. 数据库的主从复制
1.默认异步复制
容易造成主库数据与从库数据不一样
通过binlog日志实现,数据库1两个线程,一个读取数据库2的binlog日志,一个解析日志执行sql
数据库2启动一个线程,给数据库1传递日志
2.半同步复制
只有把数据库1的发送的binlog日志写道数据库2的中继日志,这时主库才返回操作完成反馈,性能有一定降低
3.并行复制
数据库2多个线程去请求binlog日志
32. long query怎么解决
是指设置数据库日志,记录记录耗时耗时过长的sql语句
设置参数,开启慢日志功能,得到耗时超过一定时间的sql
slow query log开启记录慢查询功能,slow query log=0关闭
slow query log=1开启,1可不写
slow query time=1,这句记录超过一秒
33. varcher 和 char的使用场景
储存字符
varder适合字符长度经常变的
char适合字符长的固定的
34. 数据库连接池的作用
维护一定数据的连接,减少创建连接的时间
更快的响应时间
统一的管理
35. 分库分表,主从复制,读写分离
读写分离,读从库,写主库
spring可以配置两个数据库,通过TOP(面向切面编程)在写和读方法前面进行判断得到动态切换数据源
实现读写分离
36. 数据库三范式
范式:符合某一种级别的关系模型的集合
1NF 属性不可分: 通俗理解即一个字段只存储一项信息
2NF 非主键属性,完全依赖主键属性: 要求数据库表中的每个实例或行必须可以被惟一地区分。
3NF 非主键属性无传递依赖: 要求一个数据库表中不包含已在其它表中已包含的非主键字段
37. 数据库中的join的inner join,outer join,coors join
以AB两张表为例
cross join:交叉连接,得到的结果是两个表的乘积,即笛卡尔积
38. 有哪些锁,selete时怎么加排它锁
- 乐观锁: 乐观锁不锁任何东西,他不依赖数据库事务机制,完全是应用系统层面的东西
- 悲观锁: 是指假设并发更新冲突会发生, 所以不管冲突是否发生都会使用锁机制
- 排它锁: 可以防止并发事务对资源进行访问
- 共享锁: 允许并发事务在封闭式并发控制下读取资源
- 更新锁:是共享锁和排它锁的集合,
- 表锁:锁住整个表可同时读,写不行
- 行级锁:单独一行记录加锁
在语句中加入for update是给相应行增加排它锁.Selete出来的数据别的事务不能读取,不能修改,不能删除
39. 死锁怎么解决
找到进程号,kill 进程
产生死锁的原因:
1.系统提供的资源数量有限,不能满足每个进程的使用,
2.多道程序运行时,推进程序不合理
产生死锁的必要条件
1.互斥条件
2.不可不多条件(不可占条件)
3.部分分配
4.循环等待
根据死锁的四个必要条件,只要使其中一不成立 ,死锁就不会出现,可采取三种 预防措施
1.采用资源动态分配策略
2.允许进程剥夺使用其他进程占有的资源,从而破坏" 不可剥夺 "条件
3.采用资源有序分配法,破坏 “环路” 条件
40. 最左匹配原则
最左匹配原则是针对索引的
两个字段(name,age)建立联合索引,如果where age=12 这样的话,是没有利用到索引的.
如果where name= ‘XXX’ and age=12,这时就利用到索引,
因为创建复合索引的规则是首先对复合索引的最左边的字段先排序,然后在对后边的第二个字段排序.
41. SQLServer 是一种大型数据库,他的储存容量只受储存介质的限制,请问他是通过什么方式实现这种无线容量机制的
他的所有数据都存储在数据文件中(*.dbf),所以只要文件够大,SQLServer的存储容量是可以扩大的
SQLServer 数据库有三种类型文件
主要数据库文件
主要数据文件是数据库的起点,指向数据库中文件的其他部分,每个数据库都有一个主要数据文件主要数据文件推荐文件扩展名是.mdf
次要数据文件
次要数据文件包含除主要数据文件外的所有数据文件,有些数据库可能没有次要数据文件,而有些数据库则需要多个次要数据文件扩展名为.ndf
日志文件
日志文件包含恢复数据库所需的所有日志文件,每个数据库至少有一个日志文件,但可以不止一个扩展名为.ldf