2、mysql
2、mysql
2.1、八股文
如何定位慢查询
执行时间比较长的sql语句
sql执行慢,如何分析
索引结构
B树
B+树
回表查询
覆盖索引
优化超大分页也叫深度分页
索引创建原则
-- 前缀索引
ALTER TABLE table_name ADD KEY(column_name(prefix_length));
索引失效的情况
假设目前索引有(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不会失效
sql优化的经验
表的设计优化
索引优化
SQL语句优化
主从赋值、读写分离
分库分表
表的设计优化
索引优化
参考
索引的创建原则
、避免索引的失效情况
SQL语句优化
主从赋值、读写分离
分库分表
一张表的数据大于500w的时就要考虑分库分表了
事务的特性是什么
[事务是什么?] 事务是一组操作的集合,他是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败
事务的特性:ACID
原子性(Atomicity)[饿塔姆谁题]:事务是不可分割的最小操作单元,
要么全部成功,要么全部失败
一致性(Consistency)[肯谁是疼谁]:事务完成时,
必须使所有的数据都保持一致状态
隔离性(Isolation)[爱搜雷声]:数据库系统提供的隔离机制,保证事务
在不受外部并发操作影响的独立环境下运行
持久性(Durability)[九儿贝类体]:事务一旦提交或者回滚,
它对数据库中的数据的改变就是永久的
事务的并发带来什么问题
从上到下,下面问题是在解决上面出现的问题的基础上出现的。
脏读
(侧重读取到其他事务修改未提交的数据)
在一个事务A中,修改了某个数据,但是还未提交数据,就被事务B读取到修改后的数据。
不可重复度
(侧重同一事务先后读同一条数据不同)
基于解决了脏读的基础上出现的问题,其他事务未提交的数据不能被读到
在同一个事务A中,先后查同一条记录,读到的数据不同,因为在第一次和第二次读的中间被事务B给修改了并且提交了事务。
幻读
(侧重原来查询这个数据不存在,然后数据插入,结果报错说存在,然后再查还是一样的不存在,出现幻觉一样)
基于解决了不可重复度的基础上出现的问题,同一个事务中俩次读的数据是一样的
一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已存在了,好些出现幻觉一样。
如何解决事务的并发问题
串行化效率太低,直接阻止了并发事务,一个一个的事务执行。
未提交读的隔离级别
什么都解决不了
undo log 和 redo log 的区别
redo log 【``重做日志
】->【
实现事务的持久性`】 (记录物理日志)当数据写入到buffer pool中时,就会同步的记录在redo log buffer中,当redo log buffer发生变化时就会同步的写入redo log file
ps:如果buffer pool 正常频率刷盘成功,就会定期删除redo log file。
undo log【
回滚日志
】->【实现事务的一致性和原子性
】(记录逻辑日志)记录相反的操作记录
事务的隔离性如何保证
①锁:排他锁(如果一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁)
②mvcc:多版本并发控制
解释下mvcc
全程 Multi-Version Concurrency Control 【妈提-卫生 看卡润特 看臭】,多版本并发控制。指维护一个数据的多个版本,使得读写操作没有冲突
MVCC的具体实现,主要依赖于数据库记录中的
隐藏字段
、undo log日志
、readView
隐藏字段
undo log
补充下undo log知识
readView
RC(读提交的隔离级别)情况下的readView是读那个undo log的数据
①到④的公式中,只要任意满意一个就可以
RR(可重复读的隔离级别)
总结回复
主从同步的原理
binlog 是MySql的日志,redolog和undolog是innoDB的日志
回答总结
分库分表
大概了解
详细了解
垂直拆分:拆分业务【类似于微服务一样】
ps:垂直拆分会改造结构
水平拆分:分散存储数据【类似于redis的分片集群,redis的hash槽】
ps:水平拆分不会改造结构
会遇到的问题
采用中间件解决