B-Tree和B+Tree区别
共同点;一个节点可以有多个元素, 排好序的
不同点:B+Tree叶子节点之间有指针,非叶子节点之间的数据都冗余了一份在叶子节点
B+Tree是B-Tree 的升级
mysql什么情况设置了索引,但无法使用
a.没符合最左原则
b.字段进行了隐式数据转化
c.走索引没有全表扫描效率高
索引的基本原理
把无序的数据变成有序的查询
a.把创建了索引的列的内容进行排序
b.把排序结果生成倒排表
c.在倒排表上拼上数据地址链
d.查询的时候先拿倒排表内容没在取数数据链,从而拿到具体数据
索引设计原则
a.适合索引的列出现在where中的列,或连表查询的指定列
b.基数较小的表,索引效果比较差,没必要建索引
c.辨识度不高的字段没必要
d.字节长度过大的字段没必要
sql慢查询优化
a.分析sql语句是否加载了额外的数据
b.explain 分析执行计划,修改语句修改索引
d.数据量是否太大,如果太大 横向,纵向分表
mysql如何分库分表,分库分表的方式和分片策略有哪些,分库分表后,sql语句执行流程
什么是分库分表:当表中的数据量过大,整个查询效率就会降低的非常明显。为了提升效率,就要将整个表的数据分散到多个数据库的多个表中
分库分表的策略:
垂直分片:
从业务和数据需求上,将不同的数据表分散到不同的数据库。能解决数据库文件过大的问题,但是从根本上解决不了数据大查询慢的问题。
水平分片:
将表的数据拆分放到不同的数据库和表中,可以解决数据量过大造成的查询效率过低的问题。
水平分片策略:
取余,取模:优点:数据平均,缺点:扩容非常麻烦
按照范围分片:比较好扩容,数据分布不均匀
按照时间分片:比较容易将热点数据区分出来
按枚举分片:例如按地区
多大数据量适合分库分表:数据超过500w或文件大于2G
分库分表常用组件:Mycat\ShardingSphere
分库分表后,SQL执行流程:
sql解析》查询优化》sql路由》sql改写》sql执行》结果归并
什么是脏读,幻读,不可重复读?要怎么处理
脏读:在事务进行过程中,读取到了其他事务未提交的数据。
不可重复读:在事务执行过程中,多次查询的数据不一致
幻读:在一个事务中,用同样的操作查询数据,得到的记录数不一致。
处理方式有很多种:加锁,事务隔离,mvcc
加锁:
脏读:在修改时加排它锁,直到事务提交才释放。读取时加共享锁,读完释放锁。
不可重复读:读书数据时,加共享锁,写数据时加排它锁。
幻读:加范围锁
事务的基本特性和隔离级别
基本特性:
原子性:指一个事务的操作要么全部成功,要么全部失败。
一致性:数据苦总是从一个一致性的状态转换到另一个一致性的状态。
隔离性:事务的修改在最终提交前,对其他事务是不可见的
持久性:一旦事务提交,所有的修改会永久保存到数据库中
隔离性的4个隔离级别:
读未提交 可能会读到其他事务未提交的数据,也叫脏读
读已提交 两次读取结果不一致,叫不可重复读
可重复读 mysql默认级别,就是每次读取结果一样,可能产生幻读
串行 一般不会使用,他会给每一行读取的数据加锁,会导致大量超时和锁竞争问题。
MYLKAM引擎和InnoDB的区别
MYLKAM有三个文件,表结构文件,索引文件,数据文件。叶子节点data值 指向数据文件对应行数据
InnoDB有两个文件 表结构文件, 索引和数据在一起的文件。叶子节点包含完整的数据
为什么InnoDB引擎必须有主键,并且推荐使用整型自增
默认会创建一个rowId。 不推荐使用uuid作为主键,不支持范围查询
B+数底层搜索的时候可能会发生值比较。
mysql优化
检查日志输出定位查询时间超过一定时间的sql
EXPLAN检查索引是否生效,全部扫描
EXPLAN使用
type:
all = 将全表扫描
index=全表扫描与All的区别,index只遍历索引树
rang=只检测给定的范围行,使用一个索引来选择行
ref = 使用普通索引
eq_ref = 将主间索引作为索引
最优:const,system 不需要优化