innodb_change_buffering

Tuning innodb_change_buffering variable

Basic Details

The innodb_change_buffering variable in MySQL is used to control the extent of change buffering that InnoDB employs to optimize the handling of secondary index updates.

Releem automatically tunes innodb_change_buffering and 44 other variables to improve MySQL performance. Try Releem for Free, or deepen your understanding by reading our detailed article.

innodb_change_buffering – Usage

In the MySQL database system, the InnoDB storage engine maintains indexes for tables to speed up data retrieval. Indexes are essentially lookup tables that the database search engine can use to find data more quickly than by scanning the entire table.

In addition to primary indexes (which are usually based on the primary key of a table), InnoDB also supports secondary indexes. While primary indexes ensure data is physically stored in an order, secondary indexes are essentially pointers to the primary index, offering alternative ways to organize and access data.

The innodb_change_buffering variable governs how InnoDB handles changes (like inserts, deletes, and purges) to these secondary indexes:

  • Inserts – When a new row is added to a table, any secondary indexes on that table will also need to be updated with the information about the new row.

  • Deletes – When a row is deleted, the corresponding entries in the secondary indexes also need to be removed.

  • Purges – InnoDB operates with a multi-version concurrency control (MVCC) model. When a row is deleted, InnoDB doesn't immediately remove it. Instead, it marks it for deletion and purges it later. The purge operation also affects secondary indexes.

Instead of immediately applying these changes to secondary indexes, InnoDB can buffer them. Buffering these changes means that they are held in memory and applied later in one go, which can be faster than applying each one individually as it happens. This approach can optimize disk I/O operations, as writing to disk is generally one of the slower operations in a database system.

The innodb_change_buffering MySQL system variable controls how the InnoDB storage engine buffers changes to secondary indexes. It is primarily intended to optimize disk I/O operations for these changes.

Allowed Values

The innodb_change_buffering variable can have one of the following values:

  • none – No operations are buffered.
  • inserts – Only insert operations are buffered.
  • deletes – Only delete operations are buffered.
  • changes – Both insert and delete operations are buffered.
  • purges – Only purge operations are buffered.
  • all – All types of operations are buffered.

The default value for MySQL is all, meaning that, by default, InnoDB buffers all types of operations. The default value for MariaDB is none.

innodb_change_buffering – Configuration

The innodb_change_buffering variable can be configured using the command line or set at startup using the configuration file:

Command Line Configuration:
mysqld> set global innodb_change_buffering = XX

Replace XX with value to suit your database needs. To verify that the variable has been changed:

mysqld> show global variables like ‘innodb_change_buffering’

Configuration File:
[mysqld]
innodb_change_buffering variable = XX

Replace XX with value to suit your database needs. Must restart MySQL server to see changes applied.

innodb_change_buffering – Considerations

When considering the usage and adjustment of the innodb_change_buffering variable, it's important to understand the potential impact on system performance. Here are a few key considerations to keep in mind:

Memory Usage
Change buffering will consume some part of the InnoDB system memory (the buffer pool). Depending on the type and volume of operations your MySQL server handles, this can be substantial.

If your system frequently performs operations that are subject to buffering (inserts, deletes, or purges), increasing the buffering level could lead to increased memory usage. Monitor your system's memory usage to ensure that it remains within acceptable limits.

Disk I/O
The purpose of change buffering is to reduce disk I/O operations by buffering changes to secondary indexes. However, keep in mind that these changes will eventually need to be written to disk. This deferred writing will occur during periods of lower demand on the database, but it can also lead to bursts of disk I/O activity. Monitor your disk activity to ensure that these write bursts do not lead to periods of increased disk latency.

Server Workload
The optimal setting for innodb_change_buffering may vary based on your server's workload. If your server predominantly performs insert operations, for instance, you might find that setting innodb_change_buffering to inserts results in a performance benefit.

If your server performs a mixture of inserts, deletes, and purges, then the default setting of all might be most appropriate. Consider your server's workload when deciding which setting to use.

Automatic Configuration with Releem

Instead of trialing different values for innodb_change_buffering or letting MySQL automatically choose the search depth, try Releem. Releem monitors server performance and automatically determines the best value for hundreds of different variables, including innodb_change_buffering. Releem’s configuration changes are super easy to apply, requiring no heavy lifting on your part while ensuring that resource usage, latency, and queries are optimized.
Releem automatically detects MySQL performance degradation and optimizes MySQL configuration files