首页 > 编程知识 正文

oracle查询慢sql,mysql慢查询sql统计

时间:2023-05-04 00:40:55 阅读:127762 作者:3075

为什么会在生产环境中出现较慢的SQL? 慢SQL是一个比较严重的问题,在面试中也经常听到。 那么,在什么情况下会出现较慢的SQL,该如何进行故障排除,如何定位? 接下来,我会一步步带着这些问题的答案

如果存储器数据页与磁盘数据页不匹配,则照明脏页的脏页的定义将该存储器数据页称为脏页。

一个写入操作的SQL执行几种情况:写入日志、内存和同步磁盘

在写入过程中,InnoDB将记录写入重做日志并更新缓存。 更新操作到此完成。 后续的操作存储引擎将根据需要在buffer pool已满或重做日志已满时将操作日志同步到磁盘

因为写重做日志的过程是按顺序写磁盘的,所以按磁盘顺序写会减少查找等时间,比随机写快很多。 因此,像Kafka存储原理一样,写重做日志速度很快

在磁盘上,重做日志按顺序存储在两个文件中,大小恒定,并循环写入。 在高并发方案中,重做日志很快就满了,但数据与磁盘同步不及时,出现脏页,并阻止后续写入。 SQL的执行当然会变慢

锁定写入时SQL变慢的另一种情况是可能会遇到锁定。 如果SQL尝试修改的行被锁定,则只有在解除锁定后才能进行后续操作。

但是,另一个极端情况是遇到死锁或等待锁定的情况。 这个时候该怎么办?

Mysql提供了一种显示当前锁定情况的方法。

通过在命令行中执行图中的语句,可以查看当前正在执行的事务的情况

如果等待时间过长或发生死锁,则可以使用“多线程ID”解除当前事务的锁定。

此处的线程ID是表中的trx_mysql_thread_id参数。

读取操作定位慢SQL定位慢的SQL的常见方法是显示用于记录超过指定时间的SQL语句的慢速查询日志。 默认情况下处于禁用状态,可以通过手动配置来打开低速查询日志以定位。

临时打开的句子是

设置全局slow _ query _ log=“on”;

如果需要长期打开,则必须更改sql配置文件my.cnf

既然有理由知道如何查看运行缓慢的SQL,接下来我们来看一下读取操作时发生缓慢查询的原因

)1)不命中索引SQL查询慢的原因之一是可能不命中索引。 网上有很多关于使用索引可以加快查询速度的理由和使用时的注意事项,所以在此不做说明

)脏页的另一个问题是上述脏页的情况,但与写入操作不同,是在读取时打印脏页

为什么读取操作也会打印脏页? Innodb存储引擎通过将适当的数据页面和索引页面加载到内存的缓冲池(buffer pool )中来读取/读取磁盘,以避免每次读写数据时增加I/o开销然后,缓冲池中的缓存数据将根据最近使用的策略进行维护。

在中,如果要读取的数据页不在内存中,则必须向缓冲池申请数据页,但缓冲池中的数据页是固定的,当数据页达到上限时,必须从内存中丢弃最久不使用的数据页但是,如果脏页被废除,则需要将脏页刷到磁盘上才能重用,接下来就是刷脏页的操作。 因此,在高并发环境中,SQL可能会变慢。

排除慢SQL索引命中的方法通常是查看执行计划的方法。 方法也很简单,只要在要执行的SQL之前加上explain,就可以分析当前的SQL执行计划。 重要的几个字段包括type查询方法、possible_keys的可能索引、key的实际索引、rows搜索的行数、Extra的其他重要信息和主要信息

刷脏页时,必须控制脏页的比例,使其始终不接近75%。 它还控制重做日志的写入速度,并设置InnoDB_io_capacity参数以通知innodb磁盘的能力,从而避免脏页磁盘丢失块导致的低速SQL问题

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。