前往小程序,Get更优阅读体验!
立即前往
社区首页 >专栏 >Java面试高频知识点汇总 数据库专题

Java面试高频知识点汇总 数据库专题

作者头像
Steve Wang
发布于 2020-09-24 07:23:33
发布于 2020-09-24 07:23:33
4080
举报
文章被收录于专栏:从流域到海域从流域到海域

MySQL是一种关系型数据库,它开源免费(GPL),扩展方便,稳定性也有保障,因此在企业级开发中常常使用。MySQL默认端口号是3306。

查看MySQL提供的所有存储引擎: mysql> show engines

MySQL的默认存储引擎是InnoDB,并且在5.7版本的所有存储引擎中只有InnoDB是事务性存储引擎,也就是说只有InnoDB支持事务。

MySQL索引

MySQL索引使用的数据结构主要有BTree索引和哈希索引。哈希索引底层数据结构就是哈希表,因此绝大多数需求为单条记录查询时,可以选择哈希索引,查询性能最快(O(1));其余大部分场景,建议使用BTree索引。

MySQL的BTree索引具体指B+Tree,但在主要的两种存储引擎的实现方式是不同。

  • MyISAM:B+树叶子节点的data域存放的是数据记录的地址。在索引检查的时候,首先按照B+树搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后根据data域的地址值读取相应的数据记录。这被称为“非聚簇索引”。MyISAM索引文件和数据文件是分离的。
  • InnoDBInnoDB存储引擎的B+树索引可以分为聚簇索引和辅助索引(非聚簇索引或者二级索引)。InnoDB索引表数据文件本身就是按照B+树组织的一个索引结构,树的叶子结点data域保存了完整的数据记录。索引和数据是存储在一起的。

聚簇索引就是按每张表的主键构造一棵B+树,同时叶子节点中存放的是整张表的行记录数据,因此也将聚簇索引的叶子节点也称为数据页,这个特性决定了索引组织表中的数据也是索引的一部分。

日常工作中,根据实际情况自行添加的索引都是辅助索引(非聚簇索引)。辅助索引是为了查找主键索引而建立的二级索引,先在辅助索引中找到主键索引,再使用主键索引在主索引中查找数据。也由于辅助索引的二次查询过程,在设计表的时候,不建议使用过长的字作为字段,也不建议使用非单调的字段作为主键,这样会造成主索引频繁分裂。

事务

事务就是逻辑上的一组操作,要么都执行,要么都不执行。

事务的四大特性(ACID)
  1. 原子性(Atomicity)
  2. 一致性(Consistency)
  3. 隔离性(Isolation)
  4. 持久性(Durability)

并发事务会带来哪些问题

  • 脏读
  • 丢失修改
  • 不可重复读
  • 幻读

不可重复度和幻读的区别: 不可重复读的重点是修改不如多次读取一条记录发现其中某些列的值被修改,幻读的重点在于新增或者删除比如多次读取一条记录发现记录增多或者减少了。

事务的隔离级别

SQL标准定义了四个隔离级别:

  • READ-UNCOMMITED(读取未提交):最低的隔离级别,允许尚未提交的数据变更,可能会导致脏读、幻读和不可重复读。
  • READ-COMMITED(读取已提交):允许读取并发事务已经提交的数据,可以阻止脏读,但是幻读和不可重复读还是会方式
  • REPEATABLE-READ(可重复读):对同一字段的多次读取结果是一致的,除非数据是被本身事务自己修改,可以阻止脏读和不可重复读,但幻读还是有可能发生。
  • SERIALIZABLE(可串行化):最高的隔离级别,完全服从ACID的隔离级别。所有事务依次逐个执行。这样事务之间完全不可能产生干扰,也就是说,该级别可以防止脏读、不可重复读以及幻读。

MySQL InnoDB存储引擎默认支持的隔离级别是REPEATABLE-READ注意:虽然InnoDB存储引擎采取REPEATABLE-READ隔离级别,但是它使用Next-key Lock算法,因此也可以避免幻读的产生,这与其他数据库(SQL Server)是不同的。InnoDB已经可以完全保证事务的隔离性要求,即达到了SQL标准的SERIALIZABLE(可串行化)隔离级别。因为隔离级别越低,事务需要请求的锁越少,所以大部分数据库的隔离级别都是READ-COMMIT,但是InnoDB默认使用REPEATABLE-READ,并且不会有任何性能损失。

锁机制与InnoDB锁算法

MyISAMInnoDB存储引擎使用的锁:

  • MyISAM采用表级锁(table-level locking)
  • InnoDB支持行级锁(row-level locking)和表级锁,默认为行级锁

表级锁和行级锁对比:

  • 表级锁:MySQL中锁定粒度最大的一种锁,对当前操作的整张表加锁,实现简单,资源消耗也比较少,加锁快,不会出现死锁。其锁定粒度最大,并发冲突的概率最高,并发度最低。
  • 行级锁:MySQL中锁定粒度最小的一种锁,只针对当前操作的行进行加锁。行级锁能大大减少数据库操作的冲突。其加锁粒度小,并发度高,但加锁的开销也最大,加速慢,会出现死锁。

