alin的学习之路:面试题 数据库相关

alin的学习之路:面试题 数据库相关

  • 如何提高查询速度?

    • 使用索引 create index 索引名 on 表名(列名1,列名2,……);
  • 数据库索引,事务,事务级别

    • 使用索引可以提高查询效率
    • 事务是很多写操作的集合
    • 事务的特点:1. 原子性。2.一致性。 3.隔离性。 4.持久性。
    • 事务的隔离为了消除并发事务对读数据的影响,事务隔离级别越高,在并发下会产生的问题就越少,但同时付出的性能消耗也将越大,因此很多时候必须在并发性和性能之间做一个权衡。所以设立了几种事务隔离级别,以便让不同的项目可以根据自己项目的并发情况选择合适的事务隔离级别,对于在事务隔离级别之外会产生的并发问题,在代码中做补偿。
    • alin的学习之路:面试题 数据库相关
  • 加了索引就快了?

    • 索引可以加快数据库的检索速度,但是会降低新增、修改、删除操作的速度,一些错误的写法会导致索引失效等等。

    • 一些知识点:

      • 当我们用 MySQL 的 InnoDB 引擎创建表,有且只能有一个主键;如果我们没有显示地指定之间,那么MySQL 会自动生成一个隐含字段作为主键;
      • 聚集索引:以主键创建的索引;聚集索引的叶子节点存储的是表中的数据;
      • 非聚集索引:非主键创建的索引;非聚集索引在叶子节点存储的是主键和索引列;使用非聚集索引查询数据,会查询到叶子上的主键,再根据主键查到数据(这个过程叫做回表)。
    • 如果我们根据一个非主键、非索引列进行查询,那么需要遍历双向链表,找到所在的页;再遍历页内的单向链表;如果表内数据很大的话,这样的查询就会很慢。

    • alin的学习之路:面试题 数据库相关

    • 很显然,没有用索引的时候,需要遍历双向链表来定位对应的页,而有了索引,则可以通过一层层“目录”定位到对应的页上。

  • 数据库索引底层结构

    • B树的高度 h=log(m+1)N(不确定,但是估计关系差不多是如此),假设 数据总量是N,每个节点的数据项是m

    • Mysql中存储引擎的索引实现:

      Mysql有两种存储引擎,MyISAM和InnoDB,InnoDB常听说,好像用的也是最多的,MyISAM不常听说。

    • MyISAM使用的是B+树作为引擎,下图展示的是主键索引的示意图:

    • alin的学习之路:面试题 数据库相关

    • 可以看见MyISAM中,索引文件和数据记录其实是分开来的,索引文件里存储的其实是数据记录的地址。

    • InnoDB的索引实现也是B+树,但是具体的方式确不一样。第一点,数据文件本身就是索引文件,这一点怎么理解呢?还记得B+树的叶子节点存储了具体数据嘛,**在InnoDB里,叶子节点存储的树真正的数据值,而不是MyISAM里存储的是地址。索引的key就是数据表的主键。InnoDB主索引的示意图如下,可以看见叶节点包含了完整的数据记录,这种索引也叫做聚集索引。**因为InnoDB的数据文件本身要按照主键聚集,所以必须要有主键。如果没有显示指定,则Mysql会自动选择可以唯一标识的数据列作为主键,如果不存在这种列,则Mysql自动为InnoDB生成一个隐含字段,占位6字节,长整型。

    • alin的学习之路:面试题 数据库相关

    • InnoDB的聚集索引是按照主键搜索,是最高效的,辅助索引需要走两次索引,首先查询辅助索引得到主键,再跟进主键查询获得记录。

  • mysql常见三种存储引擎

    • InnoDB存储引擎

      • InnoDB给MySQL的表提供了事务处理、回滚、崩溃修复能力和多版本并发控制的事务安全
      • InnoDB的优势在于提供了良好的事务处理、崩溃修复能力和并发控制。缺点是读写效率较差,占用的数据空间相对较大。
    • MyISAM存储引擎

      • 基于MyISAM存储引擎的表支持3种不同的存储格式。包括静态型、动态型和压缩型。其中,静态型是MyISAM的默认存储格式,它的字段是固定长度的;动态型包含变长字段,记录的长度不是固定的;压缩型需要用到myisampack工具,占用的磁盘空间较小。
      • MyISAM的优势在于占用空间小,处理速度快。缺点是不支持事务的完整性和并发性。
    • MEMORY存储引擎

      • Memory存储引擎是MySQL中的一类特殊的存储引擎。其使用存储在内存中的内容来创建表,而且所有数据也放在内存中。
      • Memory存储引擎默认使用哈希(HASH)索引,其速度比使用B型树(BTREE)索引快。如果我们需要使用B型树索引,可以在创建索引时选择使用。
      • 基于内存中的特性,这类表的处理速度会非常快,但是,其数据易丢失,生命周期短。
    • alin的学习之路:面试题 数据库相关

    • InnoDB:支持事务处理,支持外键,支持崩溃修复能力和并发控制。如果需要对事务的完整性要求比较高(比如银行),要求实现并发控制(比如售票),那选择InnoDB有很大的优势。如果需要频繁的更新、删除操作**的数据库,也可以选择InnoDB,因为支持事务的提交(commit)和回滚(rollback),还有需要主键自增或者外键的需求也需要InnoDB。

      **MyISAM:插入数据快,空间和内存使用比较低。如果表主要是用于插入新记录和读出记录,那么选择MyISAM能实现处理高效率。如果应用的完整性、并发性要求比 较低,也可以使用。

      **MEMORY:所有的数据都在内存中,数据的处理速度快,但是安全性不高。如果需要很快的读写速度,对数据的安全性要求较低,可以选择MEMOEY。它对表的大小有要求,不能建立太大的表。所以,这类数据库只使用在相对较小的数据库表。

      注意,同一个数据库也可以使用多种存储引擎的表。如果一个表要求比较高的事务处理,可以选择InnoDB。这个数据库中可以将查询要求比较高的表选择MyISAM存储。如果该数据库需要一个用于查询的临时表,可以选择MEMORY存储引擎。

  • mysql与memcache的区别

  • MySQL B+Tree索引和Hash索引的区别?

    • 简单地说,哈希索引就是采用一定的哈希算法,把键值换算成新的哈希值,检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需一次哈希算法即可立刻定位到相应的位置,速度非常快。

      从上面的图来看,B+树索引和哈希索引的明显区别是:

      • 如果是等值查询,那么哈希索引明显有绝对优势,因为只需要经过一次算法即可找到相应的键值;当然了,这个前提是,键值都是唯一的。如果键值不是唯一的,就需要先找到该键所在位置,然后再根据链表往后扫描,直到找到相应的数据;

      • 从示意图中也能看到,如果是范围查询检索,这时候哈希索引就毫无用武之地了,因为原先是有序的键值,经过哈希算法后,有可能变成不连续的了,就没办法再利用索引完成范围查询检索;

      • 同理,哈希索引也没办法利用索引完成排序,以及like ‘xxx%’ 这样的部分模糊查询(这种部分模糊查询,其实本质上也是范围查询);

      • 哈希索引也不支持多列联合索引的最左匹配规则

      • B+树索引的关键字检索效率比较平均,不像B树那样波动幅度大,在有大量重复键值情况下,哈希索引的效率也是极低的,因为存在所谓的哈希碰撞问题

      alin的学习之路:面试题 数据库相关

      alin的学习之路:面试题 数据库相关

  • B+树索引和哈希索引的明显区别是:

    • 索引底层结构不通过,哈希索引是用哈希函数搭配哈希值来进行搜索,B+树使用的是B+树的搜索方式
  • 非关系型数据库和关系型数据库区别,优势比较?

    • 非关系型数据库的优势:

      1. 性能NOSQL是基于键值对的,可以想象成表中的主键和值的对应关系,而且不需要经过SQL层的解析,所以性能非常高。

      2. 可扩展性同样也是因为基于键值对,数据之间没有耦合性,所以非常容易水平扩展。

      3. 查询速度:nosql数据库将数据存储于缓存之中,关系型数据库将数据存储在硬盘中,自然查询速度远不及nosql数据

    • 关系型数据库的优势:

      1. 复杂查询可以用SQL语句方便的在一个表以及多个表之间做非常复杂的数据查询。

      2. 事务支持使得对于安全性能很高的数据访问要求得以实现。对于这两类数据库,对方的优势就是自己的弱势,反之亦然。

  • mysql常见查询优化方案

    • 使用索引

    • 优化数据类型

    • 小心字符集转换

    • 优化count(my_col)和count(*)

    • 优化子查询

    • 优化UNION

  • redis数据结构用过哪些,了解跳表?

  • 不考虑事务的隔离性会出现什么问题

    • 脏读:A事务中读取到了B事务中未提交的数据,造成数据错误
    • 不可重复读:A事务中读取到了B事务中已提交的数据,在特定情景下会产生影响,比如生成统一的数据报表
    • 虚读(幻读):A事务中读取到了B事务中已提交的新插入的数据,影响同上
  • 事务隔离级别

    • alin的学习之路:面试题 数据库相关
  • 索引的类型

    • 普通索引:仅加速查询
    • 唯一索引:加速查询 + 列值唯一(可以有null)
    • 主键索引:加速查询 + 列值唯一(不可以有null)+ 表中只有一个
    • 组合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并
    • 全文索引:对文本的内容进行分词,进行搜索
    • ps.索引合并,使用多个单列索引组合搜索
    • 覆盖索引,select的数据列只用从索引中就能够取得,不必读取数据行,换句话说查询列要被所建的索引覆盖
  • 一、二、三范式的直白解释

    • 第一范式:数据表中的列应为独立的列,一个列不应存储多列的值
    • 第二范式:数据表中不存在部分函数依赖,即当表中有联合索引时,非主键列应完全依赖该联合索引中的所有列,而不是只依赖其中的部分列。
    • 第三范式:数据表中不存在传递函数依赖,即非主键列完全依赖主键列,而不是,非主键列依赖于该表中的其他非主键列。