java面试题(数据库)

Mysql

  1. 索引的基本原理  

索引是用来快速寻找特定的记录;把无序的数据变成有序的数据进行查询

  1. 把创建索引的列数据进行排序

  1. 对排序结果生成倒排表

  1. 在倒排表的内容上拼接上地址链

  1. 在查询时,先拿到倒排表内容,再取出地址链,最后拿到数据

  1. 聚簇索引和非聚簇索引的区别

聚簇索引:进数据与索引放在一起,找到索引也找到了数据

非聚簇索引:将数据与索引分开存放,索引结构的叶子节点指向了数据的位置,通过位置找到数据

区别:

  1. 查询聚簇索引可以直接获取数据,非聚簇索引需要二次查询

  1. 聚簇索引适合范围查询  ,非聚簇索引适合排序

  1. mysql索引的结构,各自的优劣

索引的数据结构与具体的存储引擎有关。比较常用的是Hash索引和B+树索引;

Hash索引: 采用一定的hash算法,把键值换算成新的hash;等值查询,那么hash索引有明显优势,前提是健值都是唯一的,如果健值不唯一,那就需要先找到健的位置,然后再扫描链表,找到对应的值;范围查询,hash索引就不好用了

B+树索引:关键字检索效率比较平均;常规检索,从根节点到叶子节点的搜索效率基本相当,不会出现大幅波动,而且基于索引的顺序扫描时,也可以利用双向指针快速左右移动,效率非常高

  1. 索引的设计原则

查询更快,占用空间更少

  1. 适合出现在where子句中的列,或者连接子句中指定的列

  1. 基数较小的列,索引效果差,不需建

  1. 不要过度索引。索引需要磁盘空间

  1. 定义为外键的列一定要建立索引

  1. 频繁更新的字段不适合建立索引

  1. 对于查询涉及少,重复值较多的列不建立索引

  1. 定义为text、image、bit之类的数据类型不建立索引

  1. 事务的基本特性和隔离原则

基本特性(ACID):

原子性:事务的最小执行单位,不允许分隔。确保动作要么全部完成,要么不完成

一致性:执行事务前后数据保持一致,多个事务对同一个数据的读取结果是相同的

隔离性:一个事务的修改在最终提交前,对其他事务是不可见的

持久性:一个事务被提交后,所做的修改永久保存在数据库中

隔离原则:

读未提交:可能会读取到其他事务未提交的数据,也叫脏读

读已提交(oracle):只会读取已提交的事务,两次读取的结果不一致,叫做不可重复读

可重复读(mysql):每次读取的数据都是一致的,但有可能会出现幻读

可串行化:一般不使用,会给每行加锁,会导致大量超时和锁竞争的问题

  1. 如何对mysql进行分库分表?多大数据需要进行分库分表?分库分表的方式和分片策略有哪些?分库分表后SQl的执行顺序是怎样的?

什么是分库分表:当数据量过大时,查询速度降低。为提升效率,将一个表中的数据分散到多个数据库的多个表中。

常用分库分表工具:MyCat、ShardingSphere

数据分片方式:

垂直分片:从业务角度将不同的表拆分到不同的库中,能解决数据库数据文件过大的问题,但不能从根本上解决查询问题。

水平分片:从数据角度将一个表中的数据拆分到不同的库或者表中,这样可以从根本上解决数据量过大造成的查询效率低的问题。

分片策略:

  1. 取余:均匀存放数据,但扩容非常麻烦

  1. 按照范围:比较好扩容,但数据分布不够均匀

  1. 按照时间:比较容易将热点数据区分

  1. 按照枚举值:例如按地区分片

  1. 按照目标字段前缀指定分区:自定义业务规则分片

水平分片从理论上突破了单机数据量处理的瓶颈,并且拓展自由,是分库分表的标准解决方案

阿里开发手册建议:一个表的数据超过500万或者数据文件达到2G(业务开始前,提前预估3年业务量)

分库分表后执行流程(ShardingSphere):

sql解析->查询优化->sql路由->sql改写->sql执行->结果归并

分库分表问题:

跨库查询、跨库排序、分布式事务、公共表、主键重复......

  1. mysql的主从同步原理

主从同步:当主库的数据发生改变时,变化会实时同步到从库;

主从同步好处:

水平拓展数据库的能力

容错、高可用

数据备份

实现:在主库机器上,主从同步事件会被写到特殊的log文件中;在从库机器上,从库读取主从同步事件,并根据读取的事件变化,在从库上做对应的更改

  1. Myisam和Innodb的区别
  1. InnoDB索引是聚簇索引,MyISAM索引是非聚簇索引

  1. InnoDB的主键索引的叶子节点存储着行数据,因此主键索引非常高效

  1. MyISAM索引的叶子节点存储的是行数据地址,需要再寻址一次才能得到数据。

 d.  InnoDB非主键索引的叶子节点存储的是主键和其他带索引的列数据,因此查询时做到覆盖索引会

非常高效

  1. mysql中索引类型及对数据库的性能的影响

主键:特殊的唯一索引,一张表中只有一个