InnoDB存储引擎的锁的算法有三种:

  • Record Lock:单个行记录上的锁
  • Gap Lock:间隙锁,锁定一个范围,不包括记录本身
  • Next-Key Lock:Record+Gap锁定一个范围,包括记录本身

大表优化

当MySQL单表记录过大时,数据库的CRUD性能会明显下降,一些常见的优化措施如下:

  • 限定数据的范围
  • 读/写分离
  • 垂直分区
  • 水平分区

池化思想和数据库连接池

池化思想在很多的地方都可以见到,比如java线程池jdbc连接池redis连接池等。这种设计会初始预设资源,解决的问题就是抵消每次获取资源的消耗,如创建线程的开销,获取远程连接的开销等。除了初始化资源,池化设计还包括如下这些特征:池子的初始化、池子的活跃值、池子的最大值等,这些特征可以直接映射到java线程池和数据库连接池的成员属性中。

数据库连接本质上就是一个socket连接。数据库服务端还要维护一些缓存和用户权限信息之类的所以占用了一些内存。我们可以把数据库连接池看作是维护数据库连接的缓存,以便将来需要对数据库的请求时可以重用这些连接。为每个用户打开和维护数据库连接,尤其时对动态数据库驱动的网站应用程序的请求,既昂贵又浪费资源。 在连接池中,创建连接后,将其放置在池中,并再次使用它,因此不必建立新的连接。如果使用了所有连接,则会建立一个新连接并将其添加到池中。

参考文献

JavaGuide面试突击版,百度可得最新版,有删减和小部分修正。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020/09/24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Java MySQL数据库专题
MySQL的默认存储引擎是InnoDB,并且在5.7版本的所有存储引擎中只有InnoDB是事务性存储引擎,也就是说只有InnoDB支持事务。
Steve Wang
2022/05/10
1.7K0
Java MySQL数据库专题
MySQL知识点总结
从上图我们可以查看出 MySQL 当前默认的存储引擎是InnoDB,并且在5.7版本所有的存储引擎中只有 InnoDB 是事务性存储引擎,也就是说只有 InnoDB 支持事务。
Java3y
2019/07/04
8850
MySQL知识点总结
数据库常问
在MySQL中,索引是在存储引擎层实现的,不同存储引擎对索引的实现方式是不同的,下面我们探讨一下MyISAM和InnoDB两个存储引擎的索引实现方式。
_咯噔_
2022/04/26
4830
MySQL面试题/知识点总结!(2021 最新版)
这篇文章之前发过,不过,我最近对其进行了重构完善并且修复了很多小问题。所以,在公号再同步一下!
Guide哥
2021/07/27
5180
MySQL面试题/知识点总结!(2021 最新版)
关于MySQL基础知识点 | 常见面试问题汇总
原文:http://www.enmotech.com/web/detail/1/737/1.html
数据和云01
2019/07/03
6860
关于MySQL基础知识点 | 常见面试问题汇总
MySQL基础面试题(2021年六月面试记录)
    MyISAM是MySQL的默认数据库引擎(5.5版之前)。虽然性能极佳,而且提供了大量的特性,包括全文索引、压缩、空间函数等,但MyISAM不支持事务和行级锁,而且最大的缺陷就是崩溃后无法安全恢复。不过,5.5版本之后,MySQL引入了InnoDB(事务性数据库引擎),MySQL 5.5版本后默认的存储引擎为InnoDB。大多数时候我们使用的都是 InnoDB 存储引擎,但是在某些情况下使用 MyISAM 也是合适的比如读密集的情况下。(如果你不介意 MyISAM 崩溃恢复问题的话)。
