Navicat使用教程:MySQL 8性能架构如何帮助诊断查询死锁
Navicat Premium 是一套数据库管理工具,让你使用一个程序即可同時连接到 MySQL、MariaDB、SQL Server、SQLite、Oracle 和 PostgreSQL 数据库。
MySQL 5.5增加了performance_schema和information_schema数据库。正如前面文章内容,information_schema中的表包含有关表、插件、分区、进程列表、状态和全局变量的统计信息。顾名思义,Performance_schema的表可用于改善MySQL实例的性能。如何做到这一点将成为今天文章的主题。就像上次一样,我们将使用Navicat Premium演示各种查询。
简要概述
性能模式是一种用于在低级别监视MySQL服务器执行的工具。性能架构的存储引擎共享了“performance_schema”名称,以便于与其他存储引擎区分开。拥有自己的引擎使我们能够访问有关服务器执行的信息,同时对服务器性能的影响最小。此外,它使用视图或临时表,以最大程度地减少持久性磁盘存储。最后,内存分配全部在服务器启动时完成,因此没有进一步的内存重新分配或大小调整,这极大地简化了性能。
从MySQL 5.6.6起默认启用性能模式。在该版本之前,默认情况下处于禁用状态。您可以使用以下语句验证其状态:
如果需要,可以始终通过使用——performance-schema = ON标志启动服务器来显式启用它。
现在,我们来看看Performance_schema的一些实际应用。
互斥锁和线程速成班
互斥锁是代码中使用的一种同步机制,用于强制在给定时间只有一个线程可以访问某些公共资源。据说该资源已由互斥锁“保护”。“Mutex”一词是“互斥变量”的非正式缩写,它本身是“互斥”的缩写。在MySQL中,它是InnoDB用于表示和强制对内部内存数据结构进行互斥锁的低级对象。运作方式如下:
一旦获取了锁,就可以防止任何其他进程,线程等获取相同的锁。在InnoDB中,执行的多个线程访问共享的数据结构。InnoDB将这些访问与自己的互斥锁和读/写锁实现同步。当服务器中执行的两个线程(例如,同时执行查询的两个用户会话)需要访问相同的资源(例如文件、缓冲区或某些数据)时,这两个线程将相互竞争,因此获得互斥锁的第一个查询将导致另一个查询等待,直到第一个查询完成并解锁互斥锁。如果第一个线程需要很长时间才能完成,则它可能会阻止其他进程。
一些有用的查询
所有互斥锁都在“性能模式”的Mutex_instances表中列出,这对于调查性能瓶颈非常有帮助。Mutex_instances.LOCKED_BY_THREAD_ID和rwlock_instances.WRITE_LOCKED_BY_THREAD_ID列对于调查性能瓶颈或死锁非常重要。使用方法如下:
假设线程1处于等待互斥的状态。
您可以确定线程正在等待什么:
如果查询结果标识线程正在等待互斥锁A,可在events_waits_current.OBJECT_INSTANCE_BEGIN中找到。
您可以确定哪个线程持有互斥锁A:
假设查询结果表明它是持有互斥锁A的线程2,如在Mutex_instances.LOCKED_BY_THREAD_ID中找到的那样。
您可以使用此查询查看线程2在做什么:
结论
在今天的文章中,我们学习了如何使用性能模式来诊断MySQL 8中的瓶颈和/或死锁。一种更简单的方法是使用Navicat Monitor。它具有一个查询分析器,该分析器显示所有正在执行的查询的摘要信息,并让您轻松检测死锁,例如当两个或多个查询永久相互阻塞时。
相关内容推荐:
想要购买该产品正版授权,或了解更多产品信息请点击