再学Mysql高级(学习笔记) 四 慢查询和锁

目录

 

一 排序优化

1.ORDER BY

2.FileSort

二 分组优化

三 慢查询分析

四  Show Profile

五  锁


一 排序优化

1.ORDER BY

建立索引 1 2 

(1)SELECT * FROM  WHERE  1>20 ORDER BY 1 ----------------产生Using index 

(2)SELECT * FROM WHERE 1> 20 ORDER BY 1 ,2 -----------------产生Using index 

(3)SELECT * FROM WEHRE 1>20 ORDER BY 2-----------产生Using index +Using filesort

(4)SELECT * FROM WHERE 1>20 ORDER BY 2 ,1 -----------产生 Using index + Using filesort

结论:尽可能在索引列上排序 ,依照最佳左前缀原则,在asc和desc中尽量选择相同

2.FileSort

filesort 满足两种排序算法   

双路排序:

Mysql4.1之前使用,扫描两次磁盘,最终得到数据,读取行指针和orderby列,对他们进行排序,然后对已经排序好的列表,重新读取

单路排序:

在磁盘读取所需要的所有列,然后按照orderby在buffer中对他们进行排序,然后扫描排序后输出,他的效率更快,少读一次  而且把随机IO变成了顺序IO,但是会用更多的空间,因为占用了内存

注:如果单路排序的方法一次超过了sort_buffer容器的大小  那么会造成多次IO读取 反而得不偿失 

提高orderby的速度:

  1.增大缓冲区: sort_buffer_size   max_length_for_sort_data

  2.查什么用什么,不用select *

二 分组优化

group by 实质上是先排序后分组,也遵照索引的最佳左前缀法则

WHERE 高于 HAVING  能写在WHERE 中的 尽量不要写在HAVING 中

三 慢查询分析

慢查询日志:是mysql提供的一种日志记录,用来记录mysql相应时间超过阈值(long_query_time)的语句

mysql默认不开启慢查询日志,如果不是调优需要的话,不建议开启这个参数(影响性能)

四  Show Profile

查询之后会选择一条sql完整的生命周期

show profile 

show profile cpu,block io for query 上一步前面问题的sql数字号码

当出现以下问题的时候需要关注优化:

converting HEAP to MyISAM 查询结果太大内存不够用了,开始使用磁盘空间了

Create tmp table 创建临时表, 之后要拷贝数据,然后还要删除 临时表非常的耗费时间

Copying to tmp table on disk 把内存中的临时表复制到磁盘,  非常危险

locked

五  锁

读锁(共享锁):针对同一份数据,多个读操作可以同时进行而不会相互影响

写锁(排他锁):当前写锁没有完成之前,会阻断其他写锁和读锁

表锁(偏读)     行锁(偏写)

读锁:

session1 给表1上锁    可读1    不可改1  不可读别人 

 session2 可读1  改1延迟(等session1释放) 可读别人

写锁:

session1 给表1上锁 可读1 可改1 不可读别人

session2 读1 阻塞  (如果查出来了是从缓存中查出来的)

总结:读锁可以阻塞写   写锁阻塞读写

varchar类型如果在修改时不加单引号 会导致行锁变成表锁  大大影响效率

间隙锁:

当我们用范围条件而不是相等条件检索数据,并请求读锁或者写锁时,InnoDB会给符合条件的已有数据的索引项加上锁,

对于键值在范围内但并不存在的j记录,叫做间隙.

发布了24 篇原创文章 · 获赞 10 · 访问量 3103

猜你喜欢

转载自blog.csdn.net/qq_43091847/article/details/86744411
今日推荐