数据库部分面试题(二)
数据库面试题
点击这里关注GitHub,会一直更新哦,期待您的参与!
-
什么情况下适合建立索引?
- 为经常出现在关键字 order by、group by、distinct 后面的字段,建立索引。
- 在 union 等集合操作的结果集字段上,建立索引,其建立索引的目的同上。
- 为经常用作查询选择的字段,建立索引。
- 在经常用作表连接的属性上,建立索引。
-
数据库底层是用什么结构实现的?请大致画一下。
底层用 B+ 数实现,结构图参考:
更多信息请点击这里。
-
SQL 语句应该考虑哪些安全性?
- 防止 SQL 注入,对特殊字符进行转义,过滤或者使用预编译的 SQL 语句绑定变量。
- 最小权限原则,特别是不要用 root 账户,为不同的类型的动作或者组建使用不同的账户。
- 当 SQL 运行出错时,不要把数据库返回的错误信息全部显示给用户,以防止泄漏服务器和数据库相关信息。
-
数据库事物有哪几种?
- 原子性(Atomicity):事务包含的所有操作要么全部成功,要么全部失败回滚。
- 一致性(Consistency):事务必须使数据库从一个一致性状态变换到另一个一致性状态。
- 隔离性(Isolation):隔离性是当多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
- 持久性(Durability):一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的。
-
MySQL 数据表在什么情况下容易损坏?
- 服务器突然断电导致数据文件损坏。
- 强制关机,没有先关闭 MySQL 服务器等。
-
drop,delete与truncate的区别?
- drop 直接删除表。
- truncate 删除表中数据,再插入时自增长 id 又从1开始。
- delete 删除表中数据,可以加 where 子句。
-
数据库范式有哪些?
- 第一范式:就是无重复的列。
- 第二范式:就是非主属性非部分依赖于主关键字。
- 第三范式:就是属性不依赖于其他非主属性(消除冗余)。
-
MySQL 锁类型分为哪些?
- 乐观锁:
- 乐观锁是指操作数据库时(更新操作),想法很乐观,认为这次的操作不会导致冲突,在操作数据时,并不进行任何其他的特殊处理(也就是不加锁),而在进行更新后,再去判断是否有冲突了。
- 不是数据库自带的,需要我们自己去实现。
- 悲观锁:
- 悲观锁就是在操作数据时,认为此操作会出现数据冲突,所以在进行每次操作时都要通过获取锁才能进行对相同数据的操作,悲观锁需要耗费较多的时间。
- 悲观锁是由数据库自己实现。
- 共享锁:
- 对于多个不同的事务,对同一个资源共享同一个锁。
- 简写为 S 锁,又称读锁。共享锁也属于悲观锁的一种。
- 排它锁:
- 排它锁与共享锁相对应,就是指对于多个不同的事务,对同一个资源只能有一把锁。
- 简写为 X 锁,又称写锁。
- 行锁:
- 给某一行加上锁,也就是一条记录加上锁。
- 表锁:
- 和行锁相对应,给这个表加上锁。
- 乐观锁:
-
如何解决 MySQL 数据库中文乱码问题?
- 在数据库安装的时候指定字符集。
- 如果在按完了以后可以更改配置文件。
- 建立数据库时候:指定字符集类型。
- 建表的时候也指定字符集。
-
数据库应用系统设计步骤主要有哪些?
- 规划
- 需求分析
- 概念模型设计
- 逻辑设计
- 物理设计
- 程序编制及调试
- 运行及维护
-
简单介绍一下你知道的数据库都有哪些?
- 关系型数据库管理系统:MySQL、db2、sqlite 和 Oracle 等。
- 非关系型:mongodb、redis、memcache。
-
什么叫做存储引擎?
存储引擎就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法事务驱动。
-
MySQL 的默认端口是多少?
3306
-
如何应对数据的高并发,大量的数据计算?
- 创建索引
- 数据库读写分离,两个数据库,一个作为写,一个作为读
- 外键去掉
- django 中 orm:
- select_related:一对多使用,查询主动做连表
- prefetch_related:多对多或者一对多的时候使用,不做连表,做多次查询