mysql知识
2021-02-23 14:01:23 1 举报
AI智能生成
面试神器
作者其他创作
大纲/内容
explan描述
表的读取顺序
数据读取操作的操作类型
哪些索引可以使用
哪些表索引被实际使用
表之间的引用
每张表有多少行被优化器查询
explan详解
id
id相同,执行的顺序由上而下
id不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行
id相同和不同时,同时存在;相同的可以认为是一组,从上往下顺序执行,在所有组中,id值越大,优先级越高
slect_type
主要用来区分分辨查询的类型,是普通的查询还是联合查询还是子查询
table
对应正在访问哪个表,表名或者别名,可能是临时表或者union合并结果集
partitions
匹配的分区
possible_keys
显示可能应用在这张表中得索引,一个或多个
key
实际用到得索引
key_len
索引长度
Extra
表示额外的信息。此字段能够给出让我们深入理解执行计划进一步的细节信息
type
需要重点关注的一个字段信息,表示查询使用了哪种类型,在 SQL优化中是一个非常重要的指标,依次从优到差分别是:system > const > eq_ref > ref > range > index > ALL
索引操作
ANALYZE TABLE---语句分析并存储表中索引的分布情况
强制使用索引(应急)
force index
子主题
存储引擎
innerdb(默认)
支持聚簇索引,支持事务,支持表锁,支持行锁,支持外键,5.6版本后支持全文索引
支持支持大量insert,delete,update
myisam
非聚簇索引,支持表锁,支持全文索引
适合大量select查询
原子性,持久性如何保证
A-原子性
undo log
一个事务中所有的操作要么全部成功提交,要么全部失败回滚,这就是事务的原子性
undo log称之为回滚日志,每条数据的变化(insert/update/delete)都会产生一条记录,并且日志持久化到磁盘,undo log用来记录数据修改前的信息
C-持久性
redo log
mysql为了提升性能不会把每次的修改都实时同步到磁盘中,而是先存到缓存中,然后再使用线程去做缓冲池和磁盘中的同步
这样必然会存在问题,假如电脑突然停电,那么没有持久化到磁盘的信息必然会丢失
redo log叫重做日志,当事务提交的时候会把所有的修改信息存放在redo log中,并且会把redo log持久化到磁盘,当电脑重启后就会重新执行redo log的修改信息来恢复数据,这样就能够达到持久化的目的
I-隔离性
Read Uncommitted(读取未提交内容)
脏读,不可重复读,幻读
Read Committed(读取提交内容)
不可重复读,幻读
脏读
读取到另外的事务未提交的数据
不可重复读
一个事务内读取到2种不同的数据
幻读
在同一个事务查询不到其他事务提交新增的数据,但是自己插入相同id时缺报主键冲突
Repeatable Read(可重读)
幻读
Serializable(可串行化)
D-一致性
通过持久性+隔离性+原子性
脏读
能读取到未提交commit的数据
二叉树,红黑树
无论是二叉树还是红黑树,都会因为树的深度过深而造成io次数变多,影响数据读取的效率
子主题
索引
普通索引
适合读多写少的情况下
changBuffer
可以把一些写操作缓存下来,在我们读的时候进行一个merge的操作,可以提高效率
B树,B+树
B+树
B+树只有叶节点存放数据,其余节点用来索引
就决定了B+树更适合用来存储外部数据,也就是所谓的磁盘数据
B+树上有2个头指针,一个指向根节点,另一个指向关键字最小的叶子节点。而且所有的叶子节点之间是链式结构
因此,一种是对主键和分页查找,一种是从根节点开始进行随机查找
B
而B-树是每个索引节点都会有Data域
mgodb
为什么不用B+树,因为他不是关系型数据库
innodb主键索引
操作系统:1页=4kb
innodb 默认1页=16kb
a,b,c 三个联合索引,根据最左查询。所以a是有效索引
覆盖索引
回表的数据包含在联合主键中
聚簇索引
就是把索引和数据放到B+树中
回表
在B+树只存了主键,但是需要查询的数据超过主键数据,所以还要根据id去查数据
索引下推
主要是优化回表效率
索引失效
sql问题
like 以%开头,索引无效
or语句前后没有同时使用索引。当or左右查询字段只有一个是索引,该索引失效
组合索引,不是使用第一列索引,索引失效
数据类型出现隐式转化。如varchar不加单引号的话可能会自动转换为int型,使索引无效,产生全表扫描
在索引列上使用 IS NULL 或 IS NOT NULL操作。索引是不索引空值的,所以这样的操作不能使用索引
对索引字段进行计算操作、字段上使用函数
当全表扫描速度比索引速度快时,mysql会使用全表扫描,此时索引失效
0 条评论
下一页