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