11.4、数据库性能指标
数据库性能指标
欢迎回到第 11 章的学习。在上一节,我们学习了数据库连接池监控。现在我们要学习数据库性能指标,这是数据库性能分析的重要基础。
本节将学习:查询执行时间、事务处理时间、锁等待时间、以及数据库资源使用。
查询执行时间
查询执行时间的作用是什么? 衡量数据库查询性能,识别慢查询,优化查询性能。
查询执行时间包括哪些呢?
第一个:平均执行时间。 查询的平均执行时间。
第二个:最大执行时间。 查询的最大执行时间。
第三个:P95/P99 执行时间。 查询的百分位数执行时间。
第四个:执行时间分布。 查询执行时间的分布情况。
如何收集查询执行时间? OpenTelemetry 会自动收集查询执行时间,记录在 Span 的 duration 属性中。
查询执行时间分析:
# Prometheus 查询:平均查询执行时间 avg(db_query_duration_seconds{db_system="mysql"}) # P95 查询执行时间 histogram_quantile(0.95, db_query_duration_seconds_bucket{db_system="mysql"}) # P99 查询执行时间 histogram_quantile(0.99, db_query_duration_seconds_bucket{db_system="mysql"}) # 慢查询数量(> 100ms) sum(db_query_duration_seconds{db_system="mysql"} > 0.1)
事务处理时间
事务处理时间的作用是什么? 衡量数据库事务性能,识别慢事务,优化事务逻辑。
事务处理时间包括哪些呢?
第一个:事务开始时间。 事务开始的时间戳。
第二个:事务提交时间。 事务提交的时间戳。
第三个:事务回滚时间。 事务回滚的时间戳。
第四个:事务总时长。 从开始到提交或回滚的总时间。
事务处理时间追踪:
@Service @Transactional public class OrderService { public Order createOrder(OrderRequest request) { // OpenTelemetry Transactions are automatically tracked // Business begins Order order = new Order(); // ... Business logic orderRepository.save(order); // Submission of affairs return order; } }
锁等待时间
锁等待时间的作用是什么? 衡量数据库锁竞争情况,识别锁等待问题,优化并发性能。
锁等待时间包括哪些呢?
第一个:获取锁等待时间。 等待获取锁的时间。
第二个:锁持有时间。 持有锁的时间。
第三个:锁等待次数。 等待锁的次数。
第四个:死锁检测。 检测死锁情况。
如何收集锁等待时间? 通过数据库监控工具或 OpenTelemetry 自定义指标收集锁等待时间。
MySQL 锁等待查询:
-- Check the current lock waiting status SELECT r.trx_id waiting_trx_id, r.trx_mysql_thread_id waiting_thread, r.trx_query waiting_query, b.trx_id blocking_trx_id, b.trx_mysql_thread_id blocking_thread, b.trx_query blocking_query, TIMESTAMPDIFF(SECOND, r.trx_wait_started, NOW()) wait_time FROM information_schema.innodb_lock_waits w INNER JOIN information_schema.innodb_trx b ON b.trx_id = w.blocking_trx_id INNER JOIN information_schema.innodb_trx r ON r.trx_id = w.requesting_trx_id;
数据库资源使用
数据库资源使用的作用是什么? 监控数据库服务器的资源使用情况,识别资源瓶颈,规划容量扩展。
数据库资源使用包括哪些呢?
第一个:CPU 使用率。 数据库服务器的 CPU 使用率。
第二个:内存使用率。 数据库服务器的内存使用率。
第三个:磁盘 I/O。 数据库的磁盘读写性能。
第四个:网络流量。 数据库的网络传输量。
如何收集资源使用指标? 使用 Node Exporter 或数据库监控工具收集资源使用指标。
资源使用指标收集:
# CPU 使用率 100 - (avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) # 内存使用率 100 * (1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) # 磁盘 I/O rate(node_disk_io_time_seconds_total[5m]) # 网络流量 rate(node_network_receive_bytes_total[5m]) rate(node_network_transmit_bytes_total[5m])
本节小结
在本节中,我们学习了数据库性能指标:
第一个是查询执行时间。 衡量数据库查询性能,识别慢查询,优化查询性能。
第二个是事务处理时间。 衡量数据库事务性能,识别慢事务,优化事务逻辑。
第三个是锁等待时间。 衡量数据库锁竞争情况,识别锁等待问题,优化并发性能。
第四个是数据库资源使用。 监控数据库服务器的资源使用情况,识别资源瓶颈,规划容量扩展。
数据库性能指标收集流程: 收集性能指标 → 分析指标数据 → 识别性能问题 → 优化数据库性能 → 提升应用性能。
这就是数据库性能指标。通过数据库性能指标,我们可以全面了解数据库的性能表现和资源使用情况。
在下一节,我们将学习数据库 Dashboard 设计。学习如何设计数据库监控 Dashboard。