MYSQL八股-优化篇

8 篇文章 0 订阅
1 篇文章 0 订阅

三大范式

  • 第一范式:强调的是列的原子性,即数据库表的每一列都是不可分割的原子数据项。
  • 第二范式:要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性。
  • 第三范式:任何非主属性不依赖于其它非主属性。

一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 MySQL 数据库,又插入了一条数据,此时 id 是几?

这个要分引擎讨论,如果是InnoDB,其为行锁(不考虑实用表锁时),然后每次insert时,由于InnoDB不会记录行号,因此会是6。
如果是MyISAM,其为表锁,会记录行号,因此是8。

如何获取当前数据库版本?

select version()

ACID 是什么?如何保证?

A:原子性,保证操作的原子,通过事务保证,底层是undolog
C:一致性,保持整体数据不会出现错误,实用其他三大特性保证
I:隔离性:实用MVCC保证
D:持久性:保证数据的持久性,底层是实用redolog实现

MySQL 的内连接、左连接、右连接有什么区别?

内连接关键字:inner join;左连接:left join;右连接:right join。

内连接是只把匹配的关联数据显示出来;左连接是左边的表全部显示出来,右边的表显示出符合条件的数据;右连接正好相反。

MySQL 索引是怎么实现的?为什么不可以用b树

通过b+树,其是从b树演变过来的。

b树如下,内节点也会进行存储数据,叶子节点都在同一级,其对于普通的二叉树的单节点存储而言,每一次都会进入一个精确的区间查询,检索开销减少了log n次。
在这里插入图片描述

b+树如下,其对于b树而言,内节点不存储数据,使得能够进行范围搜索,而且固定了查询效率,每一个都是O(log n),而b树最好是o1,最坏不确定,这样不利于mysql去确定是否全表扫描还是走索引。
在这里插入图片描述

说一下数据库的事务隔离?

READ-UNCOMMITTED:未提交读,最低隔离级别、事务未提交前,就可被其他事务读取(会出现幻读、脏读、不可重复读)。
READ-COMMITTED:提交读,一个事务提交后才能被其他事务读取到(会造成幻读、不可重复读)。
REPEATABLE-READ:可重复读,默认级别,保证多次读取同一个数据时,其值都和事务开始时候的内容是一致,禁止读取到别的事务未提交的数据(会造成幻读)。
SERIALIZABLE:序列化,代价最高最可靠的隔离级别,该隔离级别能防止脏读、不可重复读、幻读。

「脏读」 :表示一个事务能够读取另一个事务中还未提交的数据。比如,某个事务尝试插入记录
A,此时该事务还未提交,然后另一个事务尝试读取到了记录 A。

「不可重复读」 :是指在一个事务内,多次读同一数据。

「幻读」 :指同一个事务内多次查询返回的结果集不一样。比如同一个事务 A 第一次查询时候有 n 条记录,但是第二次同等条件下查询却有 n+1
条记录,这就好像产生了幻觉。发生幻读的原因也是另外一个事务新增或者删除或者修改了第一个事务结果集里面的数据,同一个记录的数据内容被修改了,所有数据行的记录就变多或者变少了。

说一下 MySQL 常用的引擎?

InnoDB 引擎:mysql 5.1 后默认的数据库引擎,提供了对数据库 acid 事务的支持,并且还提供了行级锁和外键的约束,它的设计的目标就是处理大数据容量的数据库系统。MySQL 运行的时候,InnoDB 会在内存中建立缓冲池,用于缓冲数据和索引。但是该引擎是不支持全文搜索,同时启动也比较的慢,它是不会保存表的行数的,所以当进行 select count() from table 指令的时候,需要进行扫描全表。由于锁的粒度小,写操作是不会锁定全表的,所以在并发度较高的场景下使用会提升效率的。
MyIASM 引擎:不提供事务的支持,也不支持行级锁和外键。因此当执行插入和更新语句时,即执行写操作的时候需要锁定这个表,所以会导致效率会降低。不过和 InnoDB 不同的是,MyIASM 引擎是保存了表的行数,于是当进行 select count(
) from table 语句时,可以直接的读取已经保存的值而不需要进行扫描全表。所以,如果表的读操作远远多于写操作时,并且不需要事务的支持的,可以将 MyIASM 作为数据库引擎的首选。

关于联合索引

最左匹配:联合索引下a b c的where顺序无关,然后按最左组装起来,如果没有左部分,那么不能走索引。
回表:联合索引的数据部分叶子节点存储的是索引,然后回到原表去回表
联合索引下b>1是全表扫描,因为全表扫描速度快,走索引的方式需要回表很多次,速度不如全表。
覆盖索引:不用回表,所以联合字段中select b时,可以走索引
Orderby:索引失效,因为和全表扫描操作差不多

Mysql锁有哪些,如何理解

行锁,表锁,间隙锁,共享锁,排他锁,乐观锁,悲观锁。

行锁:锁整行数据
表锁:锁整个表
间隙锁:锁某个区间
共享锁:就是读锁,事务给某行数据加了共享锁时,其他事务不能写但能读
排它锁:就是写锁,其他事务不能读也不能写。
乐观锁:认定在没有发生冲突时不会冲突,使用版本号来保证
悲观锁:认定每次都可能会发生冲突,行锁和表锁这些都是悲观锁。

如何实现分库分表

垂直和水平拆分的方式。

如何解决拆分后的唯一主键问题?

在这里插入图片描述

全同步复制和半同步复制

全同步就是主从同步了才返回给客户端,但是性能会受到大影响,半同步是binlog写了就发送命令半同步了。

MVCC

多版本并发控制,使用trx-id来记录当前的事务,然后用roll-pointer来指向上一个版本的快照。通过快照的方式来保证隔离性。只在读已提交和可重复读的隔离级别上运作。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

源城编程哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值