单表优化:考虑使用ref(使用了非唯一索引),或range(使用了索引)
index 是遍历了索引后进行回表遍历
all 直接查全表
extra不要有using filesort(有第二次查询,一般伴随着order by),
和using where(表示需要进行回表操作)
using temporar (已经有表了,但不使用,需要再来一张表,一般伴随着group by)
记住要小表驱动大表
index 是遍历了索引后进行回表遍历
all 直接查全表
extra不要有using filesort(有第二次查询,一般伴随着order by),
和using where(表示需要进行回表操作)
using temporar (已经有表了,但不使用,需要再来一张表,一般伴随着group by)
记住要小表驱动大表
对于左连接一般给左表加索引,对于右外连接一般给右表加索引
using join buffer :使用了连接缓存
索引失效的场景
1,联合索引,跨列
2,在索引列上有函数操作,则索引失效
3,单表查询只会命中一个索引
in和exist的选择,主查询的数据集大,使用in
子查询的数据集大,使用exist
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
参数: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
都可以开启事务
来源:oschina
链接:https://my.oschina.net/u/3574106/blog/3213877