当前位置:首页 > 数码 > 一次简单的行查询为何耗时百毫秒的背后原因-MySQL (一次简单的行动作文)

一次简单的行查询为何耗时百毫秒的背后原因-MySQL (一次简单的行动作文)

admin11个月前 (04-28)数码135

简介

在使用 MySQL 时,您可能遇到过查询响应时间异常长的情况,甚至长达数百毫秒或几秒钟。本文将探讨导致这种情况的原因,并提供解决方法。

SQL 数据结构

本文使用以下 SQL 数据结构进行说明: ```sql CREATE TABLE `t` (`id` int(11) NOT NULL, `c` int(11) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB; delimiter ;; create procedure idata() begin declare i int; set i = 1; while (i <= 100000) do insert into tvalues (i, i); set i = i + 1; endwhile; end;; delimiter; callidata(); ```

查询长时间不返回

1.1 等待 MDL 锁

当查询长时间不返回时,可能是被 MDL 锁阻塞。例如: ```sql select from t where id = 1; ``` 您可以使用 `showprocesslist` 命令查看当前语句的状态: ![等待 MDL 锁](./waiting-for-table-metadata-lock.png) 此状态表明有一个线程正在表 `t` 上请求或持有 MDL 写锁,从而阻塞了 `SELECT` 语句。 在 MySQL 8.0 中,可以使用三个客户端连接来重现此问题: 客户端 A:`select sleep(1) from t` 客户端 B:`alter table t add f int` 客户端 C:`select c from t order by rand() limit 3` MySQL

1.2 等待刷新

如果您执行以下语句并出现卡顿: ```sql select frominformation_schema.processlist where id = 1; ``` 请注意 `STATE` 字段显示为 `Waiting for table flush`。这意味着数据不在内存中,MySQL 正在从磁盘读取数据并将其加载到 buffer pool 中。如果 buffer pool 已满,它将使用 LRU 淘汰掉旧数据。如果要淘汰的数据是脏页,则会触发刷新,导致卡顿。

解决方案

处理 MDL 锁等待

找到持有 MDL 写锁的进程并将其终止。使用 `sys.schema_table_lock_waits` 表可以找出阻塞进程的 processid,然后使用 `kill` 命令中断该连接。

处理刷新等待

使用 `flush tables with read lock` 命令关闭所有已打开的表对象,同时清空查询缓存中的结果。此命令会等待所有正在运行的 SQL 请求完成。

其他原因

导致查询响应时间异常长的其他原因包括: 索引性能不佳 表数据量过大 服务器负载过高 网络延迟

总结

通过了解导致查询响应时间异常长的原因,您可以采取适当的措施来解决问题。这些措施包括识别并解决 MDL 锁等待、减少刷新操作、优化索引和服务器性能。通过遵循本文中的建议,您可以显着改善 MySQL 数据库的查询响应时间。

mysql 数据几十万时加时间排序导致查询速度慢的原因

实测41w数据100条分页查询,如果不加order by 时间都是毫秒级,一旦加了时间排序结果至少1.5s以上,只需要给时间字段添加索引,查询速度瞬间回归毫秒级

mysql+springboot+jpa查询几十万条数据很慢 如何解决?

mysql支持几十万的数据,响应速度应该是毫秒级的。

看了下你的语句,不要用IN了,改INNER JOIN吧,套那么多层IN,肯定没效率。

免责声明:本文转载或采集自网络,版权归原作者所有。本网站刊发此文旨在传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及版权、内容等问题,请联系本网,我们将在第一时间删除。同时,本网站不对所刊发内容的准确性、真实性、完整性、及时性、原创性等进行保证,请读者仅作参考,并请自行核实相关内容。对于因使用或依赖本文内容所产生的任何直接或间接损失,本网站不承担任何责任。

标签: MySQL

“一次简单的行查询为何耗时百毫秒的背后原因-MySQL (一次简单的行动作文)” 的相关文章

实战-MySQL-数据库压力测试与性能评估方法-Java (实战篮球鞋排名)

实战-MySQL-数据库压力测试与性能评估方法-Java (实战篮球鞋排名)

压力测试的目的和重要性 压力测试是模拟真实环境中并发用户访问数据库的场景,通过增加负载来测试数据库系统的性能表现。压力测试的目的是发现数据库在高负载下的性能瓶颈、资源利用情况和响应时间等指...

核心模块-深入探索数据库引擎-MySQL-揭秘 (核心模块英文)

核心模块-深入探索数据库引擎-MySQL-揭秘 (核心模块英文)

简介 Savepoint 是 MySQL 中的一种机制,允许在事务中创建标记点,以便在事务失败时回滚到该标记点。Savepoint 的原理是将事务的当前状态存储在各种数据结构中,包括服务器层、b...

使用-数据库并自动发送备份文件到指定邮箱-K8s-定期备份-MySQL (使用数据库的命令)

使用-数据库并自动发送备份文件到指定邮箱-K8s-定期备份-MySQL (使用数据库的命令)

简介 本文档描述了一个使用脚本来监控服务器高占用率进程并通过电子邮件发送警报的项目。本文还探讨了使用相同机制备份数据库的可能性。 技术 Python psuti...

обеспечение-и-данных-MySQL锁机制-предотвращение-конфликтов-согласованности (翻译)

обеспечение-и-данных-MySQL锁机制-предотвращение-конфликтов-согласованности (翻译)

锁机制是一种通过对数据进行加锁来防止数据冲突和不一致的技术。MySQL 采用了两种类型的锁:共享锁和排他锁,以实现并发访问数据的同时保证数据的一致性。 共享锁 (SharedLock)...

EXPLAIN-代价模型-MySQL-浅析-提早预知索引优化战略-优化查问性能-告别自觉经常使用 (explain)

EXPLAIN-代价模型-MySQL-浅析-提早预知索引优化战略-优化查问性能-告别自觉经常使用 (explain)

背景 在中,当咱们为表创立了一个或多个索引后,通常须要在索引定义成功后,依据详细的数据状况口头EXPLN命令,才干观察到数据库实践经常使用哪个索引、能否经常使用索引。这使得咱们在参与新索引之...

MySQL-实现非中断亿级数据处理的秘密 (mysql-bin文件可以删除吗)

MySQL-实现非中断亿级数据处理的秘密 (mysql-bin文件可以删除吗)

MySQL 在海量数据管理方面表现得非常出色,能够存储上亿级别的数据,同时还具有极高的数据可靠性,几乎不会发生数据丢失的情况。这一强大的特性离不开 MySQL 的两大日志系统:binlog 和 r...

揭秘MySQL中Varchar和Int的隐式转换 (揭秘国安部点名的间谍机构)

揭秘MySQL中Varchar和Int的隐式转换 (揭秘国安部点名的间谍机构)

前言 在一次例行测试中,我们遇到了一个奇特的现象。一条查询库存数量的SQL语句,居然返回了0条记录。当我们手工执行SQL时,却查询到了一条记录。调查发现,原因在于MySQL的优化器在判断数据类型...

揭开其背后的神奇世界-深入探寻-索引的底层逻辑-MySQL (揭开其背后的真相)

揭开其背后的神奇世界-深入探寻-索引的底层逻辑-MySQL (揭开其背后的真相)

什么是索引? 索引是数据库系统中一种特殊的数据结构,用于快速查找数据。索引以某种方式引用(指向)数据,允许在索引上实现高级查找算法,从而提高查询速度。 索引的种类 最常见的索引类型有:...