数据库部分面试题(二)

数据库面试题

点击这里关注GitHub,会一直更新哦,期待您的参与!

  1. 什么情况下适合建立索引?

    • 为经常出现在关键字 order by、group by、distinct 后面的字段,建立索引。
    • 在 union 等集合操作的结果集字段上,建立索引,其建立索引的目的同上。
    • 为经常用作查询选择的字段,建立索引。
    • 在经常用作表连接的属性上,建立索引。
  2. 数据库底层是用什么结构实现的?请大致画一下。

    底层用 B+ 数实现,结构图参考:

    数据库部分面试题(二)

    更多信息请点击这里

  3. SQL 语句应该考虑哪些安全性?

    • 防止 SQL 注入,对特殊字符进行转义,过滤或者使用预编译的 SQL 语句绑定变量。
    • 最小权限原则,特别是不要用 root 账户,为不同的类型的动作或者组建使用不同的账户。
    • 当 SQL 运行出错时,不要把数据库返回的错误信息全部显示给用户,以防止泄漏服务器和数据库相关信息。
  4. 数据库事物有哪几种?

    • 原子性(Atomicity):事务包含的所有操作要么全部成功,要么全部失败回滚。
    • 一致性(Consistency):事务必须使数据库从一个一致性状态变换到另一个一致性状态。
    • 隔离性(Isolation):隔离性是当多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
    • 持久性(Durability):一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的。
  5. MySQL 数据表在什么情况下容易损坏?

    • 服务器突然断电导致数据文件损坏。
    • 强制关机,没有先关闭 MySQL 服务器等。
  6. drop,delete与truncate的区别?

    • drop 直接删除表。
    • truncate 删除表中数据,再插入时自增长 id 又从1开始。
    • delete 删除表中数据,可以加 where 子句。
  7. 数据库范式有哪些?

    • 第一范式:就是无重复的列。
    • 第二范式:就是非主属性非部分依赖于主关键字。
    • 第三范式:就是属性不依赖于其他非主属性(消除冗余)。
  8. MySQL 锁类型分为哪些?

    • 乐观锁:
      • 乐观锁是指操作数据库时(更新操作),想法很乐观,认为这次的操作不会导致冲突,在操作数据时,并不进行任何其他的特殊处理(也就是不加锁),而在进行更新后,再去判断是否有冲突了。
      • 不是数据库自带的,需要我们自己去实现。
    • 悲观锁:
      • 悲观锁就是在操作数据时,认为此操作会出现数据冲突,所以在进行每次操作时都要通过获取锁才能进行对相同数据的操作,悲观锁需要耗费较多的时间。
      • 悲观锁是由数据库自己实现。
    • 共享锁:
      • 对于多个不同的事务,对同一个资源共享同一个锁。
      • 简写为 S 锁,又称读锁。共享锁也属于悲观锁的一种。
    • 排它锁:
      • 排它锁与共享锁相对应,就是指对于多个不同的事务,对同一个资源只能有一把锁。
      • 简写为 X 锁,又称写锁。
    • 行锁:
      • 给某一行加上锁,也就是一条记录加上锁。
    • 表锁:
      • 和行锁相对应,给这个表加上锁。
  9. 如何解决 MySQL 数据库中文乱码问题?

    • 在数据库安装的时候指定字符集。
    • 如果在按完了以后可以更改配置文件。
    • 建立数据库时候:指定字符集类型。
    • 建表的时候也指定字符集。
  10. 数据库应用系统设计步骤主要有哪些?

    1. 规划
    2. 需求分析
    3. 概念模型设计
    4. 逻辑设计
    5. 物理设计
    6. 程序编制及调试
    7. 运行及维护
  11. 简单介绍一下你知道的数据库都有哪些?

    • 关系型数据库管理系统:MySQL、db2、sqlite 和 Oracle 等。
    • 非关系型:mongodb、redis、memcache。
  12. 什么叫做存储引擎?

    存储引擎就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法事务驱动。

  13. MySQL 的默认端口是多少?

    3306

  14. 如何应对数据的高并发,大量的数据计算?

    • 创建索引
    • 数据库读写分离,两个数据库,一个作为写,一个作为读
    • 外键去掉
    • django 中 orm:
      • select_related:一对多使用,查询主动做连表
      • prefetch_related:多对多或者一对多的时候使用,不做连表,做多次查询