史上最全的Mysql面试题,只写干货!!!

每一个字都是我亲手打出来,绝对可以征服面试官!

锁:

什么是锁?
数据库有并发事务的时候,会存在数据不一致的问题,需要锁的机制来保证访问的顺序。
比如,进入酒店,如果随意进出,就会出现多人抢一个房间,而房间上锁,有钥匙的人才可以进入房间。

有哪些锁?
行锁,表锁,页锁。 InnDB表锁,行锁(默认),MyiSam(表锁)

行锁:锁定的粒度最细,只对当前操作进行加锁,大大减少数据库操作冲突,行锁分为共享和排他。特点:开销大,加锁慢,会 出现死锁,并发度最高。
表锁: 粒度最大,对当前操作的整张表加锁,实现起来简单,资源消耗少。有表共享锁和排他锁。特点:开销小,加锁快。不会出现死锁,并发度最低。
页锁:粒度是介于行锁和表锁之间,表锁速度快,冲突多,行所冲突少,但是速度慢,页锁折中。一次锁定相邻一组记录。

共享锁:读锁,用户进行数据读取,对数据加锁,共享可以加多个。
排他锁:写锁,当用户进行数据写入,对其加锁,排他可以加一个。
比如,来看房,多个用户可以一起看是可以,但是真正入住,在这期间,其他人入住和看房都是不可以的。

MySQL中InnoDB引擎的行锁是怎么实现的?
基于索引来完成行锁

什么是死锁?怎么解决?
指两个或多个事务在同一资源上相互占用,并请求锁定对方的资源,从而导致恶性循环的现象。
同一个事务中,尽可能做到一次性锁定所需要的资源,避免死锁的概率。
如果是不同的程序并发存取多个表,尽量约定好顺序,这样大大降低死锁概率。
锁升级----分布式锁或乐观锁。

乐观锁和悲观锁。
悲观锁:假设一定发生并发冲突,在查询完数据就把事务锁起来,直到事务提交。多用于写
乐观锁:假设不会发生并发冲突,在修改数据时把事务锁起来,通过version版本号方式和CAS算法锁定。多用于读

事务:
什么是事务?
简单来说,就是要么,全部都执行,要么全部都不执行。
举个例子:A转账给B1000元,A余额减少1000,B余额增加1000,万一在操作的时候,银行系统奔溃,导致A余额减少,B余额没有增加。事务就是保证
两个关键操作,要么全部成功,要么全部失败。

ACID
原子性:确保动作全部完成,要么全部不起作用。
一致性:执行事务前后,数据一致。
隔离性:并发访问数据库时,一个事务不会被其他事务干扰。
持久性:事务提交后,这个数据的改变是持久的,即使数据库发生故障也不会有影响。

什么是脏读,幻读。不可重复读?
脏读:某事务已经更新数据,另一个事务在此时读取该数据,由于某些原因,前一个事务进行Rollback操作,所有后一个事务读取的数据是不正确的。
不可重复读:在一个事务的两次查询中数据不一致。可能两次查询中间插入了一个事务更新的原有数据。
幻读:在一个事务两次查询中,数据的笔数不一致,比如,有一个事务查询了几列,而另一个事务却在此时插入新的几列数据。先前的事务在接下来
的查询中,就会发现有几列数据的先前没有的

事务的隔离级别?
读取未提交:允许尚未提交的数据变更,可能会导致脏读,幻读,不可重复读。
读取已提交:允许读取并发事务已经提交的数据,阻止脏读,但是幻读或不可重复读仍有可能发生。
可重复读: 对同一个字段的多次读取结果都是一致的,可以阻止脏读和不可重复读。(Mysql的默认隔离级别)
可串行化:最高隔离级别,所有事务依次逐个执行,这样事务之间不可能产生干扰,他可以做到防止脏读,不可重复读和幻读

索引
什么是索引?
索引就像是字典中的目录。协助快速查询,索引实现的数据结构是B+树。

加索引优点?
大大加快搜索速度,在查询过程里,使用优化隐藏器,提高系统性能。

加索引缺点?
消耗磁盘,创建索引消耗时间,如果对表数据增加删除等,索引也要动态维护。

索引使用的场景?
1.where查询,比如 select * from table where id >10,因为id就是一个特殊的索引
建立索引的语句?
alter table tableName add sex char(1);
2.orderBy查询,如果排序没有加,则会查询出所有数据使用外部排序,这个操作非常耗性能,因为要将磁盘的所涉及到的全部读到内存。
加了的话,因为索引本身就是有序的。
3.join

哪几种索引?
唯一,主键,普通,全文

B+树原理?
B+树相比B树,新增叶子节点与非叶子节点关系,叶子节点中包含了key和value,非叶子节点中只是包含了key,不包含value。
优点:集成了B树和平衡二叉树的优点,同时,它的叶子节点为顺序排列,这样它的查询范围的效率是非常的高的,举个例子
我们现在查询大于1的所有的数,直接就可以定位到1,将叶子节点1以后的数全部返回给客户端。
缺点:由于叶子节点记录相同的值,从一定程度来说会耗费硬盘

建立索引的原则?
最左前缀匹配
频繁作为查询条件的字段
更新频繁的字段不适合创建索引
定义外检列一定建立索引
查询中涉及很少的列,不建议建立索引

怎么创建索引?
在创建表的时候建立索引,
ALTER TABLE命令
使用CREATE INDEX命令创建

使用索引查询一定能提高查询的性能吗?为什么?
索引需要空间储存和定期维护,每当记录在表中增删或索引列被修改,索引本身也会变化,这就意味着每条记录的增删改查将为此付出4到5次磁盘I/O操作
不必要的索引会使查询反应时间变得很慢。索引的查询范围适用于两种情况:基于范围检索,一般查询返回的结果小计表记录的30%,基于非唯一性索引检索。

sql优化
1.定位低性能的sql语句,Mysql提供explain命令查看语句的执行计划
2.设置慢查询日志,配置slow_query_log,使用show variables like ‘slov_query_log’查看是否开启,如果状态值为OFF,可以使用set GLOBAL slow_query_log = on来开启,它会在datadir下产生一个xxx-slow.log的文件,设置临界时间
配置项:long_query_time
查看:show VARIABLES like ‘long_query_time’,单位秒
设置:set long_query_time=0.5
实操时应该从长时间设置到短的时间,即将最慢的SQL优化掉
查看日志,一旦SQL超过了我们设置的临界时间就会被记录到xxx-slow.log中
3.不要使用select *

优化查询过程中的数据
确认mysql中是否存在大量不必要的数据行
避免使用select*
多表关联指定列名
查重复数据使用缓存

优化长难的查询语句
考虑是一个复杂查询还是多个简单查询
切分查询
分解关联查询

优化特定查询
count(*)会忽略所有的列,直接统计所有列,不要使用count(列名)

优化关联查询
查看on字句是否有索引

数据库优化

如何优化?
将字段又很多表分解成多个表
增加中间表

大表如何优化?
限定数据的范围,读写分离,缓存

分表分库后面临的问题?怎么解决?
事务、跨库join、跨节点的count。orderby等、ID.
分布式事务:使用最终一致性思想,MQ解决
垮库join:分为两次查询,第一次查询,查数据id,根据id查询
跨节点的count,分别在各个节点上得到计算结果,然后合并计算
ID:设置步长,UUID,雪花算法

数据库表损坏修复?
使用myisamchk
修复前将myql服务停止
进入mysql/bin目录
执行myisamchk –recover。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值