mysql - 针对长时间运行的查询的 MySQL 配置调整
问题描述
我有一个运行大约需要 2 分钟的 SELECT 查询。它导致我们的应用程序挂在我们将其迁移到的新云数据库上。新的云数据库只有 3.5 GB 内存和 1 个 vCPU。
在我们的旧 VM DB 上,它只需要0.6
几秒钟,它有大约 16GB 的内存。
有时 SELECT 查询通常会导致 100% 的 CPU 使用率。当这个长时间运行的查询正在运行时,看起来其他查询没有被执行。
569 rows in set (1 min 52.23 sec)
有什么我可以配置来调整 my.cnf 以返回更好的结果,主要是为了防止应用程序挂起。这些是我现在唯一的设置。
open_files_limit = 102400
max_connections = 5000
innodb_flush_log_at_trx_commit = 0
innodb_thread_concurrency = 8
log_bin_trust_function_creators=1
innodb_buffer_pool_size=2800M
innodb_log_file_size=600M
innodb_rollback_on_timeout=ON
innodb_log_buffer_size=16M
它是一个返回朋友数量的查询。他们中的一些人可能有大约 600 个朋友,而获得该列表是导致问题的原因。我们目前无法更改查询,因为它已硬编码到应用程序中。但是查看查询似乎已优化。
解决方案
更新:必须重建索引并解决问题。导入转储后,我运行了命令mysqlcheck database_name -p --optimize
,然后问题就解决了。
查询现在运行良好,CPU 使用率下降,内存被消耗,查询缓存也正常工作。
推荐阅读
- php - Mysql SELECT函数在字段列表中返回未知列错误
- oracle - 触发器中忽略的 SQL 语句?
- android - 在另一个活动类中保留变量值
- javascript - Laravel 6 - @push 和 @stack
- json - 为什么我从 mongodb 的 json 中的某些字段的值全为零?
- android - @Path 作为可选参数?
- angular - Angular:FileReader - 来自阅读器的访问列表
- android - weight=1 和 android:layout_width="0dp" 使我的视图消失
- javascript - 当我重新启动我的 node.js Web 服务器时,我的调用堆栈会发生什么?
- c# - 执行一个可能有一些参数为空的查询