唯一索引:保证数据的唯一性

普通索引:允许被索引的数据列包含重复的值

索引可以极大地提高数据的查询速度,提高系统的性能;但是删除、新增、修改的速度会降低;每一个索引都要占用物理空间。

  1. Explain语句结果中各个字段分表表示什么

id:语句中每出现一次select,就会分配一个唯一id,某些子查询会被优化成join,id就会一致

select_type:select关键字对应的查询类型

table:表名

partitions:匹配的分区信息

type:针对单表的查询方式(全表扫描、索引)

possible_keys:可能用到的索引

key:实际用到的索引

key_len:实际用到的索引长度

ref:当使用索引查询时,与索引列进行值匹配的对象信息

rows:读取的记录条数

filtered:表过滤后的剩余记录百分比

Extra:额外信息

  1. 索引覆盖是什么

执行sql时,当前sql所需要查询出来的字段数据在索引对应的B+树中都包含了,不需要再去找,直接返回结果。

  1. 最左前缀原则是什么

最左优先,在创建索引时,最频繁的一列放在最左侧

  1. Innodb是如何实现事务的

以update为例:

  1. Innodb收到update语句后,根据条件查询数据所在页,并缓存在Buffer Pool中

  1. 执行update语句,修改Buffer Pool数据

  1. 针对update语句生成一个redoLog对象, 并存入LogBuffer中

  1. 针对update语句生成undo Log日志, 用于事务回滚

  1. 如果事务提交, 那么则把redo Log对象及逆行持久化, 后续还有其他机制将数据页持久化到磁盘中;如果事务回滚, 则利用undo log 日志进行回滚

  1. B树和B+树的区别,为什么Mysql使用B+树

B树:对节点排序、一个节点可以存多个元素,多个元素也排序了

B+树:拥有B树的特点、叶子节点之间有指针、非叶子节点在叶子节点上有冗余,并且排好序

因为索引是用来加快查询的,而B+树通过对数据进行排序可以提高查询速度,B+树通过一个节点可以存储更多的元素,使得B+树更加矮胖,所需要的IO更少,并且一页只有16KB,一般情况下任务深度为3的B+树可以存2000万行数据。利用B+树中的叶子节点有序链表可以很好地支持范围查找和全表扫描。

  1. mysql锁的类型有哪些
  1. 行锁:指锁住表的某一行或多行,其他事务访问时,被锁住的行不能访问,其他正常

  1. 表锁:指锁住整个表,其他请求只能读,不能写;直到读锁释放,才能写入

  1. 死锁:多个进程在执行过程中,争夺资源造成相互等待,无法继续执行

  1. 乐观锁:假设数据不会冲突,所以在数据提交更新时才会检测,如果冲突则返回错误信息

  1. 悲观锁:当对数据库中一条数据修改时,为了避免被其他人修改,直接加锁,防止并发

  1. 共享锁:当数据加上锁后,其他事务只能读锁,而不能加写锁;直到所有读锁释放完毕,才能加写锁

  1. 排它锁:当一个事务为数据加上写锁时,其他请求不能再加任何锁,直到该锁释放

  1. Mysql慢查询该如何优化?
  1. 检查是否走了索引,如果没有则优化sql利用索引

  1. 检查是否用了最优索引

  1. 检查字段是否都是必须的,是否查询了过多字段,查出多于数据

  1. 检查是否需要分库、分表

  1. 检查数据库配置,是否需要增加资源

  1. mysql中有哪些索引?
  1. 主键索引:数据列不允许重复,不允许为null,一个表只能有一个

  1. 唯一索引:数据列不允许重复,允许为null,一个表允许多个列创建唯一索引

  1. 普通索引:基本的索引类型,没有唯一性的限制,允许为NULL值

  1. mysql哪些情况下会造成索引的失效
  1. 非最左匹配(以最左的为起点字段查询可以使用联合索引,否则不能使用联合索引)

  1. 错误模糊查询(只有右模糊查询才能触发索引)

  1. 列运算(索引列使用了运算)

  1. 使用函数(索引列使用函数)

  1. 类型转换(字段为字符串类型,但是传入int类型,索引失效)

  1. 使用is not null

  1. 使用(!=或<>)

  1. 索引列使用了or

  1. 主键和唯一索引的区别
  1. 主键索引不允许为null,且唯一;唯一索引允许为null,允许多个列创建唯一索引

  1. 主键一定会创建一个唯一索引,有唯一索引的列不一定为主键

  1. 主键索引只能有一个,但可以有多个唯一索引

  1. 主键可以被其他表引为外键,唯一索引不行

  1. 主键的执行顺序要高于唯一索引

  1. 主键是约束,但唯一索引是索引

20.什么是MVCC

多版本并发控制:读取数据时通过一种类似于快照的方式将数据保留下来,这样读锁和写锁就不冲突了,不同事务session会看到自己特定版本的数据、版本链;

MVCC只能在已提交读和可重复读两个隔离级别下工作

猜你喜欢

转载自blog.csdn.net/qq_35056891/article/details/129675144