Forecast MySQL IOPS

This technical guide offers a comprehensive approach to forecasting MySQL Input/Output Operations Per Second (IOPS) using Performance Schema metrics. Since understanding and accurately predicting IOPS is crucial for database performance optimization, capacity planning, and maintaining service level agreements (SLAs) in production environments, this guide becomes indispensable.

The methodology outlined below enables database administrators and system engineers to gather detailed I/O statistics across various MySQL subsystems, therefore facilitating data-driven decisions for storage provisioning and performance tuning. By leveraging Performance Schema capabilities, this solution provides real-time insights into database I/O patterns without requiring external monitoring tools.

To forecast MySQL IOPS using Performance Schema metrics, the following SQL query extracts key I/O operation statistics across critical file types. Note that this query assumes Performance Schema is enabled and properly configured.

SELECT     /* InnoDB Data File Operations */
    SUM(IF(EVENT_NAME = 'wait/io/file/innodb/innodb_data_file', COUNT_READ, 0))          AS innodb_data_read_ops,
    SUM(IF(EVENT_NAME = 'wait/io/file/innodb/innodb_data_file', COUNT_WRITE, 0))          AS innodb_data_write_ops,
    SUM(IF(EVENT_NAME = 'wait/io/file/innodb/innodb_data_file', SUM_TIMER_READ, 0))          AS innodb_data_read_latency,
    SUM(IF(EVENT_NAME = 'wait/io/file/innodb/innodb_data_file', SUM_TIMER_WRITE, 0))          AS innodb_data_write_latency,
    SUM(IF(EVENT_NAME = 'wait/io/file/innodb/innodb_data_file', SUM_NUMBER_OF_BYTES_READ, 0))          AS innodb_data_read_bytes,
    SUM(IF(EVENT_NAME = 'wait/io/file/innodb/innodb_data_file', SUM_NUMBER_OF_BYTES_WRITE, 0))          AS innodb_data_write_bytes,

    /* Redo Log Operations */
    SUM(IF(EVENT_NAME = 'wait/io/file/innodb/innodb_log_file', COUNT_READ, 0))          AS redo_log_read_ops,
    SUM(IF(EVENT_NAME = 'wait/io/file/innodb/innodb_log_file', COUNT_WRITE, 0))          AS redo_log_write_ops,
    SUM(IF(EVENT_NAME = 'wait/io/file/innodb/innodb_log_file', SUM_TIMER_READ, 0))          AS redo_log_read_latency,
    SUM(IF(EVENT_NAME = 'wait/io/file/innodb/innodb_log_file', SUM_TIMER_WRITE, 0))          AS redo_log_write_latency,
    SUM(IF(EVENT_NAME = 'wait/io/file/innodb/innodb_log_file', SUM_NUMBER_OF_BYTES_READ, 0))          AS redo_log_read_bytes,
    SUM(IF(EVENT_NAME = 'wait/io/file/innodb/innodb_log_file', SUM_NUMBER_OF_BYTES_WRITE, 0))          AS redo_log_write_bytes,

    /* Binary Log Operations */
    SUM(IF(EVENT_NAME = 'wait/io/file/sql/binlog', COUNT_READ, 0))          AS binlog_read_ops,
    SUM(IF(EVENT_NAME = 'wait/io/file/sql/binlog', COUNT_WRITE, 0))          AS binlog_write_ops,
    SUM(IF(EVENT_NAME = 'wait/io/file/sql/binlog', SUM_TIMER_READ, 0))          AS binlog_read_latency,
    SUM(IF(EVENT_NAME = 'wait/io/file/sql/binlog', SUM_TIMER_WRITE, 0))          AS binlog_write_latency,
    SUM(IF(EVENT_NAME = 'wait/io/file/sql/binlog', SUM_NUMBER_OF_BYTES_READ, 0))          AS binlog_read_bytes,
    SUM(IF(EVENT_NAME = 'wait/io/file/sql/binlog', SUM_NUMBER_OF_BYTES_WRITE, 0))          AS binlog_write_bytes,

    /* Temporary File Operations */
    SUM(IF(EVENT_NAME = 'wait/io/file/sql/io_cache', COUNT_READ, 0))          AS tempfile_read_ops,
    SUM(IF(EVENT_NAME = 'wait/io/file/sql/io_cache', COUNT_WRITE, 0))          AS tempfile_write_ops,
    SUM(IF(EVENT_NAME = 'wait/io/file/sql/io_cache', SUM_TIMER_READ, 0))          AS tempfile_read_latency,
    SUM(IF(EVENT_NAME = 'wait/io/file/sql/io_cache', SUM_TIMER_WRITE, 0))          AS tempfile_write_latency,
    SUM(IF(EVENT_NAME = 'wait/io/file/sql/io_cache', SUM_NUMBER_OF_BYTES_READ, 0))          AS tempfile_read_bytes,
    SUM(IF(EVENT_NAME = 'wait/io/file/sql/io_cache', SUM_NUMBER_OF_BYTES_WRITE, 0))          AS tempfile_write_bytes,

    /* Metadata File Operations */
    SUM(IF(EVENT_NAME = 'wait/io/file/sql/FRM', COUNT_READ, 0))          AS metadata_read_ops,
    SUM(IF(EVENT_NAME = 'wait/io/file/sql/FRM', COUNT_WRITE, 0))          AS metadata_write_ops,
    SUM(IF(EVENT_NAME = 'wait/io/file/sql/FRM', SUM_TIMER_READ, 0))          AS metadata_read_latency,
    SUM(IF(EVENT_NAME = 'wait/io/file/sql/FRM', SUM_TIMER_WRITE, 0))          AS metadata_write_latency,
    SUM(IF(EVENT_NAME = 'wait/io/file/sql/FRM', SUM_NUMBER_OF_BYTES_READ, 0))          AS metadata_read_bytes,
    SUM(IF(EVENT_NAME = 'wait/io/file/sql/FRM', SUM_NUMBER_OF_BYTES_WRITE, 0))          AS metadata_write_bytes
