JAVA面试逃不掉MySQL数据库问题

tech2026-08-08  1

1、数据库存储引擎有哪些

show engines 语句可以查看数据库的存储引擎

2、数据库设计的三大范式

NF说明第一范式强调的是原子性,即列不能再分成其他的列第二范式在第一范式的基础上,非主键的列必须完全的依赖主键,而不能只依赖主键的一部分第三范式在第二范式的基础上,非主键列必须直接依赖主键,不能存在传递的依赖

3、MyISAM与Innodb有什么区别

对比项MyISMInnoDB主外键不支持支持行表锁表锁,即使操作一条数据,也会锁住整张表行锁,操作表时,只会锁住当前行的数据,不对其他行有影响,适应并发操作事务不支持支持缓存只缓存索引,不缓存真实数据不仅缓存索引,还要缓存真实数据表空间小大关注点性能事务

4、事务有哪些特点,数据库的隔离级别有哪些

事务的特点有:1、原子性 2、一致性 3、隔离性 4、持久性

原子性:事务是一个原子的操作单元,操作数据时,要么一起操作,要么一起失败; 一致性:在事务开始和完成时,数据始终保持一致的状态。 隔离性:事务与事务之间是相互独立的,互不干扰。 持久性:事务完成之后,对数据的修改是持久化的。

数据库的隔离级别有四种:(read uncommitted)读未提交、(read committed)读已提交(不可重复读)、(Repeatable Read 可重复读)Serializable(可串行化) MySQL的默认隔离级别是 (repeatable read 可重复读) Oracle/SQL Server数据库的默认隔离级别是(read committed 不可重复读)

5、脏读、幻读、不可重复读指的是什么,有什么区别

隔离级别数据一致性脏读不可重复读幻读read uncommitted最低级别,只能保证不读取物理上的损坏数据是是是read committed语句级否是是repeatable read事务级否否是serializable最高级别、事务级否否否

脏读:A事务读取到了B事务已更新但未提交的数据,如果事务B回滚了,事务A读取到的数据就跟之前不一致了

不可重复读:A事务前后两次读取到的数据出现不一致的现象,A事务读取完第一次数据后,准备读取第二次时,期间有其他的事务对数据做了修改,导致A事务读取到的数据跟之前的不一致。

幻读:A事务读取到了B事务新增的数据,导致A事务读取前后两次的数据不一致。A事务第一次读取到的数据,在A事务准备第二次读取数据时,B事务插入了一些新增的数据。

6、索引类型

聚簇索引:数据行的物理顺序与列值(一般为主键列)的逻辑顺序相同,一张表只能有一个聚簇索引非聚簇索引:该索引的逻辑顺序跟磁盘中的物理顺序不相同,一张表中可以有多个非聚簇索引 聚簇索引与非聚簇索引的区别1、聚集索引一个表只能有一个,而非聚集索引一个表可以存在多个2、聚集索引存储记录是物理上连续存在,而非聚集索引是逻辑上的连续,物理存储并不连续3、聚集索引:物理存储按照索引排序;聚集索引是一种索引组织形式,索引的键值逻辑顺序决定了表数据行的物理存储顺序4、非聚集索引:物理存储不按照索引排序;非聚集索引则就是普通索引了,仅仅只是对数据列创建相应的索引,不影响整个表的物理存储顺序.5、索引是通过二叉树的数据结构来描述的,我们可以这么理解聚簇索引:索引的叶节点就是数据节点。而非聚簇索引的叶节点仍然是索引节点,只不过有一个指针指向对应的数据块。

非聚簇索引又称普通索引、唯一索引等。

单值索引:一个索引只包含一个列,一张表中可以有多个单值索引 多值索引:一个索引包含多个列

7、SQL优化

**问题:哪些情况下需要建立索引** 主键自动建立唯一索引(聚簇索引)频繁作为查询条件的字段应该创建索引查询中与其它表关联的字段,外键关系建立索引频繁更新的字段不适合创建索引,因为每次更新不单单是更新了记录,还会更新索引,加重IO负担where条件里用不到的字段不创建索引查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度查询中统计或者分组字段

问题:哪些情况下不要创建索引

表记录太少经常增删改的表

查看SQL的执行计划

通过explain+SQL语句可以查看sql的执行过程 如图: id:表示查询中执行select子句或操作表的顺序 id相同,执行顺序由上至下 id不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行 id相同不同,同时存在,衍生:DERIVED

select_type:查询的类型,主要是用于区别普通查询、联合查询、子查询等的复杂查询 table:显示这一行的数据是关于哪些表的。 type显示的是访问类型,是较为重要的一个指标,结果值从最好到最坏依次是 system>const>eq_ref>ref>range>index>All possible_keys:显示可能应用在这张表中的索引,一个或多,但不一定被查询实际使用。 key:实际使用的索引。如果为NULL,则没有使用索引 key_len:表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度。在不损失精确性的情况下,长度越短越好. ref:显示索引的哪一列被使用了 rows:根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数。 Extra:包含不适合在其他列中显示但十分重要的额外信息。 Using filesort:说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。MySQL中无法利用索引完成的排序操作成为“文件排序”。 Using temporary:使用了临时表保存中间结果,MySQL在对查询结果排序时使用临时表。常见于排序order by和分组查询group by。 Using index:表示相应的select操作中使用了覆盖索引(Covering Index),避免访问了表的数据行,效率不错!

开启慢日志查询-设定一个阀值,超过这个阀真的sql会被记录到日志文件中,说明这是一条慢的sql,需要进行优化。

查看是否开启慢日志,默认是关闭的,如果不是调优需要,一般不建议开启 SHOW VARIABLES LIKE ‘%slow_query_log%’;

开启慢日志(使用这个命令,只会对当前数据库生效) set global slow_query_log=1; 查看当前数据库阀值的时间,默认是10s SHOW VARIABLES LIKE ‘long_query_time%’

设置阀值时间 set global long_query_time=3; 查询当前系统中有多少条慢查询记录 show global status like ‘%Slow_queries%’;

show profile查看 show profile:是mysql提供的可以用来分析当前会话中语句执行的资源消耗情况。可以用于SQL的调优的测量,默认情况下,参数处于关闭状态,并保存最近15次的运行结果

查看当前mysql版本是否支持 show variables like ‘profiling’

开启功能,默认是关闭的,使用前先开启 set profiling = on; 查看结果 show profiling; 诊断SQL,show profile cpu, block io for query [上一步(show profiling查询结果)SQL数字号码];

8、谈谈你对索引B+tree的理解

先看图形结构 一颗b+树,浅蓝色的块我们称之为一个磁盘块,可以看到每个磁盘块包含几个数据项(深蓝色所示)和指针(黄色所示) 如磁盘块1包含数据项17和35,包含指针P1,P2,P3 P1表示小于17的磁盘块,P2表示在17和35 之间的磁盘块,P3表示在大于35的磁盘块 真实的数据存放在b+树的叶子节点,3,5,9,10,13,15,28,29,36,60,75,79,90,99 非叶子节点不存储真实数据,只存储指引搜索方向的数据项,如17和35并不真实的存在于数据表中。

9、索引失效的场景

SQL语句上where条件筛选索引字段上少计算SQL语句上where条件筛选出现 or 关键字的使用SQL语句上where条件筛选时,出现大于> ,小于< ,不等于 != 的范围之后的索引字段SQL语句上where条件筛选时,查询时,字符串类型的值没有加单引号使用覆盖索引时,查询字段不要写 * 号

10、SQL语句的执行顺序与解析

10、数据库锁机制

最新回复(0)