mysql数据结构面试题_MySQL面试题汇总

事务是什么?

一系列操作,要么全部完成,要么一个都不做

事务的ACID特性

原子性:一系列操作要么都执行,要么都不执行

一致性:事务执行前后数据完整性不变,如转账前后总金额不变

隔离性:多个事务并发访问数据库,事务之间互相隔离

持久性:事务提交后,在数据库中的改变是持久的,即使发生故障也一样

事务的隔离级别

未提交读:可出现脏读、不可重复读、幻读

不可重复读:不会出现脏读,可能出现不可重复读、幻读

可重复读:不会出现脏读、不可重复读,可能出现幻读

串行化:不会出现脏读、不可重复读、幻读

事务并发问题(脏读、不可重复读、幻读)

脏读:A读到了B未提交的数据

不可重复读:A重复读某一数据,B修改提交该数据,A读到了和之前不一样的数据

幻读:A修改了所有数据,B插入(修改)一条未修改的数据,A发现有一条数据未修改

MyISAM与InnoDB 的区别

InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,(所以最好把多条SQL语言放在begin和commit之间,组成一个事务);

InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败

InnoDB是聚集索引,使用B+Tree作为索引结构,数据文件是和(主键)索引绑在一起的(表数据文件本身就是按B+Tree组织的一个索引结构)。 MyISAM是非聚集索引,也是使用B+Tree作为索引结构,索引和数据文件是分离的。

InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快

那么为什么InnoDB没有了这个变量呢?

因为InnoDB的事务特性,在同一时刻表中的行数对于不同的事务而言是不一样的,因此count统计会计算对于当前事务而言可以统计到的行数,而不是将总行数储存起来方便快速查询。

InnoDB支持表、行(默认)级锁,而MyISAM支持表级锁

InnoDB的行锁是实现在索引上的,而不是锁在物理行记录上。如果访问没有命中索引,也无法使用行锁,将要退化为表锁。

InnoDB表必须有主键(用户没有指定的话会自己找或生产一个主键),而Myisam可以没有

Innodb存储文件有frm、ibd,而Myisam是frm、MYD、MYI

Innodb:frm是表定义文件,ibd是数据文件

Myisam:frm是表定义文件,myd是数据文件,myi是索引文件

那么如何选择mysql引擎呢?

Innodb已经成为Mysql的默认引擎,它的优势是显而易见的。

1. 是否要支持事务,如果要请选择innodb,如果不需要可以考虑MyISAM;

2. 如果表中绝大多数都只是读查询,可以考虑MyISAM,如果既有读也有写,请使用InnoDB。

3. 系统奔溃后,MyISAM恢复起来更困难,能否接受;

left join,right join,inner join,full join之间的区别

left join会返回左表的所有行,即使在右表中没有匹配的数据

right join会返回右表所有行,即使在左表中没有匹配的数据

inner join会返回两个表共有的数据

full join会返回两个表所有行,即使没有匹配

三大范式

第一范式(1NF): 列不可再分(原子性)

例:年级学校 -> 年级学校

第二范式(2NF): 首先满足第一范式,然后必须有主键,非主键必须完全依赖主键,即非主键既不能不依赖主键,也不能只依赖主键的一部分。

例:学号 姓名 课程号 课程名

首先满足第二范式,同时其他非主键必须直接依赖主键,不能间接依赖

间接依赖:学院依赖学号,学院地址依赖学院,间接依赖学号

切分数据库(水平切分、垂直切分)

为什么要切分数据库

当单表记录数过大,CRUD性能会明显下降

水平切分:将一张表切分为多张表

例:商品表 -> 商品表1 + 商品表2

垂直切分:按业务切分,同一类业务的表放到同一个库里

例:网站系统(商品表、订单表、用户表)仓库系统(进货表、出货表)

水平切分和垂直切分的顺序:应先做水平切分,数据量再增大,考虑垂直切分

什么是池化思想?为什么要用数据库连接池?

池化思想:

生活中的例子:每次都打好了几盒饭在那里放着,你可以直接取。和你要打饭才开始打。

初始预设资源,抵消每次获取资源的消耗,如创建线程的开销,获取远程连接的开销等

数据库连接池:

连接池中先创建一定数量的连接,程序要获取连接直接从池中取,不必创建新的连接。如果池中的连接被用完了,新建一个放入池中。

什么是索引?优缺点是什么?

索引是用于快速查询和检索数据的数据结构,索引的常用数据结构有hash和B+树;

优点:可以提高检索速度,如果是唯一索引还能保证数据每一行的唯一性

缺点: 创建和维护索引的耗时,索引还占用存储空间

索引主要使用的数据结构?

hash:hash索引底层是hash表,查询单条记录时hash索引更快,其余大部分场景更适合使用B+树索引

B+树:索引底层使用B+树, B+ 树的特点是能够保持数据稳定有序,其插入与修改拥有较稳定的对数时间复杂度。 B+ 树元素自底向上插入。

B树和B+树区别?

B树所有节点既存放key,也存放data。B+树只有叶子节点存放key和data,其余节点只存放key

B树的叶子节点独立的,B+树的叶子节点组成一条链表,可以通过它找到相邻的叶子节点。

B树检索时不一定会检索到叶子节点,B+树检索时一定会检索到叶子节点。

Hash索引和B+树索引优劣分析?

hash索引优点定位快,但不支持顺序查询和范围查询,而且极端情况下发生大量Hash冲突(多个key的hash值相同)的话,查询也会变慢。</

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值