美文网首页
数据库面试题(一)

数据库面试题(一)

作者: madao756 | 来源:发表于2020-05-19 19:27 被阅读0次

    0X00 基础知识

    四大范式

    • 第一范式

    所有属性都是原子性的,不可再分

    • 第二范式

    无关属性不能对码的部分有函数依赖

    F = {
        A ➜ D,
        B ➜ C
    }
    

    参考:https://www.jianshu.com/p/8d596c5e98e0

    • 第三范式

    无关属性不能对码的部分有传递函数依赖

    • BC 范式

    主属性对于码的部分不能有函数依赖与传递函数依赖

    MySQL 有关权限的表都有哪几个

    • user 权限表:记录允许连接到服务器的用户帐号信息,里面的权限是全局级的
    • db 权限表:记录各个帐号在各个数据库上的操作权限
    • table_priv权限表:记录数据表级的操作权限
    • columns_priv权限表:记录数据列级的操作权限
    • host权限表:配合 db 权限表对给定主机上数据库级操作权限作更细致的控制

    MySQL 的 binlog 有有几种录入格式?分别有什么区别?

    binlog 其主要是用来记录对 mysql 数据更新或潜在发生更新的 SQL 语句,并以"事务"的形式保存在磁盘中,binlog 的主要目的是复制和恢复

    • statement 格式,就是记录会修改数据库的 sql,不需要记录每一行的变化,减少了日志量。由于 sql 的执行是有上下文的,因此在保存的时候需要保存相关的信息
    • row 格式,不记录 sql 语句上下文的相关信息,只记录哪条记录被修改
    • mixed 格式,statement 与 row 的混用,普通情况下用 statement

    简单的说,Statement 模式读写元数据,优点是:时间短复制快,缺点是:很多函数不支持;Row 模式读写数据本身,优点是:复制逻辑简单安全,缺点是:时间长复制慢。Mix 是混合模式,两者兼顾。不过无论是那种,都是数据增量复制。

    0X01 索引

    什么是索引

    索引就是一种数据结构,用来加快对数据库的读和写。

    比如用 B+Tree B-Tree Hash 这三种数据结构做索引

    B+Tree 和 B-Tree

    • B+Tree 有那些特点
    1. 每个节点上可以存储多个节点,树的高度小,IO 的次数低
    2. 非叶子节点存储只存储索引,叶子节点存储索引和数据
    3. 叶子节点之间有指针相连,区间查询效率高
    • B-Tree 有哪些特点
    1. 出现任何关键字,并且仅出现在一个节点中
    2. 搜索可以在非叶子节点处结束
    • 有哪些不同
    1. B+Tree 由于非叶子节点不存储数据,所以速度铁定 logn。B-Tree 最好可以到 O(1)
    2. B+Tree 叶节点成对连接,范围查询十分方便

    索引的优缺点

    • 优点
    1. 通过创建唯一索引,可以保证数据中每一行数据的唯一性
    2. 可以大大加快数据的检索速度
    3. 可以加速表与表之间的的连接
    4. 可以加速分组和排序的速度
    • 缺点
    1. 创建索引和维护索引需要时间,而且随着数据量的增多而增加
    2. 索引需要占物理空间
    3. 对数据进行操控时,也需要维护索引,降低维护速度

    什么时候使用索引

    • 经常搜索的列(包括分组、排序 where)
    • 在经常用在连接上的列使用索引

    什么时候不应该使用索引

    • 不经常搜索的列
    • 值域很少的列
    • 对 text, image 和 bit 数据类型不应该加索引,这些值都很特殊,有的特别大,而且没有什么连续性

    索引的设计原则

    1. 索引并非越多越好,大量的索引占空间,而且影响更新数据库的速度
    2. 避免对经常更新的表做更多的索引
    3. 在频繁进行排序和分组的列上建立索引,如果排序的列有多个,可以在列上建立联合索引
    4. 值域少的列,不要建立索引

    百万级别或以上的数据如何删除

    1. 先删除索引
    2. 删除数据
    3. 重新建立索引

    什么是「最左前缀原则」

    这个最左前缀原则是对一个表中的联合索引说的,任何一个索引的最左前缀,都可以被用于查找。比如你创建了一个 (col1, col2, col3) 的索引那么这个缩影会生效于:(col1)(col1, col2)(col1, col1, col3) 的查找。如果查询的列不是索引的最左前缀, 那MySQL不会将索引用于执行查询.

    B-Tree 的好处

    • 先回答什么是 B-Tree

    B 树是多路平衡查找树,在相同节点树上,它的高度跟平衡二叉树比会小很多。而且它的树节点上存储了数据和儿子节点的指针

    • 为什么 IO 少

    B 树将键相近的数据存储在同一个节点,当访问其中某个数据时,数据库会将该整个节点读到缓存中。当它临近的数据紧接着被访问时,可以直接在缓存中读取,无需进行磁盘IO;换句话说,B树的缓存命中率更高。

    B+Tree 的好处

    • B+Tree 与 B-Tree 有什么不同

    最大的不同就是:B 树可以在非叶结点中存储数据,但是 B+ 树的所有数据其实都存储在叶子节点中。而且所有的叶子节点通过双向链表连接

    • 为什么使用 Mysql 使用 B+ 树,而不用 B 树

    B 树能够在非叶节点中存储数据,但是这也导致在查询连续数据时可能会带来更多的随机 I/O,而 B+ 树的所有叶节点可以通过指针相互连接,能够减少顺序遍历时产生的额外随机 I/O;

    • 为什么 MongoDB 使用 B 树,而不用 B+ 树

    我觉的主要原因是 MongoDB 不是关系型数据库,认为查询单个数据的更重要,由于 B 树在非叶子节点上存储了数据,所以会比 B+ Tree 要快

    什么是覆盖索引

    覆盖索引(covering index)指一个查询语句的执行只用从索引中就能够取得,不必从数据表中读取

    什么是聚簇索引以及非聚簇索引

    当叶子节点中存储的是当前的 key 值以及整行的数据就是「聚簇索引」

    叶子节点中存储是这条数据在当前的 key 和「聚簇索引」的key就是 「非聚簇索引」

    也就是我们说的建立辅助索引要回表查询。

    但是也不一定需要回表查询,因为:只要「非聚簇索引」的索引有我们需要的信息就够了,比如:

    假设我们在员工表的年龄上建立了索引,那么当进行select age from employee where age < 20的查询时,在索引的叶子节点上,已经包含了age信息,不会再次进行回表查询.

    联合索引是什么?为什么需要注意联合索引中的顺序?

    MySQL 可以使用多个字段同时建立一个索引,叫做联合索引。在联合索引中,如果想要命中索引,需要按照建立索引时的字段顺序挨个使用,否则无法命中索引。

    相关文章

      网友评论

          本文标题:数据库面试题(一)

          本文链接:https://www.haomeiwen.com/subject/qokiohtx.html