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