上分如喝水
2021/08/16
4630
MySQL基础面试题(2021年六月面试记录)
MySQL数据库知识点
结构化查询语言(Structured Query Language)简称SQL,是一种数据库查询语言。
Vincent-yuan
2021/09/10
7840
MySQL数据库知识点
MySQL面试题全解析:准备面试所需的关键知识点和实战经验
MySQL支持多种数据存储引擎,其中最常见的是MyISAM和InnoDB引擎。可以通过使用"show engines"命令查看MySQL支持的存储引擎。
努力的小雨
2023/11/09
3660
[数据库]-基础面试题总结
drop(丢弃数据): drop table 表名 ,直接将表(表结构和数据)都删除掉,在删除表的时候使用。 truncate (清空数据) : truncate table 表名 ,只删除表中的数据,再插入数据的时候自增长 id 又从 1 开始,在清空表中数据的时候使用。 delete(删除数据) : delete from 表名 where 列名=值,删除某一列的数据,如果不加 where 子句和truncate table 表名作用类似。但是再进行插入的话自增id并不是从1开始,而是接着之前的自增开始。 truncate 和不带 where 子句的 delete、以及 drop 都会删除表内的数据,但是 truncate 和 delete 只删除数据不删除表的结构(定义),执行 drop 语句,此表的结构也会删除,也就是执行 drop 之后对应的表不复存在。
无敌小菜鸟
2021/12/13
6640
[数据库]-基础面试题总结
大厂面试系列(八):数据库mysql相关
数据库相关 mysql索引的数据结构,加索引的原则 InnoDB和myiasm的区别,以及常见的mysql优化方案 sql查询优化 说说Mysql的sql优化 mysql的索引,b+树索引是否支持范围查询,联合索引的失效情况 开发中用了那些数据库?回答mysql,储存引擎有哪些?然后问了我悲观锁和乐观锁问题使用场景、分布式集群实现的原理。 数据库索引原理 mysql索引 B+树原理 mysql索引是怎么实现的?b+树有哪些特点?真实的数据存在哪里?哪些情况下建索引?解释下最左匹配原则?现在一个表有三列a
zhaozhen
2021/07/15
1.1K0
「春招系列」MySQL面试核心25问(附答案)
如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。如果使用非自增主键(如果身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置, 频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,后续不得不通过OPTIMIZE TABLE(optimize table)来重建表并优化填充页面。
北游
2022/03/03
5330
关于 MySQL 的知识点与面试常见问题都在这里
img垂直拆分的优点: 可以使得行数据变小,在查询时减少读取的Block数,减少I/O次数。此外,垂直分区可以简化表的结构,易于维护。 垂直拆分的缺点: 主键会出现冗余,需要管理冗余列,并会引起Join操作,可以通过在应用层进行Join来解决。此外,垂直分区会让事务变得更加复杂;
Java高级架构
2018/10/22
6320
关于 MySQL 的知识点与面试常见问题都在这里
数据库温故:Mysql底层原理起底
SQL优化调优是体现程序员分析归纳能力的有效手段,虽然我们不是DBA,但是编码开发时也会涉及许多对数据库的CRUD需求。因此,通过理解Mysql数据库的底层原理,对我们的笔试面试,还有提高业务编码水平是有好处的。
后台技术汇
2023/09/25
1.9K0
数据库温故:Mysql底层原理起底
关于MySQL的知识点与面试常见问题都在这里
Java面试通关手册(Java学习指南,欢迎Star,会一直完善下去,欢迎建议和指导):https://github.com/Snailclimb/Java_Guide
用户2164320
2018/06/14
6350
关于MySQL的知识点与面试常见问题都在这里
我自己总结的Java学习的一些知识点以及面试问题,目前已经开源,会一直完善下去,欢迎建议和指导欢迎Star: https://github.com/Snailclimb/Java_Guide
用户2164320
2018/06/22
6760
关于MySQL的知识点与面试常见问题都在这里
mysql 问题与优化
InnoDB: 其数据文件本身就是索引文件。相比MyISAM,索引文件和数据文件是分离的,其表数据文件本身就是按B+Tree组织的一个索引结构,树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。这被称为“聚簇索引(或聚集索引)”。而其余的索引都作为辅助索引,辅助索引的data域存储相应记录主键的值而不是地址,这也是和MyISAM不同的地方。在根据主索引搜索时,直接找到key所在的节点即可取出数据;在根据辅助索引查找时,则需要先取出主键的值,再走一遍主索引。 因此,在设计表的时候,不建议使用过长的字段作为主键,也不建议使用非单调的字段作为主键,这样会造成主索引频繁分裂。
Tim在路上
2020/08/04
5900
备战春招,这份数据库面试总结请收好
最开始,我们是将数据保存在 内存 中,这能够保证我们十分 快速存取,但是一旦断电,数据就丢失了,无法永久保存。 于是我们将数据存放在 文件 中,这样一来我们就 能够将数据永久保存,但每次都要进行频繁的 IO 操作,相对于内存来讲速度就慢了许多,而且进行查询操作也不方便。 于是,我们转移到了 数据库 存储,通过这种方式不但 能将永久保存数据,而且查询管理也更加高效方便。
村雨遥
2021/01/26
5840
常见公司MySQL面试题全集
事务:事务是访问和更新数据库的程序执行的一个逻辑单元;事务中可能包含一个或多个sql语句,这些语句要么都执行,要么都不执行。作为一个关系型数据库,MySQL支持事务。
用户1685462
2021/07/16
3940
2020数据库最新面试题常考汇总
主键索引:在我们给一个字段设置主键的时候,它就会自动创建主键索引,用来确保每一个值都是唯一的。
宇宙之一粟
2020/10/26
4880
数据库-面试
共享锁也称为读锁,相互不阻塞,多个客户在同一时刻可以同时读取同一个资源而不相互干扰。
知识浅谈
2022/02/25
1.1K0
相关推荐
Java MySQL数据库专题
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档