2、mysql

2、mysql

2.1、八股文

如何定位慢查询

执行时间比较长的sql语句

image-20230913045658877

image-20230913045833287

sql执行慢,如何分析

image-20230913052912755

image-20230913052713353

image-20230913052632732

索引结构

B树

image-20231011022524634

B+树

image-20230913054646157

image-20230913055148478

回表查询

image-20230913175326395

image-20230913175301706

覆盖索引

image-20230913175919451

image-20230913180240566

优化超大分页也叫深度分页

image-20230913182440460

索引创建原则

-- 前缀索引
ALTER TABLE table_name ADD KEY(column_name(prefix_length));

image-20230913190546550

索引失效的情况

假设目前索引有(name、status、address)

①例子: where status = '1' and address = '北京市';无name,所以失效

②例子:where name = '小米科技' and status > '1' and address = '北京市'; address的所以会失效,所以当前的索引长度只是name和status的长度。

③例子:where substring(name,3,2) = '科技'; 索引会失效

④例子:where name = '小米科技' and status = 1; status的索引会失效,只有name的索引长度。因为status涉及到了字符串的类型转换。

⑤例子:where name like '%黑马';name会失效 where name like '黑马%';name不会失效

image-20231011031555038

sql优化的经验

表的设计优化

索引优化

SQL语句优化

主从赋值、读写分离

分库分表

表的设计优化

image-20231011033214634

索引优化

参考索引的创建原则避免索引的失效情况

SQL语句优化

image-20231011033223591

主从赋值、读写分离

image-20231011033315457

分库分表

一张表的数据大于500w的时就要考虑分库分表了

事务的特性是什么

[事务是什么?] 事务是一组操作的集合,他是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败

事务的特性:ACID

原子性(Atomicity)[饿塔姆谁题]:事务是不可分割的最小操作单元,要么全部成功,要么全部失败

一致性(Consistency)[肯谁是疼谁]:事务完成时,必须使所有的数据都保持一致状态

隔离性(Isolation)[爱搜雷声]:数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行

持久性(Durability)[九儿贝类体]:事务一旦提交或者回滚,它对数据库中的数据的改变就是永久的

image-20231011034058691

事务的并发带来什么问题

从上到下,下面问题是在解决上面出现的问题的基础上出现的。

image-20231011040043442

脏读

(侧重读取到其他事务修改未提交的数据)

在一个事务A中,修改了某个数据,但是还未提交数据,就被事务B读取到修改后的数据。

image-20231011040101178

不可重复度

(侧重同一事务先后读同一条数据不同)基于解决了脏读的基础上出现的问题,其他事务未提交的数据不能被读到

在同一个事务A中,先后查同一条记录,读到的数据不同,因为在第一次和第二次读的中间被事务B给修改了并且提交了事务。

image-20231011040254280

幻读

(侧重原来查询这个数据不存在,然后数据插入,结果报错说存在,然后再查还是一样的不存在,出现幻觉一样)基于解决了不可重复度的基础上出现的问题,同一个事务中俩次读的数据是一样的

一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已存在了,好些出现幻觉一样。

image-20231011040809486

如何解决事务的并发问题

串行化效率太低,直接阻止了并发事务,一个一个的事务执行。

未提交读的隔离级别 什么都解决不了

image-20231011041333143

undo log 和 redo log 的区别

image-20231011050206493

redo log 【``重做日志】->【实现事务的持久性`】 (记录物理日志)

当数据写入到buffer pool中时,就会同步的记录在redo log buffer中,当redo log buffer发生变化时就会同步的写入redo log file

ps:如果buffer pool 正常频率刷盘成功,就会定期删除redo log file。

image-20231011045803631

undo log【回滚日志】->【实现事务的一致性和原子性】(记录逻辑日志)

记录相反的操作记录

image-20231011050603513

image-20231011052247714

事务的隔离性如何保证

①锁:排他锁(如果一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁)

②mvcc:多版本并发控制

解释下mvcc

全程 Multi-Version Concurrency Control 【妈提-卫生 看卡润特 看臭】,多版本并发控制。指维护一个数据的多个版本,使得读写操作没有冲突

MVCC的具体实现,主要依赖于数据库记录中的隐藏字段undo log日志readView

隐藏字段

image-20231011052128251

undo log

补充下undo log知识

image-20231011052700122

readView

image-20231011053303655

image-20231011053854593

RC(读提交的隔离级别)情况下的readView是读那个undo log的数据

①到④的公式中,只要任意满意一个就可以

image-20231011054615601

RR(可重复读的隔离级别)

image-20231011054826569

总结回复

image-20231011055054880

主从同步的原理

binlog 是MySql的日志,redolog和undolog是innoDB的日志

image-20231011060942783

回答总结

image-20231011061119733

分库分表

大概了解

image-20231011061444875

详细了解

image-20231011084904461

垂直拆分:拆分业务【类似于微服务一样】

ps:垂直拆分会改造结构

image-20231011090415749

image-20231011090556465

水平拆分:分散存储数据【类似于redis的分片集群,redis的hash槽】

ps:水平拆分不会改造结构

image-20231011091929790

image-20231011092208258

会遇到的问题

采用中间件解决

image-20231011092401807

总结回复

image-20231011092613957


2、mysql
http://101.126.22.188:9090//2024/06/30/1697308692270
作者
不是王总
发布于
2024年06月30日
更新于
2024年06月30日
许可协议