FROM performance_schema.file_summary_by_event_name;

Key Features

  • Granular I/O Tracking: Monitors 5 critical file types (InnoDB data, redo logs, binlogs, temp files, metadata)
  • Operational Metrics: Tracks read/write counts, latency (picoseconds), and bytes transferred
  • IOPS Forecasting: Run periodically and calculate deltas between executions to derive operations/second

Usage Notes

  • Requires Performance Schema enabled (performance_schema=ON)
  • Values represent cumulative totals since last server restart
  • For IOPS calculation: (current_value – previous_value) / time_interval_seconds
  • Combine with storage system metrics (e.g., AWS RDS ReadIOPS/WriteIOPS) for comprehensive analysis

This query provides foundational data for identifying I/O bottlenecks, validating storage provisioning decisions, and predicting scaling needs.

 

Analyzing Index Usage and Disk I/O with MySQL 8 Performance Schema: A Comprehensive Guide

 

Maximizing MySQL Database Performance: Advanced Statistical Analysis of Query Throughput Capacity

 

Optimizing MySQL InnoDB I/O: Effective Strategies for Tuning innodb_io_capacity and innodb_io_capacity_max

About MinervaDB Corporation 60 Articles
A boutique private-label enterprise-class MySQL, MariaDB, MyRocks, PostgreSQL and ClickHouse consulting, 24*7 consultative support and remote DBA services company with core expertise in performance, scalability and high availability. Our consultants have several years of experience in architecting and building web-scale database infrastructure operations for internet properties from diversified verticals like CDN, Mobile Advertising Networks, E-Commerce, Social Media Applications, SaaS, Gaming and Digital Payment Solutions. Our globally distributed team working on multiple timezones guarantee 24*7 Consulting, Support and Remote DBA Services delivery for MySQL, MariaDB, MyRocks, PostgreSQL and ClickHouse.