mysql-面试题

本文深入解析MySQL的基础概念,包括其作为关系型数据库的特性,三大范式的作用,数据类型介绍,myisam与innodb的区别,索引的构造与使用,以及事务、ACID原则和并发控制。了解这些有助于提升数据库性能和设计高效查询。
摘要由CSDN通过智能技术生成
什么是MySQL?

一个关系型数据库,开源免费。

三大范式?

第一范式所有列不可再分,

第二范式在第一范式所有非主键的全部依赖主键,

第三范式在第二范式基础上不依赖其他非主键,

数据类型有哪些?

char,varchar,int,bigint,date,text

整数类型,小数类型,日期,文本

MySQL中myisam和innodb的区别?

myisam不支持事务,读取快

innodb支持事务,增删改快

什么是索引?

索引相当于目录,指向所包含的数据。

优缺点?

优点:查询数据快,提高系统性能,

缺点:改动的数据会降低他们的速度,因为你改完后还要加入索引中

什么是索引覆盖?

如果你查询abc三个字段都建立过索引,那么他会直接在索引表中去查,不会访问元数据,如果b没有索引那就会全表扫描。

索引有哪几种类型?

主键索引-不允许有null,只能有一个,不重复

组合索引-将多普通索引组合成一个索引

唯一索引-可以有null,不重复,允许多列是唯一

普通索引-没有唯一性限制,允许有null

创建索引需要注意什么?

非空字段(null字段难以做判断),索引字段越小越好

使用索引一定能提升性能吗?

不一定,索引需要空间来存储,每当有数据修改时候,索引也会随之变动,这就比平时的多付出一些次数来修改数据。

什么是聚簇索引?

有主键的情况下主键就是聚簇索引,没有就找一个唯一索引,在没有就隐式创建,聚簇索引就是把索引和数据放在一起,找到索引就是找到数据。

非聚簇索引?

就是索引和数据分开,查询先找索引在会表查找,有时候如果你查询的字段全部是索引的话就不会回表。

索引失效?

第一最左原则,范围查询,in 查询,!=查询和函数。

什么是事务?

要么都执行,要么都不执行。

ACID?

A-原子性,所有事务要么完成,要么不完成。

C-一致性,数据是一致,a 1000 b 1000 无论他俩谁给谁转账他俩总和都是2000

I-隔离性,事务和事务之间相互隔离,互不干扰

D-持久性,对数据的修改是持久不变的

脏读、幻读、不可重复读?

脏读-读取到未提交的数据或者读取回滚数据。

幻读-读取到没有的数据,一个事务正在读取,他读取的几行数据,此时有一个事务来进行插入,在读取的时候会发现原来没有的数据。

不可重复读-一个事务读取俩次的数据不一致,俩次查询过程中有有一个事务做了更新了数据

隔离级别?

read-uncommit;读未提交

允许读取未提交的数据,引发脏读,幻读,不可重复读

read-commit;读已提交

允许读取事务完成的数据,引发幻读,不可重复读

repeatable-read;重复读

对同一数据多次读取结果一致,除非数据本身事务对其进行修改

导致幻读

serialzable;串行化

所有的事务依次执行,消耗巨大解决同时解决了脏读,幻读,不可重复读

mysql默认是repeatable-read

oracle默认是read-commit

事务隔离机制?

基于锁机制和并发调度,其中并发调度使用的是MVCC(多版本并发控制器),保存修改的旧版本信息来支持并发一致性和回滚。

mysql锁理解?

当多个事务在读取数据,可能会产生数据不一致,为了保证访问顺序,这时候就会用到锁,

就拿read-uncommit来说他在读取的时候不会上共享锁,这样就会对别的事务进行修改上的排他锁冲突。

read-commit会在读操作上共享锁,但是在语句执行完就会释放,也就是为什么能解决脏读。
repeatable-read在读操作时上读锁但是他是在事务执行完成后才释放锁

串行化时最强隔离级别,他会一直持有锁,直到事务处理完毕。

行锁:读锁和写锁都是行锁,他的粒度最细的,锁冲突小,但会导致死锁,并发高,开销大加锁慢,

表锁:对于整张表加锁,冲突会加大,不会导致死锁,并发一般开销小加锁快

页锁:对于当前页加锁,会导致死锁,并发一般,加锁一般开销一般

什么是读锁?

读锁又称为共享锁,读锁可以持有多个,只能对数据进行读取。

什么是写锁?

写锁又称为排他锁,当前数据只能有一个排他锁,和读锁相斥

死锁?

俩个及多个事务在同以资源上相互占用,并想着锁住对方的资源,从而导致恶性循环。

解决升级成表锁,约定相同的顺序访问表

或者使用乐观锁

索引的解构?

b树和hash

b树会排序,hash不会排序

悲观锁乐观锁?

悲观锁,认为事务都是会冲突的,在查询的时候就上锁,直到完成。

乐观锁,认为一切都不会发生,如果发生了在进行上锁,一般就是比较并交换。

innodb的实现原理?

innodb通过聚集方式,每个表中的主键都会在innodb生成主键的b+树的根节点,叶子节点存放的是数据也包含了主键,通过查询主键的方式,先进行主键的查找然后通过查询主键所在的根节点指向的叶子节点。这是如果在创建表的时候没有主键,innodb会查看是否有非空唯一索引,有就代替主键,如果有多个,先择第一个,如果也没有,会自动生成一个不可见的row_Id。
带来问题:当row_id在每次数据库新增数据时都会+1,一旦超过了2的48-1,后你通过row_id获取到0,发生了主键冲突。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值