Java面试题—数据库篇

索引

索引本质是一种数据结构。

  • 优缺点
    优点:1.所有的字段均可设置索引;2.大大加快数据查询速度
    缺点:1.创建和维护索引需要花费时间,并且随着数据量的增加所耗费的时间也会增加;2.索引也需要占用空间;3.当对表中数据进行增删改时,索引需要动态维护,降低了数据的维护速度。
  • 使用原则:
    1.对经常更新的表要避免使用过多索引,经常查询的表字段应创建索引
    2.数据量小的表不宜使用索引,遍历全部数据可能比遍历索引时间还要短,索引的优化效果无法体现
    3.在取值少的字段上(如性别)不要建立索引,取值多的可以
  • 索引类型
    • 普通索引:最基本的索引,没有任何限制
      CREATE INDEX indexName ON mytable(username(length)) #最基本的创建方式
      ALTER table tablename ADD INDEX indexName(columnName) #修改表结构创建
      INDEX [indexName] (username(length)) #创建表时直接指定
      DROP INDEX [indexName] ON mytable #删除索引
    • 唯一索引:使用UNIQUE关键字,索引值必须唯一,允许有空值。
    • 组合索引:两个或更多列上的索引被称为组合索引,又称联合索引。创建组合索引时,应该仔细考虑列的顺序。使用时遵循最左前缀原则。

      最左前缀原则:针对B+树索引,最左优先,如创建了联合索引(A, B, C),相当于创建了(A)单列索引、(A, B)组合索引、(A, B, C)组合索引。

    • 全文索引:只有在MyISAM引擎上才能使用,只能在char,varchar,text类型字段上使用全文索引
  • MySQL中的索引存储类型
    包括B+树Hash两种,一般使用B+树索引,原因:
    1.Hash索引仅满足"="、"in"和""查询,不能使用范围查询
    2.对于组合索引Hash索引不能利用部分索引值查询
    3.需要扫描表,无法从Hash索引中直接完成查询,还是要回表查询数据。

  • MySQL存储引擎介绍
    包括 MyISAM、InnoDB、MEMORY(也叫HEAP)三种,其中:
    MyISAM和InnoDB存储引擎:只支持B+树索引
    MEMORY存储引擎:支持Hash和B+树索引

  • B树和B+树区别,B+树为什么更适合用于索引
    区别:
    1.B+树中具有n个关键字的结点含有n个分支;B+树中具有n个关键字的结点含有n+1个分支
    2.B+树中叶子结点包含信息,包含了全部关键字,B树叶子结点不包含信息,内部结点存储关键字信息
    3.B+树中所有非叶子结点仅起到了一个索引的作用,B树中每个关键字对应一个记录的存储地址
    4.B+树上有一个指针指向关键字最小的叶子结点,所有叶子结点链接成一个线性链表,B树没有
    B+树为什么更适合:
    1.B+树的中间结点不保存数据,所以磁盘页能容纳更多元素,更矮胖,一次性查找的关键字也就越多,相对来说IO读写次数也就降低了
    2.由于非叶节点并不是最终指向文件内容的结点,只是叶结点关键字的索引,索引任何关键字查找必须走一条从根节点到叶结点的路,所有关键字查询路径长度相同,数据查询效率相对更稳定


范式

六大范式:

  1. 第一范式(1NF):每一列都是不可分割的原子数据项,而不是集合、数组、记录等非原子项。
  2. 第二范式(2NF):在1NF基础上,要求数据库表中每个记录必须可以被唯一的区分,选择一个能区分每个实体的属性或属性组。
  3. 第三范式(3NF):在2NF基础上,任何非主属性不依赖于其他非主属性。
  4. 巴斯-科德范式(BCNF):在3NF基础上,任何非主属性不能对主键子集依赖。
  5. 第四范式(4NF):要求把同一表内的多对多关系删除。
  6. 第五范式(5NF):从最终结构重新建立原始结构

事务

事务是对数据库中一系列操作进行统一的提交或者回滚操作,用来保证数据的完整性和一致性。

  • 事务并发问题:
    脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的就是脏数据。
    不可重复读:事务A读取了事务B已经提交的更改数据
    幻读:事务A读取事务B提交的新增数据

事务必须服从ACID原则:原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)。
原子性:事务包含的所有操作要么全部成功,要么全部失败回滚
一致性:事务开始前和结束后,数据库的完整性约束没有被破坏,如A向B转账,不可能A扣了钱B却没收到。
隔离性:多用户访问时,多个并发事务之间要互相隔离,只允许一个事务请求同一数据,不同事物之间没有干扰。

事务隔离级别
读未提交:一个事务可以读物另一个未提交事务的数据。允许脏读取
读提交:一个事务要等另一个事物提交后才能读取数据。允许不可重复读取,但不允许脏读。
可重复读:在开始读取数据(事务开启)时,不再允许修改操作。禁止不可重复读取和脏读取,可能出现幻读。
序列化:最高的事务隔离级别,在该级别下事务串行化顺序执行。可以避免脏读、不可重复读和幻读。较耗性能,一般不使用。

持久性:事务一旦被提交了,对数据库中的数据改变就是永久性的。


SQL优化

  1. 在表中建立索引, 优先考虑where,group by使用到的字段
  2. 查询条件时,避免使用select ,使用具体字段代替
  3. 模糊查询不要两边都用%,会进行全表扫描,只在一侧加%
  4. 避免使用in和not in,会进行全表扫描,用between,exists相关子查询代替
  5. 使用union代替or,避免全表扫描

SQL语句的执行顺序

from --> where --> group by -- > having --> select --> order by

  • where和having的区别:
    1. jjhaving只能用在group by之后,对分组后的结果进行筛选(使用having的前提条件是分组)
    2. where肯定在having和group by之前
    3. where后的条件表达式里不允许使用聚合函数,having可以

NoSQL对比SQL

SQL:基于表,使用结构化语言也就是sql语句来定义和操纵数据。一方面功能非常强大,安全且适用于复杂查询;一方面是限制性的,SQL要求使用预定义模式来确定数据的结构,所有数据必须遵循相同的结构。
NoSQL:具有非结构化数据的动态模式,数据可以以多种方式进行存储:面向列、面向文档、基于图形等,组织为key-value存储。这种灵活性意味着:无需先定义其数据结构即可创建文档,每个文档都可以有自己独特的结构,语法可能因数据库而异,可以随时添加字段。

常见的SQL和NoSQL数据库:
SQL数据库:Mysql,Oracle,SQLServer
NoSQL数据库:MongoDB,Redis,HBASE等

Mysql和MongoDB比较:
Mysql:成熟稳定(庞大社区)、兼容所有主要平台、经济高效(开源免费)、可复制、分片(大多数SQL数据库无法进行分片,但MySQL可以)。适用于预定义数据结构和事务的应用程序。
MongoDB:动态模式、可扩展、速度快、灵活(添加新列或新字段)。适用于没有明确数据结构,或无法为数据库定义架构如实时分析等。

你可能感兴趣的:(Java面试题—数据库篇)