INTERNALS.md
May 27, 2026 · View on GitHub
MySQLTuner Internals
Table of contents
- MySQLTuner Internals
- Table of contents
- MySQLTuner steps
- MySQLTuner get login information steps
- MySQLTuner system checks
- MySQLTuner Server version checks
- Mysql error log file analysis
- MySQL Storage engine general information
- MySQLTuner security checks
- MySQLTuner SSL/TLS security checks
- MySQLTuner authentication plugin auditing
- MySQLTuner CVE vulnerabilities detection
- MySQLTuner database information
- MySQLTuner index information
- MySQLTuner Connections information
- MySQLTuner server information
- MySQLTuner sort, join and temp table information
- MySQLTuner global buffer information
- MySQLTuner query cache checks
- MySQLTuner memory checks
- MySQLTuner slow queries checks
- MySQLTuner replication checks
- MySQLTuner InnoDB information
- MySQLTuner AriaDB information
- MySQLTuner MyISAM information
- MySQLTuner Galera information
- MySQLTuner TokuDB information
- MySQLTuner XtraDB information
- MySQLTuner Connect information
- MySQLTuner Spider information
- MySQLTuner RocksDb information
- MySQLTuner Thread pool information
- MySQLTuner performance schema and sysschema information
- MySQLTuner Table Structure Analysis
- MySQLTuner Naming Conventions Analysis
- MySQLTuner Foreign Key Analysis
- MySQLTuner MySQL 8.0+ / MariaDB Modeling Checks
- MySQLTuner Data Type Optimization
- MySQLTuner Schema Sanitization
- MySQLTuner Cloud and SSH integration
- MySQLTuner Cloud Autodiscovery
- MySQLTuner Infrastructure Awareness
- MySQLTuner Container and Systemd log integration
- MySQLTuner Weighted Health Score
- MySQLTuner Predictive Capacity Analysis
- MySQLTuner Guided Auto-Fix Engine
- MySQLTuner Query Anti-Pattern Detection
- MySQLTuner Sysbench Integration
- MySQLTuner Historical Trend Analysis
- MySQLTuner Aborted Connections Management
MySQLTuner steps
- Header Print
- Validate MySQLTuner version (check for updates)
- Setup Cloud mode (Azure/AWS) and SSH if needed
- Setup OS variables and commands (SSH prefixing)
- Get login information and setup MySQL connection
- Toss variables/status into hashes
- Validate MySQL and MariaDB versions (EOL check)
- Suggest 64-bit upgrade and architecture check
- Analyze mysqld error log file (Local, Docker, Podman, Kubectl, Systemd)
- Detect Cloud Environment (AWS, GCP, Azure, DigitalOcean)
- Detect Infrastructure (Storage type, Hardware architecture)
- Show parameters impacting performance during analysis
- Show information about databases (option: --dbstat)
- Show information about tables (option: --tbstat)
- Show information about columns (option: --colstat)
- Show information about indexes (option: --idxstat)
- Show information about views, triggers, and routines
- Show information about plugins (option: --plugininfo)
- Show enabled storage engines
- Display security recommendations
- Display SSL/TLS security audit
- Display authentication plugin audit
- CVE vulnerabilities detection
- Calculate everything we need
- Print the server stats
- Print MyISAM stats
- Print InnoDB stats
- Print AriaDB stats
- Print Galera cluster stats
- Print replication info (Source/Replica, GTID, Semi-sync)
- Query Anti-Pattern Detection (Performance Schema digests)
- Print Storage Engine specific stats (TokuDB, RocksDB, Spider, etc.)
- Print Performance Schema stats
- Table structure analysis (option: --structstat)
- Naming conventions analysis (option: --structstat)
- Foreign key analysis (option: --structstat)
- MySQL 8.0+ / MariaDB modeling checks (option: --structstat)
- Data type optimization analysis (option: --structstat)
- Schema sanitization checks (option: --structstat)
- Weighted Health Score KPI calculation and display
- Predictive Capacity Analysis (memory headroom, disk growth)
- Sysbench result analysis (if provided via --sysbench-file)
- Historical Trend Analysis (if comparison file provided via --compare-file)
- Guided Auto-Fix Snippets generation
- Make recommendations based on stats
- Close reportfile if needed
- Dump result if debug is on
MySQLTuner get login information steps
- Is a login possible?
- Cloud setup (Azure/AWS)?
- SSH prefixing?
- Force socket, pipe, or specific protocol?
- Remote connection?
- Specifying available RAM/Swap is required
- Automatic detection if SSH is used
- SSL CA certificate?
- Got user/pass on command line?
- mysql-quickbackup credentials available?
- Plesk credentials available?
- DirectAdmin credentials available?
- Debian maintenance account credentials available?
- Defaults file or defaults extra file?
- Just try a login
- If working, and .my.cnf isn't there, WARNING
- If working, and .my.cnf is there, okay
- Prompt for creds on the console
MySQLTuner system checks
-
Check whether more than 2GB RAM present if on 32-bit OS
-
Check number of opened ports (warn when more than 9 ports opened)
-
Check 80, 8080, 443 and 8443 ports if warning is raised if they are opened
-
Check if some banned ports are not opened (option --bannedports separated by comma)
-
Check if non kernel and user process except mysqld are not using more than 15% of total physical memory
-
Check vm.swapiness
-
Check /etc/security/limit.conf
-
Check sysctl entries: sunrpc.tcp_slot_entries, vm.swappiness, fs.aio-fs-nr
-
Check mount point
-
Check Ethernet card
-
Check load average
MySQLTuner Server version checks
- EOL MySQL and MariaDB version check
- Currently MySQL < 5.5 and MariaDB < 10.6 are considered EOL
- Using 5.5+ version of MySQL for performance issue (asynchronous IO)
- MySQL 9.x readiness: detection of removed variables and eliminated authentication methods
Mysql error log file analysis
-
Look for potential current error log file name
-
Automatic detection for:
- Docker containers
- Podman containers
- Kubectl/Kubernetes pods
- Systemd journal (journalctl)
-
Check permission on error log file
-
Check size on error log file (warning if > 32MB)
-
Check error and warning on error log file
-
Find last start and shutdown on error log file
MySQL Storage engine general information
- Get storage engine counts/stats
- Check for DB engines that are enabled but unused
- Look for fragmented tables
- Look for auto-increments near capacity
- Look for tables with auto-increment with value near max capacity
MySQLTuner security checks
- Is anonymous user present?
- Users without passwords
- Users with username as password
- Users without host restriction
- Weak password check (possibly using cracklib later?)
- Using basic_passwords.txt as password database
- Password list checks can be avoided (option: --skippassword)
- Max password checks configurable (option: --max-password-checks, default: 100)
MySQLTuner SSL/TLS security checks
- Current session encryption status (Ssl_cipher check)
- Global SSL support (have_ssl variable)
require_secure_transportenforcement (MySQL 5.7+, MariaDB 10.5+)- TLS version audit:
- Warn if TLSv1.0 or TLSv1.1 are enabled (insecure)
- Verify TLSv1.2 or TLSv1.3 are available
- SSL certificate presence and local audit:
- Certificate file existence and permissions
- Certificate expiration date check
- Remote user SSL enforcement:
- Check if remote users (
%host) require SSL
- Check if remote users (
- CSV export of SSL issues (with --dumpdir)
MySQLTuner authentication plugin auditing
- Detection of insecure authentication plugins:
mysql_native_password(SHA-1 based, deprecated in MySQL 8.0+)mysql_old_password(legacy, insecure)sha256_password(deprecated in favor ofcaching_sha2_password)
- MySQL 9.x readiness diagnostics:
- Eliminated authentication methods detection
- Migration path recommendations
- MariaDB-specific recommendations:
- Suggest
ed25519for modern password authentication - Suggest
unix_socketfor local root authentication
- Suggest
- Extended plugins support matrix (see AUTHENTICATION_PLUGINS.md)
MySQLTuner CVE vulnerabilities detection
- option: --cvefile
- Check if your MariaDB or MySQL version contains CVE entries.
MySQLTuner database information
-
Performance analysis parameter checks (metadata performance)
-
Per database information * Tables number
- Rows number
- Total size
- Data size
- Percentage of data size
- Index size
- Percentage of index size
- Views number
- Triggers number
- Routines number
- Collation number
- Check that there is only one collation for all tables in database
- Check that there is only one collation for all table columns in database
- Check that there is only one storage engine per user database
MySQLTuner index information
- Top 10 worth selectivity index
- Per index information
- Index Cardinality
- Index Selectivity
- Misc information about index definition
- Misc information about index size
MySQLTuner Connections information
- Highest usage of available connections
- Percentage of used connections (<85%)
- Percentage of aborted connections (<3%)
MySQLTuner server information
- Uptime: whether MySQL started within last 24 hours
- Bytes received and sent
- Number of connections
- Percentage between reads and writes
- Is binary log activated?
- Is GTID mode activated?
MySQLTuner sort, join and temp table information
- Max memory temporary table size allowed.
- Percentage of sort using temporary table (<10%)
- Number of join performed without using indexes (<250)
- Percentage of temporary table written on disk (<25%)
- Thread cache (=4)
- Thread cache hit ratio (>50%) if thread_handling is different of pools-of-threads
- Table cache hit ratio (>2°%)
- Table cache definition should be upper that total number of tables or in autoresizing mode
- Percentage of open file and open file limit (<85%)
- Percentage of table locks (<95%)
- Percentage of binlog cache lock (<90%)
MySQLTuner global buffer information
- Key Buffer
- Max Tmp Table
- Per Thread Buffer
- Read Buffer
- Read RND Buffer
- Sort Buffer
- Thread stack
- Join Buffer
- Binlog Cache Buffers size if activated
MySQLTuner query cache checks
- Is Query cache activated?
- Query Cache Buffers
- Query Cache DISABLED, ALL REQUEST or ON DEMAND
- Query Cache Size
- Query cache hit ratio (cache efficiency)
MySQLTuner memory checks
- Get total RAM/swap
- Is there enough memory for max connections reached by MySQL?
- Is there enough memory for max connections allowed by MySQL?
- Max percentage of memory used (<85%)
MySQLTuner slow queries checks
- Percentage of Slow queries (<5%)
MySQLTuner replication checks
- Is server replication configured as replica?
- SQL replication thread running?
- IO replication thread running?
- Replication lag in seconds (Seconds_behind_replica)
- Is Replica configured in read only?
- Replication type ROW, MIX, STMT
- Replication Semisync source
- Replication Semisync replica
- XA support activated
- Replication started?
MySQLTuner InnoDB information
-
InnoDB Buffer Pool Size
- If possible, innodb_buffer_pool_size should be greater than data and index size for Innodb Table
- Innodb_buffer_pool_size should be around 75% to 80% of the available system memory.
-
InnoDB Buffer Pool Instances
-
MySQL needs 1 instance per 1Go of Buffer Pool
-
innodb_buffer_pool instances = round(innodb_buffer_pool_size / 1Go)
-
innodb_buffer_pool instances must be equal to or lower than 64
-
A bug in MySQL 5.6 causes SHOW VARIABLES to report an innodb_buffer_pool_instances value of 8 when innodb_buffer_pool_size is less than 1GB and only one buffer pool instance is present (Bug #18343670).
-
-
InnoDB Buffer Pool Usage
- If more than 20% of InnoDB buffer pool is not used, raise an alert.
-
InnoDB Buffer Pool Log Size
- InnoDB total log file size should be 25% of innodb_buffer_pool_size
-
InnoDB Read efficiency
- Ratio of read without locks
-
InnoDB Write efficiency
- Ratio of write without locks
-
InnoDB Log Waits
- Checks that no lock is used on Innodb Log.
-
InnoDB Chunk Size
- Check InnoDB Buffer Pool size is a multiple of InnoDB Buffer Pool chunk size * InnoDB Buffer Pool instances
MySQLTuner AriaDB information
- Is Aria indexes size greater than page cache size?
- Page cache read hit ratio (>95%)
- Page cache write hit ratio (>95%)
MySQLTuner MyISAM information
- Key buffer usage (>90%)
- Is MyISAM indexes size is greater than key buffer size ?
- Key buffer read hit ratio (>95%)
- Key buffer write hit ratio (>95%)
MySQLTuner Galera information
- wsrep_ready cluster is ready
- wsrep_connected node is connected to other nodes
- wsrep_cluster_name is defined.
- wsrep_node_name is defined.
- Check thet notification script wsrep_notify_cmd is defined
- wsrep_cluster_status PRIMARY /NON PRIMARY.
- PRIMARY : Coherent cluster
- NO PRIMARY : cluster gets several states
- wsrep_local_state_comment: Node state
- SYNCED (uptodate),
- DONOR (sending information to another node)
- Joiner (try to reach cluster group)
- SYNCED state able to read/write
- wsrep_cluster_conf_id configuration level must be identical in all nodes
- wsrep_slave_thread is between 3 or 4 times number of CPU core.
- gcs.limit should be equal to wsrep_slave_threads * 5
- gcs.fc_factor should be equal to 0.8
- Flow control fraction should be lower than 0.02 (wsrep_flow_control_paused < 0.02)
- wsrep_last_commited committed level must be identical in all nodes
- Look for tables without primary keys
- Look for non InnoDB tables for Galera
- Variable innodb_flush_log_at_trx_commit should be set to 0.
- Check that there are 3 or 5 members in Galera cluster.
- Check that xtrabackup is used for SST method with wsrep_sst_method variable.
- Check variables wsrep_OSU_method is defined to TOI for updates.
- Check that there is no certification failures controlling wsrep_local_cert_failures status.
MySQLTuner TokuDB information
- tokudb_cache_size
- tokudb_directio
- tokudb_empty_scan
- tokudb_read_block_size
- tokudb_commit_sync
- tokudb_checkpointing_period
- tokudb_block_size
- tokudb_cleaner_iterations
- tokudb_fanout
MySQLTuner XtraDB information
- wsrep_node_name
- wsrep_cluster_name
- wsrep_cluster_address
MySQLTuner Connect information
- connect_type
- connect_user
- connect_host
MySQLTuner Spider information
- spider_nodes
- spider_direct_io
MySQLTuner RocksDb information
- rocksdb_block_cache_size
- rocksdb_max_open_files
MySQLTuner Thread pool information
- thread_pool_size between 16 to 36 for Innodb usage
- thread_pool_size between 4 to 8 for MyISAM usage
MySQLTuner performance schema and sysschema information
- Check that Performance schema is activated for 5.6+ version
- Check that Performance schema is deactivated for 5.5- version
- Check that Sys schema is installed
- Sys Schema version
- Top user per connection
- Top user per statement
- Top user per statement latency
- Top user per lock latency
- Top user per full scans
- Top user per row_sent
- Top user per row modified
- Top user per io
- Top user per io latency
- Top host per connection
- Top host per statement
- Top host per statement latency
- Top host per lock latency
- Top host per full scans
- Top host per rows sent
- Top host per rows modified
- Top host per io
- Top 5 host per io latency
- Top IO type order by total io
- Top IO type order by total latency
- Top IO type order by max latency
- Top Stages order by total io
- Top Stages order by total latency
- Top Stages order by avg latency
- Top host per table scans
- InnoDB Buffer Pool by schema
- InnoDB Buffer Pool by table
- Process per allocated memory
- InnoDB Lock Waits
- Threads IO Latency
- High Cost SQL statements
- Top 5% slower queries
- Top 10 nb statement type
- Top statement by total latency
- Top statement by lock latency
- Top statement by full scans
- Top statement by rows sent
- Top statement by rows modified
- Use temporary tables
- Unused Indexes
- Full table scans
- Latest file IO by latency
- File by IO read bytes
- File by IO written bytes
- File per IO total latency
- File per IO read latency
- File per IO write latency
- Event Wait by read bytes
- Event Wait by write bytes
- Event per wait total latency
- Event per wait read latency
- Event per wait write latency
- Top 15 most read indexes
- Top 15 most modified indexes
- Top 15 high select latency index
- Top 15 high insert latency index
- Top 15 high update latency index
- Top 15 high delete latency index
- Top 15 most read tables
- Top 15 most modified tables
- Top 15 high select latency tables
- Top 15 high insert latency tables
- Top 15 high update latency tables
- Top 15 high delete latency tables
- Redundant indexes
- Tables not using InnoDb buffer
- Top 15 Tables using InnoDb buffer
- Top 15 Tables with InnoDb buffer free
- Top 15 Most executed queries
- Latest SQL queries in errors or warnings
- Top 20 queries with full table scans
- Top 15 reader queries (95% percentile)
- Top 15 row look queries (95% percentile)
- Top 15 total latency queries (95% percentile)
- Top 15 max latency queries (95% percentile)
- Top 15 average latency queries (95% percentile)
- Top 20 queries with sort
- Last 50 queries with sort
- Top 15 row sorting queries with sort
- Top 15 total latency queries with sort
- Top 15 merge queries with sort
- Top 15 average sort merges queries with sort
- Top 15 scans queries with sort
- Top 15 range queries with sort
- Top 20 queries with temp table
- Last 50 queries with temp table
- Top 15 total latency queries with temp table
- Top 15 queries with temp table to disk
- Top 15 class events by number
- Top 30 events by number
- Top 15 class events by total latency
- Top 30 events by total latency
- Top 15 class events by max latency
- Top 30 events by max latency
MySQLTuner Cloud and SSH integration
- Cloud mode: Activated with
--cloudor--azure. - SSH Support: Allows running system commands on a remote host via SSH.
- SSH Authentication: Supports identity files (
--ssh-identity-file) and passwords (--ssh-passwordusingsshpass). - Remote Resource Detection: Automatically detects RAM and Swap on the remote host if SSH is used.
MySQLTuner Container and Systemd log integration
- Docker/Podman: Automatically detects logs from the most relevant database container based on ports and names.
- Kubectl: Supports retrieving logs from Kubernetes pods.
- Systemd: Supports retrieving logs from the systemd journal using
journalctl. - Explicit Container: Can be specified using
--container <type>:<name>.
MySQLTuner Infrastructure Awareness
- Storage Type: Detects SSD/NVMe vs HDD by checking /sys/block/*/queue/rotational.
- Hardware Architecture: Detects ARM64/Graviton vs x86_64.
- Tuning Adjustments: Suggestions for innodb_flush_neighbors and innodb_io_capacity based on storage type.
MySQLTuner Cloud Autodiscovery
- AWS: Detects RDS/Aurora via @@version_comment and @@aurora_version.
- GCP: Detects Cloud SQL via @@version_comment and @@cloudsql_instance_id.
- Azure: Detects Flexible Server via @@version_comment.
- DigitalOcean: Detects Managed MySQL via @@version_comment.
MySQLTuner Query Anti-Pattern Detection
- Full Scans: Analyzes events_statements_summary_by_digest for queries with high no_index_used or no_good_index_used.
- Disk Temp Tables: Identifies queries creating excessive internal disk-based temporary tables.
MySQLTuner Sysbench Integration
- Metrics: Parses sysbench output for QPS, TPS, and latency (Avg/95th/Max).
- Comparison: Includes baseline performance metrics in the final report.
MySQLTuner Historical Trend Analysis
- JSON Snapshots: Ingests JSON output from previous runs via --compare-file.
- Comparisons: Provides trends for QPS and Data Growth between snapshots.
MySQLTuner Table Structure Analysis
Activated with --structstat or --verbose.
- Tables without primary keys detection
- Primary Key naming convention checks:
- Expected:
idor<table_name>_id - Deviations flagged and counted
- Expected:
- Surrogate key type validation:
- Recommended:
BIGINT UNSIGNED AUTO_INCREMENT - UUID optimization: recommend
BINARY(16)instead ofVARCHAR
- Recommended:
- Large tables (>1GB) without secondary indexes
- Foreign Key data type mismatches between referencing and referenced columns
- Non-InnoDB tables detection (recommend migration to InnoDB)
- Non-UTF8 columns detection (character set and collation audit)
- FULLTEXT columns inventory
- CSV export of findings (with --dumpdir):
tables_without_primary_keys.csvprimary_key_issues.csvtables_non_innodb.csvcolumns_non_utf8.csvcolumns_utf8.csvfulltext_columns.csv
MySQLTuner Naming Conventions Analysis
Activated with --structstat or --verbose.
- Automatic dominant style detection across the codebase:
- Supported styles:
snake_case,camelCase,PascalCase,kebab-case,UPPER_SNAKE_CASE
- Supported styles:
- Table naming checks:
- Plural name detection (prefer singular table names)
- Casing consistency vs dominant style
- View naming consistency checks
- Index naming consistency checks
- Column naming checks:
- Casing consistency vs dominant style
- Boolean column prefix convention (
is_,has_,was_,had_) - Date/Time column suffix convention (
_at,_date,_time)
- CSV export:
naming_convention_deviations.csv(with --dumpdir)
MySQLTuner Foreign Key Analysis
Activated with --structstat or --verbose.
- Unconstrained
_idcolumns: columns ending in_idthat lack a FOREIGN KEY constraint - FK actions audit: warns when
ON DELETE CASCADEis used (potential data loss risk) - FK type mismatches: data type differences between FK column and referenced column
- CSV export:
missing_foreign_keys.csv(with --dumpdir)
MySQLTuner MySQL 8.0+ / MariaDB Modeling Checks
Requires MySQL 8.0+ or MariaDB 10.x+.
- JSON column indexability:
- Detects JSON columns without Virtual Generated Columns for indexing
- Recommends creating generated columns for frequently searched JSON attributes
- Invisible indexes detection:
- MySQL:
IS_VISIBLE = 'NO' - MariaDB:
IGNORED = 'YES'
- MySQL:
- CHECK constraints inventory (MySQL 8.0.16+)
- CSV export:
json_columns_without_virtual.csv(with --dumpdir)
MySQLTuner Data Type Optimization
Activated with --structstat or --verbose.
- NULLability audit: warns when more than 20 columns have
IS_NULLABLE = 'YES' - Recommends using
NOT NULLwhere possible for better performance and index efficiency
MySQLTuner Schema Sanitization
Activated with --structstat or --verbose.
- Empty schemas detection (no tables and no views)
- View-only schemas detection (views but no base tables)
MySQLTuner Weighted Health Score
- Unified KPI aggregating findings across three dimensions:
- Performance (40 points):
- Buffer Pool hit rate (10pts): >99% = 10, >95% = 5, else 0
- Temp tables on disk (10pts): <10% = 10, <25% = 5, else 0
- Thread cache hit rate (10pts): >90% = 10, >50% = 5, else 0
- Connection usage (10pts): <80% = 10, else 0
- Security (30 points):
- Deducted for anonymous users, empty passwords, users without host restriction
- Deducted for insecure authentication plugins
- Deducted for missing SSL configuration
- Resilience (30 points):
- Replication lag (10pts)
- Error log health (10pts)
- Metadata consistency (10pts)
- Performance (40 points):
- Color-coded display: Green (>80), Yellow (>50), Red (≤50)
- Stored in JSON output as
WeightedHealthScoreandHealthScoreDetails
MySQLTuner Predictive Capacity Analysis
- Memory Headroom:
- Calculates theoretical peak memory usage vs available RAM+Swap
- Alerts when peak memory exceeds available resources (OOM risk)
- Reports headroom percentage of physical RAM
- Disk Growth Forecasting:
- Estimates daily data growth based on current total data size and server uptime
- Requires minimum 24 hours of uptime for reliable estimation
- Results stored in JSON:
Capacity.Memory.Peak,Capacity.Memory.Headroom,Capacity.Disk.DailyGrowth
MySQLTuner Guided Auto-Fix Engine
- Generates ready-to-apply SQL snippets from variable adjustment recommendations:
- SET GLOBAL statements: Immediate application without restart
- [mysqld] configuration block: For persistent my.cnf changes
- Only generated when variable adjustments are recommended
- Suppressed in
--silentand--jsonmodes
MySQLTuner Aborted Connections Management
- Tracks aborted connections state across runs to avoid false positives
- State file protection:
- Symlink verification before read/write
- Atomic writes to prevent corruption
- Transport-specific host and container identifiers in state file path to prevent collisions
- Adjusts the aborted connections count to subtract connections caused by MySQLTuner's own password strength checks
