mysql的一些知识点

编程

单表优化:考虑使用ref(使用了非唯一索引),或range(使用了索引)


index 是遍历了索引后进行回表遍历


all 直接查全表


extra不要有using filesort(有第二次查询,一般伴随着order by),


和using where(表示需要进行回表操作)


using temporar (已经有表了,但不使用,需要再来一张表,一般伴随着group by)


记住要小表驱动大表

对于左连接一般给左表加索引,对于右外连接一般给右表加索引


using join buffer :使用了连接缓存


索引失效的场景


1,联合索引,跨列 


2,在索引列上有函数操作,则索引失效


3,单表查询只会命中一个索引


in和exist的选择,主查询的数据集大,使用in


子查询的数据集大,使用exist


 

using filesort 有两种算法(根据io的次数)

双路排序,第一次扫描排序字段,然后进行排序(在buffer中进行);第二次扫描其他字段(比较消耗性能)

单路排序,一次扫描,然后在buffer中进行排序,不一定是一次io,可能有多次

因为数据量很大的情况,无法一次全部加载到buffer中

如果数据量很打可以调大buffer的大小

如果buffer,太小,则自动将单路切换成双路 


参数:max_length_for_sort_data



慢查询会默认会记录超过10的sql



查看慢sql


show global status like "%slow_queries%"


mysqldumpshow工具查看慢sql

 

 

mysql的锁
锁的分类
1,读锁
2,写锁

操作范围
1,表锁 mysima 开销小,加锁快,并发度低,不会出现死锁
2,行锁(只能在命中索引的情况下使用行锁)开销大,加锁慢,并发度高,会出现死锁
3,页锁
 

加了读锁:lock table a read;

1,该会话只能对a表进行读操作,不能写a表,不能读写其他表,

2,其他会话可以读a表,但不能写a表,可以读写其他表

解锁

unlock tables ;

加写锁:lock table a write;

1,该会话可以对a表进行crud操作,但不能对其他表进行读写操作

2,其他会话不可以读写a表,可以读写其他表

mysql和oracle 的对比

查看哪些表被锁

show open tables;

查看表锁定的严重程度
show status like "table%"

Table_locks_immediate:表示能立刻获取到锁

Table_locks_waited:表被加锁的次数

Table_locks_immediate/Table_locks_waited > 5000 建议使用innodb,否则使用myisam

 

行锁

事务a对一行就行的dml操作(关闭了自动提交),则其他事务必须等待事务a完成后,才能操作

表锁是通过lock表实现的,但行锁是通过事务解锁

间隙锁

如果会话1设置不自动提交事务。在开启事务后,对范围值进行更新。会锁住间隙值。看的是范围,不是实际的值

关闭自动提交

set autocommit =0

start transaction

begin

都可以开启事务

以上是 mysql的一些知识点 的全部内容, 来源链接: utcz.com/z/514889.html

回到顶部