System variables that are true or false can be enabled at
server startup by naming them, or disabled by using a
--skip- prefix. For example, to enable or
disable the InnoDB adaptive hash index, you
can use
--innodb_adaptive_hash_index or
--skip-innodb_adaptive_hash_index
on the command line, or
innodb_adaptive_hash_index or
skip-innodb_adaptive_hash_index in an
option file.
System variables that take a numeric value can be specified as
--
on the command line or as
var_name=value
in option files.
var_name=value
Many system variables can be changed at runtime (see Section 5.1.6.2, “Dynamic System Variables”).
For information about GLOBAL and
SESSION variable scope modifiers, refer to
the
SET
statement documentation.
Certain options control the locations and layout of the
InnoDB data files.
Section 14.6.1, “InnoDB Startup Configuration” explains
how to use these options.
Some options, which you might not use initially, help tune
InnoDB performance characteristics based on
machine capacity and your database
workload.
For more information on specifying options and system variables, see Section 4.2.3, “Specifying Program Options”.
Table 14.9 InnoDB Option/Variable
Reference
| Deprecated | 5.5.22 | ||
| Command-Line Format | --ignore-builtin-innodb | ||
| System Variable | Name | ignore_builtin_innodb | |
| Variable Scope | Global | ||
| Dynamic Variable | No | ||
| Permitted Values | Type | boolean | |
In MySQL 5.1, this option caused the server to behave as if
the built-in InnoDB were not present, which
enabled the InnoDB Plugin to be used
instead. In MySQL 5.6, InnoDB
is the default storage engine and InnoDB
Plugin is not used, so this option has no effect. As
of MySQL 5.6.5, it is ignored.
| Deprecated | 5.6.21 | ||
| Command-Line Format | --innodb[=value] | ||
| Permitted Values | Type | enumeration | |
| Default | ON | ||
| Valid Values | OFF | ||
ON | |||
FORCE | |||
Controls loading of the InnoDB storage
engine, if the server was compiled with
InnoDB support. This option has a tristate
format, with possible values of OFF,
ON, or FORCE. See
Section 5.5.2, “Installing and Uninstalling Plugins”.
To disable InnoDB, use
--innodb=OFF
or
--skip-innodb.
In this case, because the default storage engine is
InnoDB, the server does not start
unless you also use
--default-storage-engine and
--default-tmp-storage-engine to
set the default to some other engine for both permanent and
TEMPORARY tables.
As of MySQL 5.6.21,
--innodb=OFF
and
--skip-innodb
options are deprecated and their use results in a warning.
These options will be removed in a future MySQL release.
| Command-Line Format | --innodb-status-file | ||
| Permitted Values | Type | boolean | |
| Default | OFF | ||
Controls whether InnoDB creates a file
named
innodb_status.
in the MySQL data directory. If enabled,
pidInnoDB periodically writes the output of
SHOW ENGINE
INNODB STATUS to this file.
By default, the file is not created. To create it, start
mysqld with the
--innodb-status-file=1 option. The file is
deleted during normal shutdown.
Disable the InnoDB storage engine. See the
description of --innodb.
daemon_memcached_enable_binlog
| Introduced | 5.6.6 | ||
| Command-Line Format | --daemon_memcached_enable_binlog=# | ||
| System Variable | Name | daemon_memcached_enable_binlog | |
| Variable Scope | Global | ||
| Dynamic Variable | No | ||
| Permitted Values | Type | boolean | |
| Default | false | ||
Enable this option on the
master server to use
the InnoDB memcached
plugin (daemon_memcached) with the MySQL
binary log. This option
can only be set at server startup. You must also enable the
MySQL binary log on the master server using the
--log-bin option.
For more information, see Section 14.20.6, “The InnoDB memcached Plugin and Replication”.
daemon_memcached_engine_lib_name
| Introduced | 5.6.6 | ||
| Command-Line Format | --daemon_memcached_engine_lib_name=library | ||
| System Variable | Name | daemon_memcached_engine_lib_name | |
| Variable Scope | Global | ||
| Dynamic Variable | No | ||
| Permitted Values | Type | file name | |
| Default | innodb_engine.so | ||
Specifies the shared library that implements the
InnoDB memcached plugin.
For more information, see Section 14.20.3, “Setting Up the InnoDB memcached Plugin”.
daemon_memcached_engine_lib_path
| Introduced | 5.6.6 | ||
| Command-Line Format | --daemon_memcached_engine_lib_path=directory | ||
| System Variable | Name | daemon_memcached_engine_lib_path | |
| Variable Scope | Global | ||
| Dynamic Variable | No | ||
| Permitted Values | Type | directory name | |
| Default | NULL | ||
The path of the directory containing the shared library that
implements the InnoDB
memcached plugin. The default value is
NULL, representing the MySQL plugin directory. You should not
need to modify this parameter unless specifying a
memcached plugin for a different storage
engine that is located outside of the MySQL plugin directory.
For more information, see Section 14.20.3, “Setting Up the InnoDB memcached Plugin”.
| Introduced | 5.6.6 | ||
| Command-Line Format | --daemon_memcached_option=options | ||
| System Variable | Name | daemon_memcached_option | |
| Variable Scope | Global | ||
| Dynamic Variable | No | ||
| Permitted Values | Type | string | |
| Default | | ||
Used to pass space-separated memcached options to the underlying memcached memory object caching daemon on startup. For example, you might change the port that memcached listens on, reduce the maximum number of simultaneous connections, change the maximum memory size for a key/value pair, or enable debugging messages for the error log.
See Section 14.20.3, “Setting Up the InnoDB memcached Plugin” for usage details. For information about memcached options, refer to the memcached man page.
| Introduced | 5.6.6 | ||
| Command-Line Format | --daemon_memcached_r_batch_size=# | ||
| System Variable | Name | daemon_memcached_r_batch_size | |
| Variable Scope | Global | ||
| Dynamic Variable | No | ||
| Permitted Values | Type | integer | |
| Default | 1 | ||
Specifies how many memcached read
operations (get operations) to perform
before doing a COMMIT to start
a new transaction. Counterpart of
daemon_memcached_w_batch_size.
This value is set to 1 by default, so that any changes made to the table through SQL statements are immediately visible to memcached operations. You might increase it to reduce the overhead from frequent commits on a system where the underlying table is only being accessed through the memcached interface. If you set the value too large, the amount of undo or redo data could impose some storage overhead, as with any long-running transaction.
For more information, see Section 14.20.3, “Setting Up the InnoDB memcached Plugin”.
| Introduced | 5.6.6 | ||
| Command-Line Format | --daemon_memcached_w_batch_size=# | ||
| System Variable | Name | daemon_memcached_w_batch_size | |
| Variable Scope | Global | ||
| Dynamic Variable | No | ||
| Permitted Values | Type | integer | |
| Default | 1 | ||
Specifies how many memcached write
operations, such as add,
set, and incr, to
perform before doing a COMMIT
to start a new transaction. Counterpart of
daemon_memcached_r_batch_size.
This value is set to 1 by default, on the assumption that data
being stored is important to preserve in case of an outage and
should immediately be committed. When storing non-critical
data, you might increase this value to reduce the overhead
from frequent commits; but then the last
N-1 uncommitted write operations
could be lost if a crash occurs.
For more information, see Section 14.20.3, “Setting Up the InnoDB memcached Plugin”.
| Deprecated | 5.5.22 | ||
| Command-Line Format | --ignore-builtin-innodb | ||
| System Variable | Name | ignore_builtin_innodb | |
| Variable Scope | Global | ||
| Dynamic Variable | No | ||
| Permitted Values | Type | boolean | |
See the description of
--ignore-builtin-innodb under
“InnoDB Command Options” earlier in this section.
| Command-Line Format | --innodb_adaptive_flushing=# | ||
| System Variable | Name | innodb_adaptive_flushing | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | boolean | |
| Default | ON | ||
Specifies whether to dynamically adjust the rate of flushing
dirty pages in the
InnoDB
buffer pool based on
the workload. Adjusting the flush rate dynamically is intended
to avoid bursts of I/O activity. This setting is enabled by
default. See
Section 14.6.3.5, “Configuring InnoDB Buffer Pool Flushing” for
more information. For general I/O tuning advice, see
Section 8.5.8, “Optimizing InnoDB Disk I/O”.
| Introduced | 5.6.6 | ||
| Command-Line Format | --innodb_adaptive_flushing_lwm=# | ||
| System Variable | Name | innodb_adaptive_flushing_lwm | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | integer | |
| Default | 10 | ||
| Min Value | 0 | ||
| Max Value | 70 | ||
Defines the low water mark representing percentage of redo log capacity at which adaptive flushing is enabled. For more information, see Section 14.6.3.6, “Fine-tuning InnoDB Buffer Pool Flushing”.
| Command-Line Format | --innodb_adaptive_hash_index=# | ||
| System Variable | Name | innodb_adaptive_hash_index | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | boolean | |
| Default | ON | ||
Whether the InnoDB
adaptive hash
index is enabled or disabled. It may be desirable,
depending on your workload, to dynamically enable or disable
adaptive hash
indexing to improve query performance. Because the
adaptive hash index may not be useful for all workloads,
conduct benchmarks with it both enabled and disabled, using
realistic workloads. See
Section 14.4.3, “Adaptive Hash Index” for details.
This variable is enabled by default. You can modify this
parameter using the SET GLOBAL statement,
without restarting the server. Changing the setting requires
the SUPER privilege. You can also use
--skip-innodb_adaptive_hash_index at server
startup to disable it.
Disabling the adaptive hash index empties the hash table immediately. Normal operations can continue while the hash table is emptied, and executing queries that were using the hash table access the index B-trees directly instead. When the adaptive hash index is re-enabled, the hash table is populated again during normal operation.
innodb_adaptive_max_sleep_delay
| Introduced | 5.6.3 | ||
| Command-Line Format | --innodb_adaptive_max_sleep_delay=# | ||
| System Variable | Name | innodb_adaptive_max_sleep_delay | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | integer | |
| Default | 150000 | ||
| Min Value | 0 | ||
| Max Value | 1000000 | ||
Permits InnoDB to automatically adjust the
value of
innodb_thread_sleep_delay up
or down according to the current workload. Any non-zero value
enables automated, dynamic adjustment of the
innodb_thread_sleep_delay value, up to the
maximum value specified in the
innodb_adaptive_max_sleep_delay option. The
value represents the number of microseconds. This option can
be useful in busy systems, with greater than 16
InnoDB threads. (In practice, it is most
valuable for MySQL systems with hundreds or thousands of
simultaneous connections.)
For more information, see Section 14.6.6, “Configuring Thread Concurrency for InnoDB”.
innodb_additional_mem_pool_size
| Deprecated | 5.6.3 | ||
| Command-Line Format | --innodb_additional_mem_pool_size=# | ||
| System Variable | Name | innodb_additional_mem_pool_size | |
| Variable Scope | Global | ||
| Dynamic Variable | No | ||
| Permitted Values | Type | integer | |
| Default | 8388608 | ||
| Min Value | 2097152 | ||
| Max Value | 4294967295 | ||
The size in bytes of a memory pool InnoDB
uses to store data
dictionary information and other internal data
structures. The more tables you have in your application, the
more memory you allocate here. If InnoDB
runs out of memory in this pool, it starts to allocate memory
from the operating system and writes warning messages to the
MySQL error log. The default value is 8MB.
This variable relates to the InnoDB
internal memory allocator, which is unused if
innodb_use_sys_malloc is
enabled. For more information, see
Section 14.6.4, “Configuring the Memory Allocator for InnoDB”.
As of MySQL 5.6.3,
innodb_additional_mem_pool_size is
deprecated and will be removed in a future MySQL release.
| Introduced | 5.6.7 | ||
| Command-Line Format | --innodb_api_bk_commit_interval=# | ||
| System Variable | Name | innodb_api_bk_commit_interval | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | integer | |
| Default | 5 | ||
| Min Value | 1 | ||
| Max Value | 1073741824 | ||
How often to auto-commit idle connections that use the
InnoDB memcached
interface, in seconds. For more information, see
Section 14.20.5.4, “Controlling Transactional Behavior of the InnoDB memcached Plugin”.
| Introduced | 5.6.6 | ||
| Command-Line Format | --innodb_api_disable_rowlock=# | ||
| System Variable | Name | innodb_api_disable_rowlock | |
| Variable Scope | Global | ||
| Dynamic Variable | No | ||
| Permitted Values | Type | boolean | |
| Default | OFF | ||
Use this option to disable row locks when
InnoDB memcached
performs DML operations. By default,
innodb_api_disable_rowlock is disabled,
which means that memcached requests row
locks for get and set
operations. When innodb_api_disable_rowlock
is enabled, memcached requests a table lock
instead of row locks.
innodb_api_disable_rowlock is not dynamic.
It must be specified on the mysqld command
line or entered in the MySQL configuration file. Configuration
takes effect when the plugin is installed, which occurs when
the MySQL server is started.
For more information, see Section 14.20.5.4, “Controlling Transactional Behavior of the InnoDB memcached Plugin”.
| Introduced | 5.6.6 | ||
| Command-Line Format | --innodb_api_enable_binlog=# | ||
| System Variable | Name | innodb_api_enable_binlog | |
| Variable Scope | Global | ||
| Dynamic Variable | No | ||
| Permitted Values | Type | boolean | |
| Default | OFF | ||
Lets you use the InnoDB
memcached plugin with the MySQL
binary log. For more
information, see
Enabling the InnoDB memcached Binary Log.
| Introduced | 5.6.6 | ||
| Command-Line Format | --innodb_api_enable_mdl=# | ||
| System Variable | Name | innodb_api_enable_mdl | |
| Variable Scope | Global | ||
| Dynamic Variable | No | ||
| Permitted Values | Type | boolean | |
| Default | OFF | ||
Locks the table used by the InnoDB
memcached plugin, so that it cannot be
dropped or altered by DDL
through the SQL interface. For more information, see
Section 14.20.5.4, “Controlling Transactional Behavior of the InnoDB memcached Plugin”.
| Introduced | 5.6.6 | ||
| Command-Line Format | --innodb_api_trx_level=# | ||
| System Variable | Name | innodb_api_trx_level | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | integer | |
| Default | 0 | ||
Controls the transaction isolation level on queries processed by the memcached interface. The constants corresponding to the familiar names are:
0 = READ UNCOMMITTED
1 = READ COMMITTED
2 = REPEATABLE READ
3 = SERIALIZABLE
For more information, see Section 14.20.5.4, “Controlling Transactional Behavior of the InnoDB memcached Plugin”.
| Command-Line Format | --innodb_autoextend_increment=# | ||
| System Variable | Name | innodb_autoextend_increment | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values (<= 5.6.5) | Type | integer | |
| Default | 8 | ||
| Min Value | 1 | ||
| Max Value | 1000 | ||
| Permitted Values (>= 5.6.6) | Type | integer | |
| Default | 64 | ||
| Min Value | 1 | ||
| Max Value | 1000 | ||
The increment size (in megabytes) for extending the size of an
auto-extending InnoDB
system
tablespace file when it becomes full. The default value
is 64. For related information, see
System Tablespace Data File Configuration, and
Section 14.7.1, “Resizing the InnoDB System Tablespace”.
The
innodb_autoextend_increment
setting does not affect
file-per-table
tablespace files. These files are auto-extending regardless of
of the
innodb_autoextend_increment
setting. The initial extensions are by small amounts, after
which extensions occur in increments of 4MB.
| Command-Line Format | --innodb_autoinc_lock_mode=# | ||
| System Variable | Name | innodb_autoinc_lock_mode | |
| Variable Scope | Global | ||
| Dynamic Variable | No | ||
| Permitted Values | Type | integer | |
| Default | 1 | ||
| Valid Values | 0 | ||
1 | |||
2 | |||
The lock mode to use for generating auto-increment values. Permissible values are 0, 1, or 2, for “traditional”, “consecutive”, or “interleaved”, respectively. The default setting is 1 (“consecutive”). For the characteristics of each lock mode, see InnoDB AUTO_INCREMENT Lock Modes.
innodb_buffer_pool_dump_at_shutdown
| Introduced | 5.6.3 | ||
| Command-Line Format | --innodb_buffer_pool_dump_at_shutdown=# | ||
| System Variable | Name | innodb_buffer_pool_dump_at_shutdown | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | boolean | |
| Default | OFF | ||
Specifies whether to record the pages cached in the
InnoDB
buffer pool when the
MySQL server is shut down, to shorten the
warmup process at the next
restart. Typically used in combination with
innodb_buffer_pool_load_at_startup.
For more information, see Section 14.6.3.7, “Saving and Restoring the Buffer Pool State”.
| Introduced | 5.6.3 | ||
| Command-Line Format | --innodb_buffer_pool_dump_now=# | ||
| System Variable | Name | innodb_buffer_pool_dump_now | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | boolean | |
| Default | OFF | ||
Immediately records the pages cached in the
InnoDB
buffer pool. Typically
used in combination with
innodb_buffer_pool_load_now.
For more information, see Section 14.6.3.7, “Saving and Restoring the Buffer Pool State”.
| Introduced | 5.6.3 | ||
| Command-Line Format | --innodb_buffer_pool_filename=file | ||
| System Variable | Name | innodb_buffer_pool_filename | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | file name | |
| Default | ib_buffer_pool | ||
Specifies the name of the file that holds the list of
tablespace IDs and page IDs produced by
innodb_buffer_pool_dump_at_shutdown
or
innodb_buffer_pool_dump_now.
Tablespace IDs and page IDs are saved in the following format:
space, page_id. By default, the file is
named ib_buffer_pool and is located in
the InnoDB data directory. A non-default
location must be specified relative to the data directory.
A file name can be specified at runtime, using a
SET
statement:
SET GLOBAL innodb_buffer_pool_filename='file_name';
You can also specify a file name at startup, in a startup
string or MySQL configuration file. When specifying a file
name at startup, the file must exist or
InnoDB will return a startup error
indicating that there is no such file or directory.
For more information, see Section 14.6.3.7, “Saving and Restoring the Buffer Pool State”.
| Command-Line Format | --innodb_buffer_pool_instances=# | ||
| System Variable | Name | innodb_buffer_pool_instances | |
| Variable Scope | Global | ||
| Dynamic Variable | No | ||
| Permitted Values (<= 5.6.5) | Type | integer | |
| Default | 1 | ||
| Min Value | 1 | ||
| Max Value | 64 | ||
| Permitted Values (Windows, 32-bit platforms, >= 5.6.6) | Type | integer | |
| Default | (autosized) | ||
| Min Value | 1 | ||
| Max Value | 64 | ||
| Permitted Values (Other, >= 5.6.6) | Type | integer | |
| Default | 8 (or 1 if innodb_buffer_pool_size < 1GB | ||
| Min Value | 1 | ||
| Max Value | 64 | ||
The number of regions that the InnoDB
buffer pool is divided
into. For systems with buffer pools in the multi-gigabyte
range, dividing the buffer pool into separate instances can
improve concurrency, by reducing contention as different
threads read and write to cached pages. Each page that is
stored in or read from the buffer pool is assigned to one of
the buffer pool instances randomly, using a hashing function.
Each buffer pool manages its own free lists,
flush lists,
LRUs, and all other data
structures connected to a buffer pool, and is protected by its
own buffer pool mutex.
This option only takes effect when setting
innodb_buffer_pool_size to a
size of 1GB or more. The total size you specify is divided
among all the buffer pools. For best efficiency, specify a
combination of
innodb_buffer_pool_instances
and innodb_buffer_pool_size
so that each buffer pool instance is at least 1GB.
Before MySQL 5.6.6, the default is 1. The default value in
MySQL 5.6.6 and higher on 32-bit Windows systems depends on
the value of
innodb_buffer_pool_size, as
described below:
If
innodb_buffer_pool_size
is greater than 1.3GB, the default for
innodb_buffer_pool_instances
is
innodb_buffer_pool_size/128MB,
with individual memory allocation requests for each chunk.
1.3GB was chosen as the boundary at which there is
significant risk for 32-bit Windows to be unable to
allocate the contiguous address space needed for a single
buffer pool.
Otherwise, the default is 1.
On all other platforms, the default value in MySQL 5.6.6 and
higher is 8 when
innodb_buffer_pool_size is
greater than or equal to 1GB. Otherwise, the default is 1.
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). As an alternative, you can use
SHOW ENGINE
INNODB STATUS to check the number of buffer pool
instances. If there are multiple buffer pool instances,
SHOW ENGINE
INNODB STATUS output includes an
INDIVIDUAL BUFFER POOL INFO section.
| Introduced | 5.6.3 | ||
| Command-Line Format | --innodb_buffer_pool_load_abort=# | ||
| System Variable | Name | innodb_buffer_pool_load_abort | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | boolean | |
| Default | OFF | ||
Interrupts the process of restoring InnoDB
buffer pool contents
triggered by
innodb_buffer_pool_load_at_startup
or
innodb_buffer_pool_load_now.
For more information, see Section 14.6.3.7, “Saving and Restoring the Buffer Pool State”.
innodb_buffer_pool_load_at_startup
| Introduced | 5.6.3 | ||
| Command-Line Format | --innodb_buffer_pool_load_at_startup=# | ||
| System Variable | Name | innodb_buffer_pool_load_at_startup | |
| Variable Scope | Global | ||
| Dynamic Variable | No | ||
| Permitted Values | Type | boolean | |
| Default | OFF | ||
Specifies that, on MySQL server startup, the
InnoDB
buffer pool is
automatically warmed up by
loading the same pages it held at an earlier time. Typically
used in combination with
innodb_buffer_pool_dump_at_shutdown.
For more information, see Section 14.6.3.7, “Saving and Restoring the Buffer Pool State”.
| Introduced | 5.6.3 | ||
| Command-Line Format | --innodb_buffer_pool_load_now=# | ||
| System Variable | Name | innodb_buffer_pool_load_now | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | boolean | |
| Default | OFF | ||
Immediately warms up the
InnoDB
buffer pool by loading
a set of data pages, without waiting for a server restart. Can
be useful to bring cache memory back to a known state during
benchmarking, or to ready the MySQL server to resume its
normal workload after running queries for reports or
maintenance.
For more information, see Section 14.6.3.7, “Saving and Restoring the Buffer Pool State”.
| Command-Line Format | --innodb_buffer_pool_size=# | ||
| System Variable | Name | innodb_buffer_pool_size | |
| Variable Scope | Global | ||
| Dynamic Variable | No | ||
| Permitted Values (32-bit platforms) | Type | integer | |
| Default | 134217728 | ||
| Min Value | 5242880 | ||
| Max Value | 2**32-1 | ||
| Permitted Values (64-bit platforms) | Type | integer | |
| Default | 134217728 | ||
| Min Value | 5242880 | ||
| Max Value | 2**64-1 | ||
The size in bytes of the
buffer pool, the
memory area where InnoDB caches table and
index data. The default value is 128MB. The maximum value
depends on the CPU architecture; the maximum is 4294967295
(232-1) on 32-bit systems and
18446744073709551615 (264-1) on
64-bit systems. On 32-bit systems, the CPU architecture and
operating system may impose a lower practical maximum size
than the stated maximum. When the size of the buffer pool is
greater than 1GB, setting
innodb_buffer_pool_instances
to a value greater than 1 can improve the scalability on a
busy server.
A larger buffer pool requires less disk I/O to access the same table data more than once. On a dedicated database server, you might set the buffer pool size to 80% of the machine's physical memory size. Be aware of the following potential issues when configuring buffer pool size, and be prepared to scale back the size of the buffer pool if necessary.
Competition for physical memory can cause paging in the operating system.
InnoDB reserves additional memory for
buffers and control structures, so that the total
allocated space is approximately 10% greater than the
specified buffer pool size.
Address space for the buffer pool must be contiguous, which can be an issue on Windows systems with DLLs that load at specific addresses.
The time to initialize the buffer pool is roughly proportional to its size. On instances with large buffer pools, initialization time might be significant. To reduce the initialization period, you can save the buffer pool state at server shutdown and restore it at server startup. See Section 14.6.3.7, “Saving and Restoring the Buffer Pool State”.
| Introduced | 5.6.2 | ||
| Command-Line Format | --innodb_change_buffer_max_size=# | ||
| System Variable | Name | innodb_change_buffer_max_size | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | integer | |
| Default | 25 | ||
| Min Value | 0 | ||
| Max Value | 50 | ||
Maximum size for the InnoDB
change buffer, as a
percentage of the total size of the
buffer pool. You might
increase this value for a MySQL server with heavy insert,
update, and delete activity, or decrease it for a MySQL server
with unchanging data used for reporting. For more information,
see Section 14.4.2, “Change Buffer”, and
Section 14.6.5, “Configuring InnoDB Change Buffering”. For
general I/O tuning advice, see
Section 8.5.8, “Optimizing InnoDB Disk I/O”.
| Command-Line Format | --innodb_change_buffering=# | ||
| System Variable | Name | innodb_change_buffering | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | enumeration | |
| Default | all | ||
| Valid Values | none | ||
inserts | |||
deletes | |||
changes | |||
purges | |||
all | |||
Whether InnoDB performs
change buffering,
an optimization that delays write operations to secondary
indexes so that the I/O operations can be performed
sequentially. Permitted values are described in the following
table.
Table 14.10 Permitted Values for innodb_change_buffering
| Value | Description |
|---|---|
none | Do not buffer any operations. |
inserts | Buffer insert operations. |
deletes | Buffer delete marking operations; strictly speaking, the writes that mark index records for later deletion during a purge operation. |
changes | Buffer inserts and delete-marking operations. |
purges | Buffer the physical deletion operations that happen in the background. |
all | The default. Buffer inserts, delete-marking operations, and purges. |
For more information, see Section 14.4.2, “Change Buffer”, and Section 14.6.5, “Configuring InnoDB Change Buffering”. For general I/O tuning advice, see Section 8.5.8, “Optimizing InnoDB Disk I/O”.
| Command-Line Format | --innodb_change_buffering_debug=# | ||
| System Variable | Name | innodb_change_buffering_debug | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | integer | |
| Default | 0 | ||
| Max Value | 2 | ||
Sets a debug flag for InnoDB change
buffering. A value of 1 forces all changes to the change
buffer. A value of 2 causes a crash at merge. A default value
of 0 indicates that the change buffering debug flag is not
set. This option is only available when debugging support is
compiled in using the WITH_DEBUG
CMake option.
| Introduced | 5.6.3 | ||
| Command-Line Format | --innodb_checksum_algorithm=# | ||
| System Variable | Name | innodb_checksum_algorithm | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values (<= 5.6.5) | Type | enumeration | |
| Default | innodb | ||
| Valid Values | innodb | ||
crc32 | |||
none | |||
strict_innodb | |||
strict_crc32 | |||
strict_none | |||
| Permitted Values (5.6.6) | Type | enumeration | |
| Default | crc32 | ||
| Valid Values | innodb | ||
crc32 | |||
none | |||
strict_innodb | |||
strict_crc32 | |||
strict_none | |||
| Permitted Values (>= 5.6.7) | Type | enumeration | |
| Default | innodb | ||
| Valid Values | innodb | ||
crc32 | |||
none | |||
strict_innodb | |||
strict_crc32 | |||
strict_none | |||
Specifies how to generate and verify the
checksum stored in the
disk blocks of InnoDB
tablespaces.
innodb_checksum_algorithm replaces the
innodb_checksums option in
MySQL 5.6.3. The following values are provided for
compatibility:
innodb_checksum_algorithm=innodb is the
same as innodb_checksums=ON
innodb_checksum_algorithm=none is the
same as innodb_checksums=OFF
To avoid conflicts, remove references to
innodb_checksums from MySQL
configuration files and startup scripts.
The value innodb is backward-compatible
with earlier versions of MySQL. The value
crc32 uses an algorithm that is faster to
compute the checksum for every modified block, and to check
the checksums for each disk read. It scans blocks 32 bits at a
time, which is faster than the innodb
checksum algorithm, which scans blocks 8 bits at a time. The
value none writes a constant value in the
checksum field rather than computing a value based on the
block data. The blocks in a tablespace can use a mix of old,
new, and no checksum values, being updated gradually as the
data is modified; once blocks in a tablespace are modified to
use the crc32 algorithm, the associated
tables cannot be read by earlier versions of MySQL.
The strict form of a checksum algorithm reports an error if it encounters a valid but non-matching checksum value in a tablespace. It is recommended that you only use strict settings in a new instance, to set up tablespaces for the first time. Strict settings are somewhat faster, because they do not need to compute all checksum values during disk reads.
Prior to MySQL 5.6.25, a strict mode setting for
innodb_checksum_algorithm caused
InnoDB to halt when encountering a
valid but non-matching checksum. In
MySQL 5.6.25 and later, only an error message is printed,
and the page is accepted as valid if it has a valid
innodb, crc32 or
none checksum.
The following table shows the difference between the
none, innodb, and
crc32 option values, and their strict
counterparts. none,
innodb, and crc32 write
the specified type of checksum value into each data block, but
for compatibility accept other checksum values when verifying
a block during a read operation. Strict settings also accept
valid checksum values but print an error message when a valid
non-matching checksum value is encountered. Using the strict
form can make verification faster if all
InnoDB data files in an instance are
created under an identical
innodb_checksum_algorithm value.
Table 14.11 innodb_checksum_algorithm Settings
| Value | Generated checksum (when writing) | Permitted checksums (when reading) |
|---|---|---|
| none | A constant number. | Any of the checksums generated by none,
innodb, or
crc32. |
| innodb | A checksum calculated in software, using the original algorithm from
InnoDB. | Any of the checksums generated by none,
innodb, or
crc32. |
| crc32 | A checksum calculated using the crc32 algorithm,
possibly done with a hardware assist. | Any of the checksums generated by none,
innodb, or
crc32. |
| strict_none | A constant number | Any of the checksums generated by none,
innodb, or
crc32. InnoDB
prints an error message if a valid but non-matching
checksum is encountered. |
| strict_innodb | A checksum calculated in software, using the original algorithm from
InnoDB. | Any of the checksums generated by none,
innodb, or
crc32. InnoDB
prints an error message if a valid but non-matching
checksum is encountered. |
| strict_crc32 | A checksum calculated using the crc32 algorithm,
possibly done with a hardware assist. | Any of the checksums generated by none,
innodb, or
crc32. InnoDB
prints an error message if a valid but non-matching
checksum is encountered. |
The default value for
innodb_checksum_algorithm was changed from
innodb to crc32 in MySQL
5.6.6, but switched back to innodb in 5.6.7
for backward compatibility of InnoDB data
files, and for use with
MySQL Enterprise
Backup. The limitations encountered included:
.ibd files containing CRC32 checksums
could cause problems downgrading to MySQL versions prior
to 5.6.3. MySQL 5.6.3 and up recognizes either the new or
old checksum values for the block as correct when reading
the block from disk, ensuring that data blocks are
compatible during upgrade and downgrade regardless of the
algorithm setting. If data written with new checksum
values is processed by a version of MySQL earlier than
5.6.3, it could be reported as corrupted.
Versions of MySQL Enterprise Backup up to 3.8.0 do not support backing up tablespaces that use CRC32 checksums. MySQL Enterprise Backup adds CRC32 checksum support in 3.8.1, with some limitations. Refer to the MySQL Enterprise Backup 3.8.1 Change History for more information.
| Deprecated | 5.6.3 | ||
| Command-Line Format | --innodb_checksums | ||
| System Variable | Name | innodb_checksums | |
| Variable Scope | Global | ||
| Dynamic Variable | No | ||
| Permitted Values | Type | boolean | |
| Default | ON | ||
InnoDB can use
checksum validation on
all tablespace pages read from disk to ensure extra fault
tolerance against hardware faults or corrupted data files.
This validation is enabled by default. Under specialized
circumstances (such as when running benchmarks) this safety
feature can be disabled with
--skip-innodb-checksums. You can specify the
method of calculating the checksum using the
innodb_checksum_algorithm
option.
In MySQL 5.6.3 and higher, innodb_checksums
is deprecated, replaced by
innodb_checksum_algorithm.
innodb_checksum_algorithm=innodb is the
same as innodb_checksums=ON (the default).
innodb_checksum_algorithm=none is the same
as innodb_checksums=OFF. Remove
innodb_checksums options from your
configuration files and startup scripts to avoid conflicts
with innodb_checksum_algorithm:
innodb_checksums=OFF automatically sets
innodb_checksum_algorithm=none;
innodb_checksums=ON is ignored and
overridden by any other setting for
innodb_checksum_algorithm.
| Introduced | 5.6.7 | ||
| Command-Line Format | --innodb_cmp_per_index_enabled=# | ||
| System Variable | Name | innodb_cmp_per_index_enabled | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | boolean | |
| Default | OFF | ||
| Valid Values | OFF | ||
ON | |||
Enables per-index compression-related statistics in the
INFORMATION_SCHEMA.INNODB_CMP_PER_INDEX
table. Because these statistics can be expensive to gather,
only enable this option on development, test, or slave
instances during performance tuning related to
InnoDB
compressed tables.
For more information, see Section 21.29.6, “The INFORMATION_SCHEMA INNODB_CMP_PER_INDEX and INNODB_CMP_PER_INDEX_RESET Tables”, and Section 14.9.4, “Monitoring Compression at Runtime”.
| Command-Line Format | --innodb_commit_concurrency=# | ||
| System Variable | Name | innodb_commit_concurrency | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | integer | |
| Default | 0 | ||
| Min Value | 0 | ||
| Max Value | 1000 | ||
The number of threads that can commit at the same time. A value of 0 (the default) permits any number of transactions to commit simultaneously.
The value of innodb_commit_concurrency
cannot be changed at runtime from zero to nonzero or vice
versa. The value can be changed from one nonzero value to
another.
innodb_compression_failure_threshold_pct
| Introduced | 5.6.7 | ||
| Command-Line Format | --innodb_compression_failure_threshold_pct=# | ||
| System Variable | Name | innodb_compression_failure_threshold_pct | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | integer | |
| Default | 5 | ||
| Min Value | 0 | ||
| Max Value | 100 | ||
Sets the cutoff point at which MySQL begins adding padding within compressed pages to avoid expensive compression failures. A value of zero disables the mechanism that monitors compression efficiency and dynamically adjusts the padding amount.
For more information, see Section 14.9.6, “Compression for OLTP Workloads”.
| Introduced | 5.6.7 | ||
| Command-Line Format | --innodb_compression_level=# | ||
| System Variable | Name | innodb_compression_level | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | integer | |
| Default | 6 | ||
| Min Value | 0 | ||
| Max Value | 9 | ||
Specifies the level of zlib compression to use for
InnoDB
compressed tables and
indexes.
For more information, see Section 14.9.6, “Compression for OLTP Workloads”.
innodb_compression_pad_pct_max
| Introduced | 5.6.7 | ||
| Command-Line Format | --innodb_compression_pad_pct_max=# | ||
| System Variable | Name | innodb_compression_pad_pct_max | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | integer | |
| Default | 50 | ||
| Min Value | 0 | ||
| Max Value | 75 | ||
Specifies the maximum percentage that can be reserved as free
space within each compressed
page, allowing room to
reorganize the data and modification log within the page when
a compressed table or
index is updated and the data might be recompressed. Only
applies when
innodb_compression_failure_threshold_pct
is set to a non-zero value, and the rate of
compression
failures passes the cutoff point.
For more information, see Section 14.9.6, “Compression for OLTP Workloads”.
| Command-Line Format | --innodb_concurrency_tickets=# | ||
| System Variable | Name | innodb_concurrency_tickets | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values (<= 5.6.5) | Type | integer | |
| Default | 500 | ||
| Min Value | 1 | ||
| Max Value | 4294967295 | ||
| Permitted Values (>= 5.6.6) | Type | integer | |
| Default | 5000 | ||
| Min Value | 1 | ||
| Max Value | 4294967295 | ||
Determines the number of
threads that can enter
InnoDB concurrently. A thread is placed in
a queue when it tries to enter InnoDB if
the number of threads has already reached the concurrency
limit. When a thread is permitted to enter
InnoDB, it is given a number of “
tickets” equal to the value of
innodb_concurrency_tickets,
and the thread can enter and leave InnoDB
freely until it has used up its tickets. After that point, the
thread again becomes subject to the concurrency check (and
possible queuing) the next time it tries to enter
InnoDB. The default value is 5000 as of
MySQL 5.6.6, 500 before that.
With a small innodb_concurrency_tickets
value, small transactions that only need to process a few rows
compete fairly with larger transactions that process many
rows. The disadvantage of a small
innodb_concurrency_tickets value is that
large transactions must loop through the queue many times
before they can complete, which extends the amount of time
required to complete their task.
With a large innodb_concurrency_tickets
value, large transactions spend less time waiting for a
position at the end of the queue (controlled by
innodb_thread_concurrency)
and more time retrieving rows. Large transactions also require
fewer trips through the queue to complete their task. The
disadvantage of a large
innodb_concurrency_tickets value is that
too many large transactions running at the same time can
starve smaller transactions by making them wait a longer time
before executing.
With a non-zero
innodb_thread_concurrency
value, you may need to adjust the
innodb_concurrency_tickets value up or down
to find the optimal balance between larger and smaller
transactions. The SHOW ENGINE INNODB STATUS
report shows the number of tickets remaining for an executing
transaction in its current pass through the queue. This data
may also be obtained from the
TRX_CONCURRENCY_TICKETS column of the
INFORMATION_SCHEMA.INNODB_TRX
table.
For more information, see Section 14.6.6, “Configuring Thread Concurrency for InnoDB”.
| Command-Line Format | --innodb_data_file_path=name | ||
| System Variable | Name | innodb_data_file_path | |
| Variable Scope | Global | ||
| Dynamic Variable | No | ||
| Permitted Values (<= 5.6.6) | Type | string | |
| Default | ibdata1:10M:autoextend | ||
| Permitted Values (>= 5.6.7) | Type | string | |
| Default | ibdata1:12M:autoextend | ||
Defines the path and file size for individual
InnoDB
system
tablespace data
files. The full directory path for system tablespace
data files is formed by concatenating path defined by
innodb_data_home_dir and
innodb_data_file_path. File sizes are
specified KB, MB or GB (1024MB) by appending
K, M or
G to the size value. If specifying the data
file size in kilobytes (KB), do so in multiples of 1024.
Otherwise, KB values are rounded to nearest megabyte (MB)
boundary. The sum of the sizes of the files must be at least
slightly larger than 10MB. If you do not specify
innodb_data_file_path, the default behavior
is to create a single auto-extending data file, slightly
larger than 12MB, named ibdata1. The size
limit of individual files is determined by your operating
system. You can set the file size to more than 4GB on
operating systems that support large files. You can also
use raw disk partitions as
data files. For more information about configuring
system tablespace data files, see
Section 14.6.1, “InnoDB Startup Configuration”.
| Command-Line Format | --innodb_data_home_dir=dir_name | ||
| System Variable | Name | innodb_data_home_dir | |
| Variable Scope | Global | ||
| Dynamic Variable | No | ||
| Permitted Values | Type | directory name | |
The common part of the directory path for
InnoDB
system
tablespace data files. This setting does not affect the
location of
file-per-table
tablespaces when
innodb_file_per_table is
enabled. The default value is the MySQL
data directory. If you specify the value
as an empty string, you can specify an absolute file paths for
innodb_data_file_path.
For related information, see Section 14.6.1, “InnoDB Startup Configuration”.
innodb_disable_sort_file_cache
| Introduced | 5.6.4 | ||
| Command-Line Format | --innodb_disable_sort_file_cache=# | ||
| System Variable | Name | innodb_disable_sort_file_cache | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | boolean | |
| Default | OFF | ||
Disables the operating system file system cache for merge-sort
temporary files. The effect is to open such files with the
equivalent of O_DIRECT.
| Command-Line Format | --innodb-doublewrite | ||
| System Variable | Name | innodb_doublewrite | |
| Variable Scope | Global | ||
| Dynamic Variable | No | ||
| Permitted Values | Type | boolean | |
| Default | ON | ||
When enabled (the default), InnoDB stores
all data twice, first to the
doublewrite
buffer, then to the actual
data files. This
variable can be turned off with
--skip-innodb_doublewrite for benchmarks or
cases when top performance is needed rather than concern for
data integrity or possible failures.
For related information, see Section 14.4.7, “Doublewrite Buffer”.
| Command-Line Format | --innodb_fast_shutdown[=#] | ||
| System Variable | Name | innodb_fast_shutdown | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | integer | |
| Default | 1 | ||
| Valid Values | 0 | ||
1 | |||
2 | |||
The InnoDB
shutdown mode. If the
value is 0, InnoDB does a
slow shutdown, a
full purge and a change
buffer merge before shutting down. If the value is 1 (the
default), InnoDB skips these operations at
shutdown, a process known as a
fast shutdown. If
the value is 2, InnoDB flushes its logs and
shuts down cold, as if MySQL had crashed; no committed
transactions are lost, but the
crash recovery
operation makes the next startup take longer.
The slow shutdown can take minutes, or even hours in extreme cases where substantial amounts of data are still buffered. Use the slow shutdown technique before upgrading or downgrading between MySQL major releases, so that all data files are fully prepared in case the upgrade process updates the file format.
Use innodb_fast_shutdown=2 in emergency or
troubleshooting situations, to get the absolute fastest
shutdown if data is at risk of corruption.
innodb_fil_make_page_dirty_debug
| Introduced | 5.6.17 | ||
| Command-Line Format | --innodb_fil_make_page_dirty_debug=# | ||
| System Variable | Name | innodb_fil_make_page_dirty_debug | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | integer | |
| Default | 0 | ||
| Max Value | 2**32-1 | ||
By default, setting
innodb_fil_make_page_dirty_debug to the ID
of a tablespace immediately dirties the first page of the
tablespace. If
innodb_saved_page_number_debug
is set to a non-default value, setting
innodb_fil_make_page_dirty_debug dirties
the specified page. The
innodb_fil_make_page_dirty_debug option is
only available if debugging support is compiled in using the
WITH_DEBUG
CMake option.
| Command-Line Format | --innodb_file_format=# | ||
| System Variable | Name | innodb_file_format | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | string | |
| Default | Antelope | ||
| Valid Values | Antelope | ||
Barracuda | |||
Enables an InnoDB file format for
file-per-table
tablespaces. Supported file formats are
Antelope and Barracuda.
Antelope is the original
InnoDB file format, which supports
REDUNDANT and COMPACT
row formats for InnoDB tables.
Barracuda is the newer file format, which
supports COMPRESSED and
DYNAMIC row formats.
COMPRESSED and DYNAMIC
row formats enable important storage features for
InnoDB tables. See
Section 14.11, “InnoDB Row Storage and Row Formats”.
To create tables that use COMPRESSED or
DYNAMIC row format, the
Barracuda file format and
innodb_file_per_table must be
enabled.
Changing the
innodb_file_format setting
does not affect the file format of existing
InnoDB tablespace files.
For more information, see Section 14.10, “InnoDB File-Format Management”.
| Command-Line Format | --innodb_file_format_check=# | ||
| System Variable | Name | innodb_file_format_check | |
| Variable Scope | Global | ||
| Dynamic Variable | No | ||
| Permitted Values | Type | boolean | |
| Default | ON | ||
This variable can be set to 1 or 0 at server startup to enable
or disable whether InnoDB checks the
file format tag in the
system
tablespace (for example, Antelope or
Barracuda). If the tag is checked and is
higher than that supported by the current version of
InnoDB, an error occurs and
InnoDB does not start. If the tag is not
higher, InnoDB sets the value of
innodb_file_format_max to the
file format tag.
Despite the default value sometimes being displayed as
ON or OFF, always use
the numeric values 1 or 0 to turn this option on or off in
your configuration file or command line string.
For more information, see Section 14.10.2.1, “Compatibility Check When InnoDB Is Started”.
| Command-Line Format | --innodb_file_format_max=# | ||
| System Variable | Name | innodb_file_format_max | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | string | |
| Default | Antelope | ||
| Valid Values | Antelope | ||
Barracuda | |||
At server startup, InnoDB sets the value of
this variable to the file
format tag in the
system
tablespace (for example, Antelope or
Barracuda). If the server creates or opens
a table with a “higher” file format, it sets the
value of
innodb_file_format_max to
that format.
For related information, see Section 14.10, “InnoDB File-Format Management”.
| Command-Line Format | --innodb_file_per_table | ||
| System Variable | Name | innodb_file_per_table | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values (<= 5.6.5) | Type | boolean | |
| Default | OFF | ||
| Permitted Values (>= 5.6.6) | Type | boolean | |
| Default | ON | ||
When innodb_file_per_table is enabled (the
default), InnoDB stores the data and
indexes for each newly created table in a separate
.ibd
file instead of the system tablespace. The storage for
these tables is reclaimed when the tables are dropped or
truncated. This setting enables
InnoDBfeatures such as table
compression. See
Section 14.7.4, “InnoDB File-Per-Table Tablespaces” for more
information.
Enabling
innodb_file_per_table also
means that an ALTER TABLE
operation moves an InnoDB table from the
system tablespace to an individual .ibd
file in cases where ALTER TABLE
rebuilds the table (ALGORITHM=COPY).
When innodb_file_per_table is disabled,
InnoDB stores the data for tables and
indexes in the ibdata
files that make up the
system
tablespace. This setting reduces the performance
overhead of file system operations for operations such as
DROP TABLE or
TRUNCATE TABLE. It is most
appropriate for a server environment where entire storage
devices are devoted to MySQL data. Because the system
tablespace never shrinks, and is shared across all databases
in an instance, avoid
loading huge amounts of temporary data on a space-constrained
system when innodb_file_per_table is
disabled. Set up a separate instance in such cases, so that
you can drop the entire instance to reclaim the space.
innodb_file_per_table is enabled by default
as of MySQL 5.6.6. Consider disabling it if backward
compatibility with MySQL 5.5 or 5.1 is a concern. This will
prevent ALTER TABLE from moving
InnoDB tables from the system
tablespace to individual .ibd files.
innodb_file_per_table is
dynamic and can be set ON or
OFF using SET GLOBAL.
You can also set this option in the MySQL
configuration
file (my.cnf or
my.ini) but this requires shutting down
and restarting the server.
Dynamically changing the value requires the
SUPER privilege and immediately affects the
operation of all connections.
| Introduced | 5.6.6 | ||
| System Variable | Name | innodb_flush_log_at_timeout | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | integer | |
| Default | 1 | ||
| Min Value | 1 | ||
| Max Value | 2700 | ||
Write and flush the logs every N
seconds. innodb_flush_log_at_timeout allows
the timeout period between flushes to be increased in order to
reduce flushing and avoid impacting performance of binary log
group commit. Prior to the introduction of this configuration
option, flushing frequency was once per second. The default
setting for
innodb_flush_log_at_timeout
is also once per second.
innodb_flush_log_at_trx_commit
| Command-Line Format | --innodb_flush_log_at_trx_commit[=#] | ||
| System Variable | Name | innodb_flush_log_at_trx_commit | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | enumeration | |
| Default | 1 | ||
| Valid Values | 0 | ||
1 | |||
2 | |||
Controls the balance between strict ACID compliance for commit operations and higher performance that is possible when commit-related I/O operations are rearranged and done in batches. You can achieve better performance by changing the default value but then you can lose up to a second of transactions in a crash.
The default value of 1 is required for full ACID
compliance. With this value, the contents of the
InnoDB
log buffer are
written out to the log
file at each transaction commit and the log file is
flushed to disk.
With a value of 0, the contents of the
InnoDB log buffer are written to the
log file approximately once per second and the log file is
flushed to disk. No writes from the log buffer to the log
file are performed at transaction commit. Once-per-second
flushing is not guaranteed to happen every second due to
process scheduling issues. Because the flush to disk
operation only occurs approximately once per second, you
can lose up to a second of transactions with any
mysqld process crash.
With a value of 2, the contents of the
InnoDB log buffer are written to the
log file after each transaction commit and the log file is
flushed to disk approximately once per second.
Once-per-second flushing is not 100% guaranteed to happen
every second, due to process scheduling issues. Because
the flush to disk operation only occurs approximately once
per second, you can lose up to a second of transactions in
an operating system crash or a power outage.
InnoDB log flushing frequency is
controlled by
innodb_flush_log_at_timeout,
which allows you to set log flushing frequency to
N seconds (where
N is 1 ...
2700, with a default value of 1). However, any
mysqld process crash can erase up to
N seconds of transactions.
DDL changes and other internal InnoDB
activities flush the InnoDB log
independent of the
innodb_flush_log_at_trx_commit setting.
InnoDB
crash recovery
works regardless of the
innodb_flush_log_at_trx_commit setting.
Transactions are either applied entirely or erased
entirely.
For durability and consistency in a replication setup that
uses InnoDB with transactions:
If binary logging is enabled, set
sync_binlog=1.
Always set
innodb_flush_log_at_trx_commit=1.
Many operating systems and some disk hardware fool the
flush-to-disk operation. They may tell
mysqld that the flush has taken place,
even though it has not. In this case, the durability of
transactions is not guaranteed even with the setting 1, and
in the worst case, a power outage can corrupt
InnoDB data. Using a battery-backed disk
cache in the SCSI disk controller or in the disk itself
speeds up file flushes, and makes the operation safer. You
can also try to disable the caching of disk writes in
hardware caches.
| Command-Line Format | --innodb_flush_method=name | ||
| System Variable | Name | innodb_flush_method | |
| Variable Scope | Global | ||
| Dynamic Variable | No | ||
| Permitted Values (Unix, <= 5.6.6) | Type | string | |
| Default | NULL | ||
| Valid Values | fsync | ||
littlesync | |||
nosync | |||
O_DSYNC | |||
O_DIRECT | |||
| Permitted Values (Unix, >= 5.6.7) | Type | string | |
| Default | NULL | ||
| Valid Values | fsync | ||
O_DSYNC | |||
littlesync | |||
nosync | |||
O_DIRECT | |||
O_DIRECT_NO_FSYNC | |||
| Permitted Values (Windows) | Type | string | |
| Default | NULL | ||
| Valid Values | async_unbuffered | ||
normal | |||
unbuffered | |||
Defines the method used to
flush data to
InnoDB data
files and log
files, which can affect I/O throughput. This variable
is only configurable on Unix and Linux systems.
If innodb_flush_method is set to
NULL on a Unix-like system, the
fsync option is used by default. If
innodb_flush_method is set to
NULL on Windows, the
async_unbuffered option is used by default.
If innodb_flush_method=NULL on a Unix-like
system, the fdatasync option is used by
default. If innodb_flush_method=NULL on
Windows, the async_unbuffered option is
used by default.
The innodb_flush_method options for
Unix-like systems include:
fsync: InnoDB uses
the fsync() system call to flush both
the data and log files. fsync is the
default setting.
O_DSYNC: InnoDB uses
O_SYNC to open and flush the log files,
and fsync() to flush the data files.
InnoDB does not use
O_DSYNC directly because there have
been problems with it on many varieties of Unix.
littlesync: This option is used for
internal performance testing and is currently unsupported.
Use at your own risk.
nosync: This option is used for
internal performance testing and is currently unsupported.
Use at your own risk.
O_DIRECT: InnoDB
uses O_DIRECT (or
directio() on Solaris) to open the data
files, and uses fsync() to flush both
the data and log files. This option is available on some
GNU/Linux versions, FreeBSD, and Solaris.
O_DIRECT_NO_FSYNC:
InnoDB uses O_DIRECT
during flushing I/O, but skips the
fsync() system call afterward. This
setting is suitable for some types of file systems but not
others. For example, it is not suitable for XFS. If you
are not sure whether the file system you use requires an
fsync(), for example to preserve all
file metadata, use O_DIRECT instead.
The innodb_flush_method options for Windows
systems include:
async_unbuffered:
InnoDB uses Windows asynchronous I/O
and non-buffered I/O. async_unbuffered
is the default setting on Windows systems.
normal: InnoDB uses
simulated asynchronous I/O and buffered I/O. This option
is used for internal performance testing and is currently
unsupported. Use at your own risk.
unbuffered: InnoDB
uses simulated asynchronous I/O and non-buffered I/O. This
option is used for internal performance testing and is
currently unsupported. Use at your own risk.
How each setting affects performance depends on hardware
configuration and workload. Benchmark your particular
configuration to decide which setting to use, or whether to
keep the default setting. Examine the
Innodb_data_fsyncs status
variable to see the overall number of
fsync() calls for each setting. The mix of
read and write operations in your workload can affect how a
setting performs. For example, on a system with a hardware
RAID controller and battery-backed write cache,
O_DIRECT can help to avoid double buffering
between the InnoDB buffer pool and the
operating system file system cache. On some systems where
InnoDB data and log files are located on a
SAN, the default value or O_DSYNC might be
faster for a read-heavy workload with mostly
SELECT statements. Always test this
parameter with hardware and workload that reflect your
production environment. For general I/O tuning advice, see
Section 8.5.8, “Optimizing InnoDB Disk I/O”.
| Introduced | 5.6.3 | ||
| Command-Line Format | --innodb_flush_neighbors | ||
| System Variable | Name | innodb_flush_neighbors | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | enumeration | |
| Default | 1 | ||
| Valid Values | 0 | ||
1 | |||
2 | |||
Specifies whether flushing a
page from the InnoDB
buffer pool also
flushes other dirty
pages in the same
extent.
The default value of 1 flushes contiguous dirty pages in the same extent from the buffer pool.
A setting of 0 turns
innodb_flush_neighbors off and no other
dirty pages are flushed from the buffer pool.
A setting of 2 flushes dirty pages in the same extent from the buffer pool.
When the table data is stored on a traditional HDD storage device, flushing such neighbor pages in one operation reduces I/O overhead (primarily for disk seek operations) compared to flushing individual pages at different times. For table data stored on SSD, seek time is not a significant factor and you can turn this setting off to spread out write operations. For related information, see Section 14.6.3.6, “Fine-tuning InnoDB Buffer Pool Flushing”.
| Introduced | 5.6.6 | ||
| Command-Line Format | --innodb_flushing_avg_loops=# | ||
| System Variable | Name | innodb_flushing_avg_loops | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | integer | |
| Default | 30 | ||
| Min Value | 1 | ||
| Max Value | 1000 | ||
Number of iterations for which InnoDB keeps
the previously calculated snapshot of the flushing state,
controlling how quickly
adaptive
flushing responds to changing
workloads. Increasing the
value makes the rate of
flush operations change
smoothly and gradually as the workload changes. Decreasing the
value makes adaptive flushing adjust quickly to workload
changes, which can cause spikes in flushing activity if the
workload increases and decreases suddenly.
For related information, see Section 14.6.3.6, “Fine-tuning InnoDB Buffer Pool Flushing”.
| Introduced | 5.6.3 | ||
| Command-Line Format | --innodb_force_load_corrupted | ||
| System Variable | Name | innodb_force_load_corrupted | |
| Variable Scope | Global | ||
| Dynamic Variable | No | ||
| Permitted Values | Type | boolean | |
| Default | OFF | ||
Permits InnoDB to load tables at startup
that are marked as corrupted. Use only during troubleshooting,
to recover data that is otherwise inaccessible. When
troubleshooting is complete, disable this setting and restart
the server.
| Command-Line Format | --innodb_force_recovery=# | ||
| System Variable | Name | innodb_force_recovery | |
| Variable Scope | Global | ||
| Dynamic Variable | No | ||
| Permitted Values | Type | integer | |
| Default | 0 | ||
| Min Value | 0 | ||
| Max Value | 6 | ||
The crash recovery
mode, typically only changed in serious troubleshooting
situations. Possible values are from 0 to 6. For the meanings
of these values and important information about
innodb_force_recovery, see
Section 14.21.2, “Forcing InnoDB Recovery”.
Only set this variable to a value greater than 0 in an
emergency situation so that you can start
InnoDB and dump your tables. As a safety
measure, InnoDB prevents
INSERT,
UPDATE, or
DELETE operations when
innodb_force_recovery is greater than 0.
As of 5.6.15, an innodb_force_recovery
setting of 4 or greater places InnoDB
into read-only mode.
These restrictions may cause replication administration
commands to fail with an error, as replication options such
as
--relay-log-info-repository=TABLE
and
--master-info-repository=TABLE
store information in InnoDB tables.
| Introduced | 5.6.4 | ||
| System Variable | Name | innodb_ft_aux_table | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | string | |
Specifies the qualified name of an InnoDB
table containing a FULLTEXT index. This
variable is intended for diagnostic purposes and can only be
set at runtime. For example:
SET GLOBAL innodb_ft_aux_table = 'test/t1';
Attempting to set this variable at startup will result in a
“mysqld: option '--innodb-ft-aux-table'
cannot take an argument” error and startup
will abort. After you set this variable to a name in the
format
,
the db_name/table_nameINFORMATION_SCHEMA tables
INNODB_FT_INDEX_TABLE,
INNODB_FT_INDEX_CACHE,
INNODB_FT_CONFIG,
INNODB_FT_DELETED, and
INNODB_FT_BEING_DELETED show
information about the search index for the specified table.
For more information, see Section 14.15.4, “InnoDB INFORMATION_SCHEMA FULLTEXT Index Tables”.
| Introduced | 5.6.4 | ||
| Command-Line Format | --innodb_ft_cache_size=# | ||
| System Variable | Name | innodb_ft_cache_size | |
| Variable Scope | Global | ||
| Dynamic Variable | No | ||
| Permitted Values (>= 5.6.4, <= 5.6.9) | Type | integer | |
| Default | 32000000 | ||
| Permitted Values (>= 5.6.10) | Type | integer | |
| Default | 8000000 | ||
| Min Value | 1600000 | ||
| Max Value | 80000000 | ||
The memory allocated, in bytes, for the
InnoDB FULLTEXT search index cache, which
holds a parsed document in memory while creating an
InnoDB FULLTEXT index.
Index inserts and updates are only committed to disk when the
innodb_ft_cache_size size limit is reached.
innodb_ft_cache_size defines the cache size
on a per table basis. To set a global limit for all tables,
see
innodb_ft_total_cache_size.
For more information, see InnoDB Full-Text Index Cache.
| Introduced | 5.6.4 | ||
| Command-Line Format | --innodb_ft_enable_diag_print=# | ||
| System Variable | Name | innodb_ft_enable_diag_print | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values (<= 5.6.6) | Type | boolean | |
| Default | ON | ||
| Permitted Values (>= 5.6.7) | Type | boolean | |
| Default | OFF | ||
Whether to enable additional full-text search (FTS) diagnostic output. This option is primarily intended for advanced FTS debugging and will not be of interest to most users. Output is printed to the error log and includes information such as:
FTS index sync progress (when the FTS cache limit is reached). For example:
FTS SYNC for table test, deleted count: 100 size: 10000 bytes SYNC words: 100
FTS optimize progress. For example:
FTS start optimize test FTS_OPTIMIZE: optimize "mysql" FTS_OPTIMIZE: processed "mysql"
FTS index build progress. For example:
Number of doc processed: 1000
For FTS queries, the query parsing tree, word weight, query processing time, and memory usage are printed. For example:
FTS Search Processing time: 1 secs: 100 millisec: row(s) 10000 Full Search Memory: 245666 (bytes), Row: 10000
| Introduced | 5.6.4 | ||
| Command-Line Format | --innodb_ft_enable_stopword=# | ||
| System Variable | Name | innodb_ft_enable_stopword | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | boolean | |
| Default | ON | ||
Specifies that a set of
stopwords is associated
with an InnoDB FULLTEXT
index at the time the index is created. If the
innodb_ft_user_stopword_table
option is set, the stopwords are taken from that table. Else,
if the
innodb_ft_server_stopword_table
option is set, the stopwords are taken from that table.
Otherwise, a built-in set of default stopwords is used.
For more information, see Section 12.9.4, “Full-Text Stopwords”.
| Introduced | 5.6.4 | ||
| Command-Line Format | --innodb_ft_max_token_size=# | ||
| System Variable | Name | innodb_ft_max_token_size | |
| Variable Scope | Global | ||
| Dynamic Variable | No | ||
| Permitted Values (>= 5.6.4, <= 5.6.13) | Type | integer | |
| Default | 84 | ||
| Min Value | 10 | ||
| Max Value | 252 | ||
| Permitted Values (>= 5.6.14) | Type | integer | |
| Default | 84 | ||
| Min Value | 10 | ||
| Max Value | 84 | ||
Maximum character length of words that are stored in an
InnoDB
FULLTEXT index. Setting a limit on this
value reduces the size of the index, thus speeding up queries,
by omitting long keywords or arbitrary collections of letters
that are not real words and are not likely to be search terms.
For more information, see Section 12.9.6, “Fine-Tuning MySQL Full-Text Search”.
| Introduced | 5.6.4 | ||
| Command-Line Format | --innodb_ft_min_token_size=# | ||
| System Variable | Name | innodb_ft_min_token_size | |
| Variable Scope | Global | ||
| Dynamic Variable | No | ||
| Permitted Values | Type | integer | |
| Default | 3 | ||
| Min Value | 0 | ||
| Max Value | 16 | ||
Minimum length of words that are stored in an
InnoDB FULLTEXT index.
Increasing this value reduces the size of the index, thus
speeding up queries, by omitting common words that are
unlikely to be significant in a search context, such as the
English words “a” and “to”. For
content using a CJK (Chinese, Japanese, Korean) character set,
specify a value of 1.
For more information, see Section 12.9.6, “Fine-Tuning MySQL Full-Text Search”.
| Introduced | 5.6.4 | ||
| Command-Line Format | --innodb_ft_num_word_optimize=# | ||
| System Variable | Name | innodb_ft_num_word_optimize | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | integer | |
| Default | 2000 | ||
Number of words to process during each
OPTIMIZE TABLE operation on an
InnoDB FULLTEXT index.
Because a bulk insert or update operation to a table
containing a full-text search index could require substantial
index maintenance to incorporate all changes, you might do a
series of OPTIMIZE TABLE
statements, each picking up where the last left off.
For more information, see Section 12.9.6, “Fine-Tuning MySQL Full-Text Search”.
| Introduced | 5.6.13 | ||
| Command-Line Format | --innodb_ft_result_cache_limit=# | ||
| System Variable | Name | innodb_ft_result_cache_limit | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values (>= 5.6.17) | Type | integer | |
| Default | 2000000000 | ||
| Min Value | 1000000 | ||
| Max Value | 2**32-1 | ||
| Permitted Values (Unix, 32-bit platforms, >= 5.6.13, <= 5.6.16) | Type | integer | |
| Default | 2000000000 | ||
| Min Value | 1000000 | ||
| Max Value | 2**32-1 | ||
| Permitted Values (Unix, 64-bit platforms, >= 5.6.13, <= 5.6.16) | Type | integer | |
| Default | 2000000000 | ||
| Min Value | 1000000 | ||
| Max Value | 2**64-1 | ||
| Permitted Values (Windows, >= 5.6.13, <= 5.6.16) | Type | integer | |
| Default | 2000000000 | ||
| Min Value | 1000000 | ||
| Max Value | 2**32-1 | ||
The InnoDB full-text search query result
cache limit (defined in bytes) per full-text search query or
per thread. Intermediate and final InnoDB
full-text search query results are handled in memory. Use
innodb_ft_result_cache_limit to place a
size limit on the full-text search query result cache to avoid
excessive memory consumption in case of very large
InnoDB full-text search query results
(millions or hundreds of millions of rows, for example).
Memory is allocated as required when a full-text search query
is processed. If the result cache size limit is reached, an
error is returned indicating that the query exceeds the
maximum allowed memory.
As of MySQL 5.6.17, the maximum value of
innodb_ft_result_cache_limit for all
platform types and bit sizes is 2**32-1.
innodb_ft_server_stopword_table
| Introduced | 5.6.4 | ||
| Command-Line Format | --innodb_ft_server_stopword_table=db_name/table_name | ||
| System Variable | Name | innodb_ft_server_stopword_table | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | string | |
| Default | NULL | ||
This option is used to specify your own
InnoDB FULLTEXT index
stopword list for all InnoDB tables. To
configure your own stopword list for a specific
InnoDB table, use
innodb_ft_user_stopword_table.
Set innodb_ft_server_stopword_table to the
name of the table containing a list of stopwords, in the
format
.
db_name/table_name
The stopword table must exist before you configure
innodb_ft_server_stopword_table.
innodb_ft_enable_stopword must be enabled
and innodb_ft_server_stopword_table option
must be configured before you create the
FULLTEXT index.
The stopword table must be an InnoDB table,
containing a single VARCHAR column named
value.
For more information, see Section 12.9.4, “Full-Text Stopwords”.
| Introduced | 5.6.4 | ||
| Command-Line Format | --innodb_ft_sort_pll_degree=# | ||
| System Variable | Name | innodb_ft_sort_pll_degree | |
| Variable Scope | Global | ||
| Dynamic Variable | No | ||
| Permitted Values | Type | integer | |
| Default | 2 | ||
| Min Value | 1 | ||
| Max Value | 32 | ||
Number of threads used in parallel to index and tokenize text
in an InnoDB FULLTEXT
index when building a search
index.
For related information, see
Section 14.8.10, “InnoDB FULLTEXT Indexes”, and
innodb_sort_buffer_size.
| Introduced | 5.6.13 | ||
| Command-Line Format | --innodb_ft_total_cache_size=# | ||
| System Variable | Name | innodb_ft_total_cache_size | |
| Variable Scope | Global | ||
| Dynamic Variable | No | ||
| Permitted Values | Type | integer | |
| Default | 640000000 | ||
| Min Value | 32000000 | ||
| Max Value | 1600000000 | ||
The total memory allocated, in bytes, for the
InnoDB full-text search index cache for all
tables. Creating numerous tables, each with a
FULLTEXT search index, could consume a
significant portion of available memory.
innodb_ft_total_cache_size
defines a global memory limit for all full-text search indexes
to help avoid excessive memory consumption. If the global
limit is reached by an index operation, a forced sync is
triggered.
For more information, see InnoDB Full-Text Index Cache.
| Introduced | 5.6.4 | ||
| Command-Line Format | --innodb_ft_user_stopword_table=db_name/table_name | ||
| System Variable | Name | innodb_ft_user_stopword_table | |
| Variable Scope | Global, Session | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | string | |
| Default | NULL | ||
This option is used to specify your own
InnoDB FULLTEXT index
stopword list on a specific table. To configure your own
stopword list for all InnoDB tables, use
innodb_ft_server_stopword_table.
Set innodb_ft_user_stopword_table to the
name of the table containing a list of stopwords, in the
format
.
db_name/table_name
The stopword table must exist before you configure
innodb_ft_user_stopword_table.
innodb_ft_enable_stopword must be enabled
and innodb_ft_user_stopword_table must be
configured before you create the FULLTEXT
index.
The stopword table must be an InnoDB table,
containing a single VARCHAR column named
value.
For more information, see Section 12.9.4, “Full-Text Stopwords”.
| Command-Line Format | --innodb_io_capacity=# | ||
| System Variable | Name | innodb_io_capacity | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values (32-bit platforms) | Type | integer | |
| Default | 200 | ||
| Min Value | 100 | ||
| Max Value | 2**32-1 | ||
| Permitted Values (64-bit platforms) | Type | integer | |
| Default | 200 | ||
| Min Value | 100 | ||
| Max Value | 2**64-1 | ||
The innodb_io_capacity
parameter sets an upper limit on I/O activity performed by
InnoDB background tasks, such as
flushing pages from the
buffer pool and
merging data from the
change buffer.
The innodb_io_capacity limit
is a total limit for all buffer pool instances. When dirty
pages are flushed, the limit is divided equally among buffer
pool instances.
innodb_io_capacity should be
set to approximately the number of I/O operations that the
system can perform per second. Ideally, keep the setting as
low as practical, but not so low that background activities
fall behind. If the value is too high, data is removed from
the buffer pool and insert buffer too quickly for caching to
provide a significant benefit.
The default value is 200. For busy systems capable of higher I/O rates, you can set a higher value to help the server handle the background maintenance work associated with a high rate of row changes.
In general, you can increase the value as a function of the
number of drives used for InnoDB
I/O. For example, you can increase the value on systems that
use multiple disks or solid-state disks (SSD).
The default setting of 200 is generally sufficient for a
lower-end SSD. For a higher-end, bus-attached SSD, consider a
higher setting such as 1000, for example. For systems with
individual 5400 RPM or 7200 RPM drives, you might lower the
value to 100, which represents an estimated
proportion of the I/O operations per second (IOPS) available
to older-generation disk drives that can perform about 100
IOPS.
Although you can specify a very high value such as one million, in practice such large values have little if any benefit. Generally, a value of 20000 or higher is not recommended unless you have proven that lower values are insufficient for your workload.
Consider write workload when tuning
innodb_io_capacity. Systems
with large write workloads are likely to benefit from a higher
setting. A lower setting may be sufficient for systems with a
small write workload.
You can set innodb_io_capacity to any
number 100 or greater to a maximum defined by
innodb_io_capacity_max.
innodb_io_capacity can be set in the MySQL
option file (my.cnf or
my.ini) or changed dynamically using a
SET GLOBAL statement, which requires the
SUPER privilege.
See Section 14.6.8, “Configuring the InnoDB Master Thread I/O Rate” for
more information. For general information about
InnoDB I/O performance, see
Section 8.5.8, “Optimizing InnoDB Disk I/O”.
| Introduced | 5.6.6 | ||
| Command-Line Format | --innodb_io_capacity_max=# | ||
| System Variable | Name | innodb_io_capacity_max | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values (32-bit platforms) | Type | integer | |
| Default | see description | ||
| Min Value | 100 | ||
| Max Value | 2**32-1 | ||
| Permitted Values (Unix, 64-bit platforms) | Type | integer | |
| Default | see description | ||
| Min Value | 100 | ||
| Max Value | 2**64-1 | ||
| Permitted Values (Windows, 64-bit platforms) | Type | integer | |
| Default | see description | ||
| Min Value | 100 | ||
| Max Value | 2**32-1 | ||
If flushing activity falls behind, InnoDB
can flush more aggressively than the limit imposed by
innodb_io_capacity.
innodb_io_capacity_max defines an upper
limit for I/O capacity in such situations.
The innodb_io_capacity_max
setting is a total limit for all buffer pool instances.
If you specify an
innodb_io_capacity setting at
startup but do not specify a value for
innodb_io_capacity_max,
innodb_io_capacity_max defaults to twice
the value of
innodb_io_capacity, with a
minimum value of 2000.
When configuring innodb_io_capacity_max,
twice the innodb_io_capacity
is often a good starting point. The default value of 2000 is
intended for workloads that use a solid-state disk (SSD) or
more than one regular disk drive. A setting of 2000 is likely
too high for workloads that do not use SSD or multiple disk
drives, and could allow too much flushing. For a single
regular disk drive, a setting between 200 and 400 is
recommended. For a high-end, bus-attached SSD, consider a
higher setting such as 2500. As with the
innodb_io_capacity setting,
keep the setting as low as practical, but not so low that
InnoDB cannot sufficiently extend beyond
the innodb_io_capacity limit,
if necessary.
Consider write workload when tuning
innodb_io_capacity_max. Systems with large
write workloads may benefit from a higher setting. A lower
setting may be sufficient for systems with a small write
workload.
innodb_io_capacity_max cannot
be set to a value lower than the
innodb_io_capacity value.
Setting
innodb_io_capacity_max to
DEFAULT using a
SET
statement (SET GLOBAL
innodb_io_capacity_max=DEFAULT) sets
innodb_io_capacity_max to the
maximum value.
For a brief period during MySQL 5.6 development, this variable
was known as innodb_max_io_capacity. In
MySQL 5.6.7, it was renamed to
innodb_io_capacity_max, to
emphasize its relationship to the
innodb_io_capacity option.
For related information, see Section 14.6.3.6, “Fine-tuning InnoDB Buffer Pool Flushing”.
| Introduced | 5.6.3 | ||
| Command-Line Format | --innodb_large_prefix | ||
| System Variable | Name | innodb_large_prefix | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | boolean | |
| Default | OFF | ||
Enable this option to allow index key prefixes longer than 767
bytes (up to 3072 bytes) for InnoDB tables
that use
DYNAMIC
or
COMPRESSED
row format. (Creating such tables also requires the option
values
innodb_file_format=barracuda
and
innodb_file_per_table=true.)
See Section 14.8.8, “Limits on InnoDB Tables” for maximums
associated with index key prefixes under various settings.
For tables that use
REDUNDANT
or
COMPACT
row format, this option does not affect the permitted index
key prefix length.
innodb_limit_optimistic_insert_debug
| Command-Line Format | --innodb_limit_optimistic_insert_debug=# | ||
| System Variable | Name | innodb_limit_optimistic_insert_debug | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | integer | |
| Default | 0 | ||
| Min Value | 0 | ||
| Max Value | 2**32-1 | ||
Limits the number of records per
B-tree page. A default
value of 0 means that no limit is imposed. This option is only
available if debugging support is compiled in using the
WITH_DEBUG
CMake option.
| Command-Line Format | --innodb_lock_wait_timeout=# | ||
| System Variable | Name | innodb_lock_wait_timeout | |
| Variable Scope | Global, Session | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | integer | |
| Default | 50 | ||
| Min Value | 1 | ||
| Max Value | 1073741824 | ||
The length of time in seconds an InnoDB
transaction waits for
a row lock before giving
up. The default value is 50 seconds. A transaction that tries
to access a row that is locked by another
InnoDB transaction waits at most this many
seconds for write access to the row before issuing the
following error:
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
When a lock wait timeout occurs, the current statement is
rolled back (not the
entire transaction). To have the entire transaction roll back,
start the server with the
--innodb_rollback_on_timeout
option. See also Section 14.21.4, “InnoDB Error Handling”.
You might decrease this value for highly interactive applications or OLTP systems, to display user feedback quickly or put the update into a queue for processing later. You might increase this value for long-running back-end operations, such as a transform step in a data warehouse that waits for other large insert or update operations to finish.
innodb_lock_wait_timeout applies to
InnoDB row locks only. A MySQL
table lock does not
happen inside InnoDB and this timeout does
not apply to waits for table locks.
The lock wait timeout value does not apply to
deadlocks, because
InnoDB detects them immediately and rolls
back one of the deadlocked transactions. See
Section 14.5.5.2, “Deadlock Detection and Rollback”.
innodb_lock_wait_timeout can
be set at runtime with the SET GLOBAL or
SET SESSION statement. Changing the
GLOBAL setting requires the
SUPER privilege and affects the operation
of all clients that subsequently connect. Any client can
change the SESSION setting for
innodb_lock_wait_timeout,
which affects only that client.
innodb_locks_unsafe_for_binlog
| Deprecated | 5.6.3 | ||
| Command-Line Format | --innodb_locks_unsafe_for_binlog | ||
| System Variable | Name | innodb_locks_unsafe_for_binlog | |
| Variable Scope | Global | ||
| Dynamic Variable | No | ||
| Permitted Values | Type | boolean | |
| Default | OFF | ||
This variable affects how InnoDB uses
gap locking for searches
and index scans.
innodb_locks_unsafe_for_binlog is
deprecated and will be removed in a future MySQL release.
Normally, InnoDB uses an algorithm called
next-key locking that combines index-row locking with
gap locking.
InnoDB performs row-level locking in such a
way that when it searches or scans a table index, it sets
shared or exclusive locks on the index records it encounters.
Thus, row-level locks are actually index-record locks. In
addition, a next-key lock on an index record also affects the
gap before the index record. That is, a next-key lock is an
index-record lock plus a gap lock on the gap preceding the
index record. If one session has a shared or exclusive lock on
record R in an index, another session
cannot insert a new index record in the gap immediately before
R in the index order. See
Section 14.5.1, “InnoDB Locking”.
By default, the value of
innodb_locks_unsafe_for_binlog is 0
(disabled), which means that gap locking is enabled:
InnoDB uses next-key locks for searches and
index scans. To enable the variable, set it to 1. This causes
gap locking to be disabled: InnoDB uses
only index-record locks for searches and index scans.
Enabling innodb_locks_unsafe_for_binlog
does not disable the use of gap locking for foreign-key
constraint checking or duplicate-key checking.
The effects of enabling
innodb_locks_unsafe_for_binlog are the same
as setting the transaction isolation level to
READ COMMITTED, with these
exceptions:
Enabling
innodb_locks_unsafe_for_binlog
is a global setting and affects all sessions, whereas the
isolation level can be set globally for all sessions, or
individually per session.
innodb_locks_unsafe_for_binlog
can be set only at server startup, whereas the isolation
level can be set at startup or changed at runtime.
READ COMMITTED therefore
offers finer and more flexible control than
innodb_locks_unsafe_for_binlog.
For more information about the effect of isolation level on
gap locking, see
Section 14.5.2.1, “Transaction Isolation Levels”.
Enabling innodb_locks_unsafe_for_binlog may
cause phantom problems because other sessions can insert new
rows into the gaps when gap locking is disabled. Suppose that
there is an index on the id column of the
child table and that you want to read and
lock all rows from the table having an identifier value larger
than 100, with the intention of updating some column in the
selected rows later:
SELECT * FROM child WHERE id > 100 FOR UPDATE;
The query scans the index starting from the first record where
the id is greater than 100. If the locks
set on the index records in that range do not lock out inserts
made in the gaps, another session can insert a new row into
the table. Consequently, if you were to execute the same
SELECT again within the same
transaction, you would see a new row in the result set
returned by the query. This also means that if new items are
added to the database, InnoDB does not
guarantee serializability. Therefore, if
innodb_locks_unsafe_for_binlog is enabled,
InnoDB guarantees at most an isolation
level of READ COMMITTED.
(Conflict serializability is still guaranteed.) For more
information about phantoms, see
Section 14.5.4, “Phantom Rows”.
Enabling innodb_locks_unsafe_for_binlog has
additional effects:
For UPDATE or
DELETE statements,
InnoDB holds locks only for rows that
it updates or deletes. Record locks for nonmatching rows
are released after MySQL has evaluated the
WHERE condition. This greatly reduces
the probability of deadlocks, but they can still happen.
For UPDATE statements, if a
row is already locked, InnoDB performs
a “semi-consistent” read, returning the
latest committed version to MySQL so that MySQL can
determine whether the row matches the
WHERE condition of the
UPDATE. If the row matches
(must be updated), MySQL reads the row again and this time
InnoDB either locks it or waits for a
lock on it.
Consider the following example, beginning with this table:
CREATE TABLE t (a INT NOT NULL, b INT) ENGINE = InnoDB; INSERT INTO t VALUES (1,2),(2,3),(3,2),(4,3),(5,2); COMMIT;
In this case, table has no indexes, so searches and index scans use the hidden clustered index for record locking (see Section 14.8.9, “Clustered and Secondary Indexes”).
Suppose that one client performs an
UPDATE using these statements:
SET autocommit = 0; UPDATE t SET b = 5 WHERE b = 3;
Suppose also that a second client performs an
UPDATE by executing these
statements following those of the first client:
SET autocommit = 0; UPDATE t SET b = 4 WHERE b = 2;
As InnoDB executes each
UPDATE, it first acquires an
exclusive lock for each row, and then determines whether to
modify it. If InnoDB does not modify the
row and innodb_locks_unsafe_for_binlog is
enabled, it releases the lock. Otherwise,
InnoDB retains the lock until the end of
the transaction. This affects transaction processing as
follows.
If innodb_locks_unsafe_for_binlog is
disabled, the first UPDATE
acquires x-locks and does not release any of them:
x-lock(1,2); retain x-lock x-lock(2,3); update(2,3) to (2,5); retain x-lock x-lock(3,2); retain x-lock x-lock(4,3); update(4,3) to (4,5); retain x-lock x-lock(5,2); retain x-lock
The second UPDATE blocks as
soon as it tries to acquire any locks (because the first
update has retained locks on all rows), and does not proceed
until the first UPDATE commits
or rolls back:
x-lock(1,2); block and wait for first UPDATE to commit or roll back
If innodb_locks_unsafe_for_binlog is
enabled, the first UPDATE
acquires x-locks and releases those for rows that it does not
modify:
x-lock(1,2); unlock(1,2) x-lock(2,3); update(2,3) to (2,5); retain x-lock x-lock(3,2); unlock(3,2) x-lock(4,3); update(4,3) to (4,5); retain x-lock x-lock(5,2); unlock(5,2)
For the second UPDATE,
InnoDB does a
“semi-consistent” read, returning the latest
committed version of each row to MySQL so that MySQL can
determine whether the row matches the WHERE
condition of the UPDATE:
x-lock(1,2); update(1,2) to (1,4); retain x-lock x-lock(2,3); unlock(2,3) x-lock(3,2); update(3,2) to (3,4); retain x-lock x-lock(4,3); unlock(4,3) x-lock(5,2); update(5,2) to (5,4); retain x-lock
| Command-Line Format | --innodb_log_buffer_size=# | ||
| System Variable | Name | innodb_log_buffer_size | |
| Variable Scope | Global | ||
| Dynamic Variable | No | ||
| Permitted Values | Type | integer | |
| Default | 8388608 | ||
| Min Value | 262144 | ||
| Max Value | 4294967295 | ||
The size in bytes of the buffer that InnoDB
uses to write to the log
files on disk. The default value is 8MB. A large
log buffer enables
large transactions to
run without the need to write the log to disk before the
transactions commit. Thus,
if you have transactions that update, insert, or delete many
rows, making the log buffer larger saves disk I/O. For related
information, see
InnoDB Memory Configuration, and
Section 8.5.4, “Optimizing InnoDB Redo Logging”. For general I/O
tuning advice, see Section 8.5.8, “Optimizing InnoDB Disk I/O”.
| Introduced | 5.6.11 | ||
| Command-Line Format | --innodb_log_compressed_pages=# | ||
| System Variable | Name | innodb_log_compressed_pages | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | boolean | |
| Default | ON | ||
Specifies whether images of re-compressed pages are written to the redo log. Re-compression may occur when changes are made to compressed data.
innodb_log_compressed_pages is enabled by
default to prevent corruption that could occur if a different
version of the zlib compression algorithm
is used during recovery. If you are certain that the
zlib version will not change, you can
disable innodb_log_compressed_pages to
reduce redo log generation for workloads that modify
compressed data.
To measure the effect of enabling or disabling
innodb_log_compressed_pages, compare redo
log generation for both settings under the same workload.
Options for measuring redo log generation include observing
the Log sequence number (LSN) in the
LOG section of
SHOW ENGINE
INNODB STATUS output, or monitoring
Innodb_os_log_written status
for the number of bytes written to the redo log files.
| Command-Line Format | --innodb_log_file_size=# | ||
| System Variable | Name | innodb_log_file_size | |
| Variable Scope | Global | ||
| Dynamic Variable | No | ||
| Permitted Values (<= 5.6.2) | Type | integer | |
| Default | 5242880 | ||
| Min Value | 1048576 | ||
| Max Value | 4GB / innodb_log_files_in_group | ||
| Permitted Values (>= 5.6.3, <= 5.6.7) | Type | integer | |
| Default | 5242880 | ||
| Min Value | 1048576 | ||
| Max Value | 512GB / innodb_log_files_in_group | ||
| Permitted Values (>= 5.6.8) | Type | integer | |
| Default | 50331648 | ||
| Min Value | 1048576 | ||
| Max Value | 512GB / innodb_log_files_in_group | ||
The size in bytes of each log
file in a log
group. The combined size of log files
(innodb_log_file_size *
innodb_log_files_in_group)
cannot exceed a maximum value that is slightly less than
512GB. A pair of 255 GB log files, for example, would allow
you to approach the limit but not exceed it. The default value
is 48MB.
Generally, the combined size of the log files should be large enough that the server can smooth out peaks and troughs in workload activity, which often means that there is enough redo log space to handle more than an hour of write activity. The larger the value, the less checkpoint flush activity is needed in the buffer pool, saving disk I/O. Larger log files also make crash recovery slower, although improvements to recovery performance in MySQL 5.5 and higher make the log file size less of a consideration. For general I/O tuning advice, see Section 8.5.8, “Optimizing InnoDB Disk I/O”.
Due to Bug #69477, redo log writes for large, externally
stored BLOB fields could
overwrite the most recent checkpoint. To address this bug, a
patch introduced in MySQL 5.6.20 limits the size of redo log
BLOB writes to 10% of the
redo log file size. As a result of this limit,
innodb_log_file_size should
be set to a value greater than 10 times the largest
BLOB data size found in the
rows of your tables plus the length of other variable length
fields (VARCHAR,
VARBINARY, and
TEXT type fields).
In MySQL 5.6.22, the redo log
BLOB write limit is relaxed
to 10% of the total redo log size
(innodb_log_file_size *
innodb_log_files_in_group).
(Bug #19498877)
| Command-Line Format | --innodb_log_files_in_group=# | ||
| System Variable | Name | innodb_log_files_in_group | |
| Variable Scope | Global | ||
| Dynamic Variable | No | ||
| Permitted Values | Type | integer | |
| Default | 2 | ||
| Min Value | 2 | ||
| Max Value | 100 | ||
The number of log files
in the log group.
InnoDB writes to the files in a circular
fashion. The default (and recommended) value is 2. The
location of these files is specified by
innodb_log_group_home_dir.
The combined size of log files
(innodb_log_file_size *
innodb_log_files_in_group) can be up to
512GB.
| Command-Line Format | --innodb_log_group_home_dir=dir_name | ||
| System Variable | Name | innodb_log_group_home_dir | |
| Variable Scope | Global | ||
| Dynamic Variable | No | ||
| Permitted Values | Type | directory name | |
The directory path to the InnoDB
redo log files, whose
number is specified by
innodb_log_files_in_group. If
you do not specify any InnoDB log
variables, the default is to create two files named
ib_logfile0 and
ib_logfile1 in the MySQL data directory.
Their size is given by the size of the
innodb_log_file_size system
variable.
| Introduced | 5.6.3 | ||
| Command-Line Format | --innodb_lru_scan_depth=# | ||
| System Variable | Name | innodb_lru_scan_depth | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values (32-bit platforms) | Type | integer | |
| Default | 1024 | ||
| Min Value | 100 | ||
| Max Value | 2**32-1 | ||
| Permitted Values (64-bit platforms) | Type | integer | |
| Default | 1024 | ||
| Min Value | 100 | ||
| Max Value | 2**64-1 | ||
A parameter that influences the algorithms and heuristics for
the flush operation for the
InnoDB
buffer pool. Primarily
of interest to performance experts tuning I/O-intensive
workloads. It specifies, per buffer pool instance, how far
down the buffer pool LRU list the page cleaner thread scans
looking for dirty pages
to flush. This is a background operation performed once a
second.
A setting smaller than the default is generally suitable for most workloads. A value that is much higher than necessary may impact performance. Only consider increasing the value if you have spare I/O capacity under a typical workload. Conversely, if a write-intensive workload saturates your I/O capacity, decrease the value, especially in the case of a large buffer pool.
When tuning innodb_lru_scan_depth, start
with a low value and configure the setting upward with the
goal of rarely seeing zero free pages. Also, consider
adjusting innodb_lru_scan_depth when
changing the number of buffer pool instances, since
innodb_lru_scan_depth *
innodb_buffer_pool_instances
defines the amount of work performed by the page cleaner
thread each second.
For general I/O tuning advice, see Section 8.5.8, “Optimizing InnoDB Disk I/O”.
| Command-Line Format | --innodb_max_dirty_pages_pct=# | ||
| System Variable | Name | innodb_max_dirty_pages_pct | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | numeric | |
| Default | 75 | ||
| Min Value | 0 | ||
| Max Value | 99 | ||
InnoDB tries to
flush data from the
buffer pool so that
the percentage of dirty
pages does not exceed this value. Specify an integer in
the range from 0 to 99. The default value is 75.
The
innodb_max_dirty_pages_pct
setting establishes a target for flushing activity. It does
not affect the rate of flushing. For information about
managing the rate of flushing, see
Section 14.6.3.5, “Configuring InnoDB Buffer Pool Flushing”.
For additional information about this variable, see Section 14.6.3.6, “Fine-tuning InnoDB Buffer Pool Flushing”. For general I/O tuning advice, see Section 8.5.8, “Optimizing InnoDB Disk I/O”.
innodb_max_dirty_pages_pct_lwm
| Introduced | 5.6.6 | ||
| Command-Line Format | --innodb_max_dirty_pages_pct_lwm=# | ||
| System Variable | Name | innodb_max_dirty_pages_pct_lwm | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | numeric | |
| Default | 0 | ||
| Min Value | 0 | ||
| Max Value | 99 | ||
Low water mark representing percentage of dirty pages where preflushing is enabled to control the dirty page ratio. The default of 0 disables the pre-flushing behavior entirely. For additional information about this variable, see Section 14.6.3.6, “Fine-tuning InnoDB Buffer Pool Flushing”.
| Command-Line Format | --innodb_max_purge_lag=# | ||
| System Variable | Name | innodb_max_purge_lag | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | integer | |
| Default | 0 | ||
| Min Value | 0 | ||
| Max Value | 4294967295 | ||
This variable controls how to delay
INSERT,
UPDATE, and
DELETE operations when
purge operations are lagging
(see Section 14.3, “InnoDB Multi-Versioning”). The default
value is 0 (no delays).
The InnoDB transaction system maintains a
list of transactions that have index records delete-marked by
UPDATE or
DELETE operations. The length
of this list represents the
purge_lag value. When
purge_lag exceeds
innodb_max_purge_lag, each
INSERT,
UPDATE, and
DELETE operation is delayed.
To prevent excessive delays in extreme situations where
purge_lag becomes huge, you can put
a cap on the amount of delay by setting the
innodb_max_purge_lag_delay
configuration option. The delay is computed at the beginning
of a purge batch.
A typical setting for a problematic workload might be 1
million, assuming that transactions are small, only 100 bytes
in size, and it is permissible to have 100MB of unpurged
InnoDB table rows.
The lag value is displayed as the history list length in the
TRANSACTIONS section of InnoDB Monitor
output. For example, if the output includes the following
lines, the lag value is 20:
------------ TRANSACTIONS ------------ Trx id counter 0 290328385 Purge done for trx's n:o < 0 290315608 undo n:o < 0 17 History list length 20
For general I/O tuning advice, see Section 8.5.8, “Optimizing InnoDB Disk I/O”.
| Introduced | 5.6.5 | ||
| Command-Line Format | --innodb_max_purge_lag_delay=# | ||
| System Variable | Name | innodb_max_purge_lag_delay | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | integer | |
| Default | 0 | ||
| Min Value | 0 | ||
Specifies the maximum delay in milliseconds for the delay
imposed by the
innodb_max_purge_lag
configuration option. Any non-zero value represents an upper
limit on the delay period computed from the formula based on
the value of innodb_max_purge_lag. The
default of zero means that there is no upper limit imposed on
the delay interval.
For general I/O tuning advice, see Section 8.5.8, “Optimizing InnoDB Disk I/O”.
Has no effect. This variable is deprecated as of MySQL 5.6.11 and will be removed in a future MySQL release.
| Introduced | 5.6.2 | ||
| Command-Line Format | --innodb_monitor_disable=[counter|module|pattern|all] | ||
| System Variable | Name | innodb_monitor_disable | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | string | |
Turns off one or more
counters in the
INFORMATION_SCHEMA.INNODB_METRICS
table. For usage information, see
Section 21.29.15, “The INFORMATION_SCHEMA INNODB_METRICS Table”.
| Introduced | 5.6.2 | ||
| Command-Line Format | --innodb_monitor_enable=[counter|module|pattern|all] | ||
| System Variable | Name | innodb_monitor_enable | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | string | |
Turns on one or more
counters in the
INFORMATION_SCHEMA.INNODB_METRICS
table. For usage information, see
Section 21.29.15, “The INFORMATION_SCHEMA INNODB_METRICS Table”.
| Introduced | 5.6.2 | ||
| Command-Line Format | --innodb_monitor_reset=[counter|module|pattern|all] | ||
| System Variable | Name | innodb_monitor_reset | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | string | |
Resets to zero the count value for one or more
counters in the
INFORMATION_SCHEMA.INNODB_METRICS
table. For usage information, see
Section 21.29.15, “The INFORMATION_SCHEMA INNODB_METRICS Table”.
| Introduced | 5.6.2 | ||
| Command-Line Format | --innodb_monitor_reset_all=[counter|module|pattern|all] | ||
| System Variable | Name | innodb_monitor_reset_all | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | string | |
Resets all values (minimum, maximum, and so on) for one or
more counters in the
INFORMATION_SCHEMA.INNODB_METRICS
table. For usage information, see
Section 21.29.15, “The INFORMATION_SCHEMA INNODB_METRICS Table”.
| Introduced | 5.6.27 | ||
| Command-Line Format | --innodb_numa_interleave=# | ||
| System Variable | Name | innodb_numa_interleave | |
| Variable Scope | Global | ||
| Dynamic Variable | No | ||
| Permitted Values | Type | boolean | |
| Default | OFF | ||
Enables the NUMA interleave memory policy for allocation of
the InnoDB buffer pool. When
innodb_numa_interleave is enabled, the NUMA
memory policy is set to MPOL_INTERLEAVE for
the mysqld process. After the
InnoDB buffer pool is allocated, the NUMA
memory policy is set back to MPOL_DEFAULT.
For the innodb_numa_interleave option to be
available, MySQL must be compiled on a NUMA-enabled Linux
system.
| Command-Line Format | --innodb_old_blocks_pct=# | ||
| System Variable | Name | innodb_old_blocks_pct | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | integer | |
| Default | 37 | ||
| Min Value | 5 | ||
| Max Value | 95 | ||
Specifies the approximate percentage of the
InnoDB
buffer pool used for
the old block sublist. The
range of values is 5 to 95. The default value is 37 (that is,
3/8 of the pool). Often used in combination with
innodb_old_blocks_time. See
Section 14.6.3.3, “Making the Buffer Pool Scan Resistant” for
more information. See Section 14.6.3.1, “The InnoDB Buffer Pool” for
information about buffer pool management, such as the
LRU algorithm and
eviction policies.
| Command-Line Format | --innodb_old_blocks_time=# | ||
| System Variable | Name | innodb_old_blocks_time | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values (<= 5.6.5) | Type | integer | |
| Default | 0 | ||
| Min Value | 0 | ||
| Max Value | 2**32-1 | ||
| Permitted Values (>= 5.6.6) | Type | integer | |
| Default | 1000 | ||
| Min Value | 0 | ||
| Max Value | 2**32-1 | ||
Non-zero values protect against the buffer pool being filled up by data that is referenced only for a brief period, such as during a full table scan. Increasing this value offers more protection against full table scans interfering with data cached in the buffer pool.
Specifies how long in milliseconds (ms) a block inserted into the old sublist must stay there after its first access before it can be moved to the new sublist. If the value is 0, a block inserted into the old sublist moves immediately to the new sublist the first time it is accessed, no matter how soon after insertion the access occurs. If the value is greater than 0, blocks remain in the old sublist until an access occurs at least that many ms after the first access. For example, a value of 1000 causes blocks to stay in the old sublist for 1 second after the first access before they become eligible to move to the new sublist.
The default value is 1000 as of MySQL 5.6.6, 0 before that.
This variable is often used in combination with
innodb_old_blocks_pct. See
Section 14.6.3.3, “Making the Buffer Pool Scan Resistant” for
more information. See Section 14.6.3.1, “The InnoDB Buffer Pool” for
information about buffer pool management, such as the
LRU algorithm and
eviction policies.
innodb_online_alter_log_max_size
| Introduced | 5.6.6 | ||
| Command-Line Format | --innodb_online_alter_log_max_size=# | ||
| System Variable | Name | innodb_online_alter_log_max_size | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | integer | |
| Default | 134217728 | ||
| Min Value | 65536 | ||
| Max Value | 2**64-1 | ||
Specifies an upper limit on the size of the temporary log
files used during online
DDL operations for InnoDB tables.
There is one such log file for each index being created or
table being altered. This log file stores data inserted,
updated, or deleted in the table during the DDL operation. The
temporary log file is extended when needed by the value of
innodb_sort_buffer_size, up
to the maximum specified by
innodb_online_alter_log_max_size. If any
temporary log file exceeds the upper size limit, the
ALTER TABLE operation fails and
all uncommitted concurrent DML operations are rolled back.
Thus, a large value for this option allows more DML to happen
during an online DDL operation, but also causes a longer
period at the end of the DDL operation when the table is
locked to apply the data from the log.
| Command-Line Format | --innodb_open_files=# | ||
| System Variable | Name | innodb_open_files | |
| Variable Scope | Global | ||
| Dynamic Variable | No | ||
| Permitted Values (<= 5.6.5) | Type | integer | |
| Default | 300 | ||
| Min Value | 10 | ||
| Max Value | 4294967295 | ||
| Permitted Values (>= 5.6.6) | Type | integer | |
| Default | -1 (autosized) | ||
| Min Value | 10 | ||
| Max Value | 4294967295 | ||
This variable is relevant only if you use multiple
InnoDB
tablespaces. It
specifies the maximum number of
.ibd
files that MySQL can keep open at one time. The minimum
value is 10. As of MySQL 5.6.6, the default value is 300 if
innodb_file_per_table is not
enabled, and the higher of 300 and
table_open_cache otherwise.
Before 5.6.6, the default value is 300.
The file descriptors used for .ibd files
are for InnoDB tables only. They are
independent of those specified by the
--open-files-limit server
option, and do not affect the operation of the table cache.
For general I/O tuning advice, see
Section 8.5.8, “Optimizing InnoDB Disk I/O”.
| Introduced | 5.6.4 | ||
| Command-Line Format | --innodb_optimize_fulltext_only=# | ||
| System Variable | Name | innodb_optimize_fulltext_only | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | boolean | |
| Default | OFF | ||
Changes the way the OPTIMIZE
TABLE statement operates on
InnoDB tables. Intended to be enabled
temporarily, during maintenance operations for
InnoDB tables with
FULLTEXT indexes.
By default, OPTIMIZE TABLE reorganizes the
data in the clustered
index of the table. When this option is enabled,
OPTIMIZE TABLE skips this reorganization of
the table data, and instead processes the newly added,
deleted, and updated token data for a
FULLTEXT index, See
Section 14.8.10, “InnoDB FULLTEXT Indexes” for more information
about FULLTEXT indexes for
InnoDB tables.
| Introduced | 5.6.4 | ||
| Command-Line Format | --innodb_page_size=#k | ||
| System Variable | Name | innodb_page_size | |
| Variable Scope | Global | ||
| Dynamic Variable | No | ||
| Permitted Values (>= 5.6.4) | Type | enumeration | |
| Default | 16384 | ||
| Valid Values | 4k | ||
8k | |||
16k | |||
4096 | |||
8192 | |||
16384 | |||
Specifies the page size
for all InnoDB
tablespaces in a MySQL
instance. You can specify
page size using the values 16k (the
default), 8k, or 4k.
Alternatively, you can specify page size in bytes (4096, 8192,
16384).
innodb_page_size can only
be configured prior to initializing the MySQL instance and
cannot be changed afterward. If no value is specified, the
instance is initialized using the default page size.
The default 16k page size is appropriate
for a wide range of
workloads, particularly
for queries involving table scans and DML operations involving
bulk updates. Smaller page sizes might be more efficient for
OLTP workloads involving many
small writes, where contention can be an issue when a single
page contains many rows. Smaller pages might also be efficient
with SSD storage devices,
which typically use small block sizes. Keeping the
InnoDB page size close to the storage
device block size minimizes the amount of unchanged data that
is rewritten to disk. For general I/O tuning advice, see
Section 8.5.8, “Optimizing InnoDB Disk I/O”.
| Introduced | 5.6.2 | ||
| Command-Line Format | --innodb_print_all_deadlocks=# | ||
| System Variable | Name | innodb_print_all_deadlocks | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | boolean | |
| Default | OFF | ||
When this option is enabled, information about all
deadlocks in
InnoDB user transactions is recorded in the
mysqld error
log. Otherwise, you see information about only the last
deadlock, using the SHOW ENGINE INNODB
STATUS command. An occasional
InnoDB deadlock is not necessarily an
issue, because InnoDB detects the condition
immediately, and rolls back one of the transactions
automatically. You might use this option to troubleshoot why
deadlocks are happening if an application does not have
appropriate error-handling logic to detect the rollback and
retry its operation. A large number of deadlocks might
indicate the need to restructure transactions that issue
DML or SELECT ... FOR
UPDATE statements for multiple tables, so that each
transaction accesses the tables in the same order, thus
avoiding the deadlock condition.
| Command-Line Format | --innodb_purge_batch_size=# | ||
| System Variable | Name | innodb_purge_batch_size | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values (<= 5.6.2) | Type | integer | |
| Default | 20 | ||
| Min Value | 1 | ||
| Max Value | 5000 | ||
| Permitted Values (>= 5.6.3) | Type | integer | |
| Default | 300 | ||
| Min Value | 1 | ||
| Max Value | 5000 | ||
Defines the number of undo log pages that purge parses and
processes in one batch from the
history list. In a
multi-threaded purge configuration, the coordinator purge
thread divides innodb_purge_batch_size by
innodb_purge_threads and
assigns that number of pages to each purge thread. The
innodb_purge_batch_size option also defines
the number of undo log pages that purge frees after every 128
iterations through the undo logs.
The innodb_purge_batch_size option is
intended for advanced performance tuning in combination with
the innodb_purge_threads
setting. Most MySQL users need not change
innodb_purge_batch_size from its default
value.
| Command-Line Format | --innodb_purge_threads=# | ||
| System Variable | Name | innodb_purge_threads | |
| Variable Scope | Global | ||
| Dynamic Variable | No | ||
| Permitted Values (<= 5.6.1) | Type | integer | |
| Default | 0 | ||
| Min Value | 0 | ||
| Max Value | 1 | ||
| Permitted Values (>= 5.6.2, <= 5.6.4) | Type | integer | |
| Default | 0 | ||
| Min Value | 0 | ||
| Max Value | 32 | ||
| Permitted Values (>= 5.6.5) | Type | integer | |
| Default | 1 | ||
| Min Value | 1 | ||
| Max Value | 32 | ||
The number of background threads devoted to the
InnoDB
purge operation. The default
and minimum value of 1 signifies that the purge operation is
always performed by a background thread, never as part of the
master thread.
Running the purge operation in one or more background threads
helps reduce internal contention within
InnoDB, improving scalability. Increasing
the value to greater than 1 creates that many separate purge
threads, which can improve efficiency on systems where
DML operations are performed
on multiple tables. The maximum is 32.
| Introduced | 5.6.3 | ||
| Command-Line Format | --innodb_random_read_ahead=# | ||
| System Variable | Name | innodb_random_read_ahead | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | boolean | |
| Default | OFF | ||
Enables the random
read-ahead technique
for optimizing InnoDB I/O. Random
read-ahead functionality was removed from the InnoDB
Plugin (version 1.0.4) and was therefore not
included in MySQL 5.5.0 when InnoDB Plugin
became the “built-in” version of
InnoDB. Random read-ahead was reintroduced
in MySQL 5.1.59 and 5.5.16 and higher along with the
innodb_random_read_ahead configuration
option, which is disabled by default.
See Section 14.6.3.4, “Configuring InnoDB Buffer Pool Prefetching (Read-Ahead)” for details about the performance considerations for the different types of read-ahead requests. For general I/O tuning advice, see Section 8.5.8, “Optimizing InnoDB Disk I/O”.
| Command-Line Format | --innodb_read_ahead_threshold=# | ||
| System Variable | Name | innodb_read_ahead_threshold | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | integer | |
| Default | 56 | ||
| Min Value | 0 | ||
| Max Value | 64 | ||
Controls the sensitivity of linear
read-ahead that
InnoDB uses to prefetch pages into the
buffer pool. If
InnoDB reads at least
innodb_read_ahead_threshold pages
sequentially from an extent
(64 pages), it initiates an asynchronous read for the entire
following extent. The permissible range of values is 0 to 64.
As of MySQL 5.6.1, a value of 0 disables read-ahead. Prior to
5.6.1, a value of 0 would trigger a read-ahead upon reading
the boundary page of a 64 page extent. For the default of 56,
InnoDB must read at least 56 pages
sequentially from an extent to initiate an asynchronous read
for the following extent.
Knowing how many pages are read through this read-ahead
mechanism, and how many of them are evicted from the buffer
pool without ever being accessed, can be useful to help
fine-tune the
innodb_read_ahead_threshold
parameter. As of MySQL 5.5,
SHOW ENGINE
INNODB STATUS output displays counter information
from the
Innodb_buffer_pool_read_ahead
and
Innodb_buffer_pool_read_ahead_evicted
global status variables. These variables indicate the number
of pages brought into the
buffer pool by
read-ahead requests, and the number of such pages
evicted from the buffer
pool without ever being accessed respectively. These counters
provide global values since the last server restart.
SHOW ENGINE INNODB STATUS also shows the
rate at which the read-ahead pages are read in and the rate at
which such pages are evicted without being accessed. The
per-second averages are based on the statistics collected
since the last invocation of SHOW ENGINE INNODB
STATUS and are displayed in the BUFFER POOL
AND MEMORY section of the output.
See Section 14.6.3.4, “Configuring InnoDB Buffer Pool Prefetching (Read-Ahead)” for more information. For general I/O tuning advice, see Section 8.5.8, “Optimizing InnoDB Disk I/O”.
| Command-Line Format | --innodb_read_io_threads=# | ||
| System Variable | Name | innodb_read_io_threads | |
| Variable Scope | Global | ||
| Dynamic Variable | No | ||
| Permitted Values | Type | integer | |
| Default | 4 | ||
| Min Value | 1 | ||
| Max Value | 64 | ||
The number of I/O threads for read operations in
InnoDB. The default value is 4. Its
counterpart for write threads is
innodb_write_io_threads. See
Section 14.6.7, “Configuring the Number of Background InnoDB I/O Threads” for
more information. For general I/O tuning advice, see
Section 8.5.8, “Optimizing InnoDB Disk I/O”.
On Linux systems, running multiple MySQL servers (typically
more than 12) with default settings for
innodb_read_io_threads,
innodb_write_io_threads,
and the Linux aio-max-nr setting can
exceed system limits. Ideally, increase the
aio-max-nr setting; as a workaround, you
might reduce the settings for one or both of the MySQL
configuration options.
| Introduced | 5.6.7 | ||
| Command-Line Format | --innodb_read_only=# | ||
| System Variable | Name | innodb_read_only | |
| Variable Scope | Global | ||
| Dynamic Variable | No | ||
| Permitted Values | Type | boolean | |
| Default | OFF | ||
Starts InnoDB in read-only mode. For
distributing database applications or data sets on read-only
media. Can also be used in data warehouses to share the same
data directory between multiple instances. See
Section 14.6.2, “Configuring InnoDB for Read-Only Operation” for usage
instructions.
| Command-Line Format | --innodb_replication_delay=# | ||
| System Variable | Name | innodb_replication_delay | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | integer | |
| Default | 0 | ||
| Min Value | 0 | ||
| Max Value | 4294967295 | ||
The replication thread delay (in ms) on a slave server if
innodb_thread_concurrency is
reached.
| Command-Line Format | --innodb_rollback_on_timeout | ||
| System Variable | Name | innodb_rollback_on_timeout | |
| Variable Scope | Global | ||
| Dynamic Variable | No | ||
| Permitted Values | Type | boolean | |
| Default | OFF | ||
In MySQL 5.6, InnoDB
rolls back only the last
statement on a transaction timeout by default. If
--innodb_rollback_on_timeout is
specified, a transaction timeout causes
InnoDB to abort and roll back the entire
transaction (the same behavior as in MySQL 4.1).
| Introduced | 5.6.2 | ||
| Command-Line Format | --innodb_rollback_segments=# | ||
| System Variable | Name | innodb_rollback_segments | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | integer | |
| Default | 128 | ||
| Min Value | 1 | ||
| Max Value | 128 | ||
Defines how many of the
rollback segments
in the system
tablespace are used for InnoDB
transactions. This
setting, while still valid, is replaced by
innodb_undo_logs.
innodb_saved_page_number_debug
| Introduced | 5.6.17 | ||
| Command-Line Format | --innodb_saved_page_number_debug=# | ||
| System Variable | Name | innodb_saved_page_number_debug | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | integer | |
| Default | 0 | ||
| Max Value | 2**23-1 | ||
Saves a page number. Setting the
innodb_fil_make_page_dirty_debug
option dirties the page defined by
innodb_saved_page_number_debug. The
innodb_saved_page_number_debug option is
only available if debugging support is compiled in using the
WITH_DEBUG
CMake option.
| Introduced | 5.6.4 | ||
| Command-Line Format | --innodb_sort_buffer_size=# | ||
| System Variable | Name | innodb_sort_buffer_size | |
| Variable Scope | Global | ||
| Dynamic Variable | No | ||
| Permitted Values (5.6.4) | Type | integer | |
| Default | 1048576 | ||
| Min Value | 524288 | ||
| Max Value | 67108864 | ||
| Permitted Values (>= 5.6.5) | Type | integer | |
| Default | 1048576 | ||
| Min Value | 65536 | ||
| Max Value | 67108864 | ||
Specifies the size of sort buffers used for sorting data
during creation of an InnoDB index. The
size specified defines the amount of data filled in memory for
an internal sort and written out to disk, which can be
referred to as a “run”. During the merge phase,
pairs of buffers of the specified size are “read
in” and merged. The larger the setting, the fewer
“runs” and merges there are, which is important
to understand from a tuning perspective.
This sort area is only used for merge sorts during index creation, not during later index maintenance operations. Buffers are deallocated when index creation completes.
The value of this option also controls the amount by which the temporary log file is extended, to record concurrent DML during online DDL operations.
Before this setting was made configurable, the size was hardcoded to 1048576 bytes (1MB), and that value remains the default.
During an ALTER TABLE or
CREATE TABLE statement that
creates an index, 3 buffers are allocated, each with a size
defined by this option. Additionally, auxiliary pointers are
allocated to rows in the sort buffer so that the sort can run
on pointers (as opposed to moving rows during the sort
operation).
For a typical sort operation, a formula such as this can be used to estimate memory consumption:
(6 /*FTS_NUM_AUX_INDEX*/ * (3*@@global.innodb_sort_buffer_size) + 2 * number_of_partitions * number_of_secondary_indexes_created * (@@global.innodb_sort_buffer_size/dict_index_get_min_size(index)*/) * 8 /*64-bit sizeof *buf->tuples*/")
@@global.innodb_sort_buffer_size/dict_index_get_min_size(index)
indicates the maximum tuples held. 2 *
(@@global.innodb_sort_buffer_size/*dict_index_get_min_size(index)*/)
* 8 /*64-bit size of *buf->tuples*/ indicates
auxiliary pointers allocated.
For 32-bit, multiply by 4 instead of 8.
For parallel sorts on a full-text index, multiply by the
innodb_ft_sort_pll_degree
setting:
(6 /*FTS_NUM_AUX_INDEX*/ * @@global.innodb_ft_sort_pll_degree)
| Command-Line Format | --innodb_spin_wait_delay=# | ||
| System Variable | Name | innodb_spin_wait_delay | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values (32-bit platforms) | Type | integer | |
| Default | 6 | ||
| Min Value | 0 | ||
| Max Value | 2**32-1 | ||
| Permitted Values (64-bit platforms) | Type | integer | |
| Default | 6 | ||
| Min Value | 0 | ||
| Max Value | 2**64-1 | ||
The maximum delay between polls for a spin lock. The low-level implementation of this mechanism varies depending on the combination of hardware and operating system, so the delay does not correspond to a fixed time interval. The default value is 6. See Section 14.6.9, “Configuring Spin Lock Polling” for more information.
| Introduced | 5.6.6 | ||
| Command-Line Format | --innodb_stats_auto_recalc=# | ||
| System Variable | Name | innodb_stats_auto_recalc | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | boolean | |
| Default | ON | ||
Causes InnoDB to automatically recalculate
persistent
statistics after the data in a table is changed
substantially. The threshold value is currently 10% of the
rows in the table. This setting applies to tables created when
the innodb_stats_persistent
option is enabled, or where the clause
STATS_PERSISTENT=1 is enabled by a
CREATE TABLE or
ALTER TABLE statement. The
amount of data sampled to produce the statistics is controlled
by the
innodb_stats_persistent_sample_pages
configuration option.
For additional information about
innodb_stats_auto_recalc, see
Section 14.6.11.1, “Configuring Persistent Optimizer Statistics Parameters”.
innodb_stats_include_delete_marked
| Introduced | 5.6.35 | ||
| Command-Line Format | --innodb_stats_include_delete_marked=# | ||
| System Variable | Name | innodb_stats_include_delete_marked | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | boolean | |
| Default | OFF | ||
By default, InnoDB reads uncommitted data
when calculating statistics. In the case of an uncommitted
transaction that deletes rows from a table,
InnoDB excludes records that are
delete-marked when calculating row estimates and index
statistics, which can lead to non-optimal execution plans for
other transactions that are operating on the table
concurrently using a transaction isolation level other than
READ UNCOMMITTED. To avoid
this scenario,
innodb_stats_include_delete_marked
can be enabled to ensure that InnoDB
includes delete-marked records when calculating persistent
optimizer statistics.
When
innodb_stats_include_delete_marked
is enabled, ANALYZE TABLE
considers delete-marked records when recalculating statistics.
innodb_stats_include_delete_marked
is a global setting that affects all InnoDB
tables, and it is only applicable to persistent optimizer
statistics.
For related information, see Section 14.6.11.1, “Configuring Persistent Optimizer Statistics Parameters”.
| Introduced | 5.6.2 | ||
| Command-Line Format | --innodb_stats_method=name | ||
| System Variable | Name | innodb_stats_method | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | enumeration | |
| Default | nulls_equal | ||
| Valid Values | nulls_equal | ||
nulls_unequal | |||
nulls_ignored | |||
How the server treats NULL values when
collecting statistics
about the distribution of index values for
InnoDB tables. This variable has three
possible values, nulls_equal,
nulls_unequal, and
nulls_ignored. For
nulls_equal, all NULL
index values are considered equal and form a single value
group that has a size equal to the number of
NULL values. For
nulls_unequal, NULL
values are considered unequal, and each
NULL forms a distinct value group of size
1. For nulls_ignored,
NULL values are ignored.
The method that is used for generating table statistics influences how the optimizer chooses indexes for query execution, as described in Section 8.3.7, “InnoDB and MyISAM Index Statistics Collection”.
| Command-Line Format | --innodb_stats_on_metadata | ||
| System Variable | Name | innodb_stats_on_metadata | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values (<= 5.6.5) | Type | boolean | |
| Default | ON | ||
| Permitted Values (>= 5.6.6) | Type | boolean | |
| Default | OFF | ||
This option only applies when optimizer
statistics are
configured to be non-persistent. Optimizer statistics are not
persisted to disk when
innodb_stats_persistent is
disabled or when individual tables are created or altered with
STATS_PERSISTENT=0. For more information,
see Section 14.6.11.2, “Configuring Non-Persistent Optimizer Statistics Parameters”.
When innodb_stats_on_metadata is enabled,
InnoDB updates non-persistent
statistics when
metadata statements such as SHOW TABLE
STATUS or SHOW INDEX
are run, or when accessing the
INFORMATION_SCHEMA.TABLES or
INFORMATION_SCHEMA.STATISTICS
tables. (These updates are similar to what happens for
ANALYZE TABLE.) When disabled,
InnoDB does not update statistics during
these operations. Leaving this setting disabled can improve
access speed for schemas that have a large number of tables or
indexes. It can also improve the stability of
execution
plans for queries that involve
InnoDB tables.
To change the setting, issue the statement SET GLOBAL
innodb_stats_on_metadata=,
where mode is
either modeON or OFF (or
1 or 0). Changing this
setting requires the SUPER privilege and
immediately affects the operation of all connections.
This variable is disabled by default as of MySQL 5.6.6, enabled before that.
| Introduced | 5.6.6 | ||
| Command-Line Format | --innodb_stats_persistent=setting | ||
| System Variable | Name | innodb_stats_persistent | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | boolean | |
| Default | ON | ||
| Valid Values | OFF | ||
ON | |||
0 | |||
1 | |||
Specifies whether InnoDB index statistics
are persisted to disk. Otherwise, statistics may be
recalculated frequently which can lead to variations in
query execution
plans. This setting is stored with each table when the
table is created. You can set
innodb_stats_persistent at the global level
before creating a table, or use the
STATS_PERSISTENT clause of the
CREATE TABLE and
ALTER TABLE statements to
override the system-wide setting and configure persistent
statistics for individual tables.
For more information about this option, see Section 14.6.11.1, “Configuring Persistent Optimizer Statistics Parameters”.
innodb_stats_persistent_sample_pages
| Introduced | 5.6.2 | ||
| Command-Line Format | --innodb_stats_persistent_sample_pages=# | ||
| System Variable | Name | innodb_stats_persistent_sample_pages | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | integer | |
| Default | 20 | ||
The number of index pages to
sample when estimating
cardinality and other
statistics for an
indexed column, such as those calculated by
ANALYZE TABLE. Increasing the
value improves the accuracy of index statistics, which can
improve the query
execution plan, at the expense of increased I/O during
the execution of ANALYZE TABLE
for an InnoDB table. For additional
information, see Section 14.6.11.1, “Configuring Persistent Optimizer Statistics Parameters”.
Setting a high value for
innodb_stats_persistent_sample_pages
could result in lengthy ANALYZE
TABLE execution time. To estimate the number of
database pages that will be accessed, see
Section 14.6.11.3, “Estimating ANALYZE TABLE Complexity for InnoDB Tables”.
This option only applies when the
innodb_stats_persistent
setting is turned on for a table; when that option is turned
off for a table, the
innodb_stats_transient_sample_pages
setting applies instead.
| Deprecated | 5.6.3 | ||
| Command-Line Format | --innodb_stats_sample_pages=# | ||
| System Variable | Name | innodb_stats_sample_pages | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | integer | |
| Default | 8 | ||
| Min Value | 1 | ||
| Max Value | 2**64-1 | ||
Deprecated, use
innodb_stats_transient_sample_pages
instead.
innodb_stats_transient_sample_pages
| Introduced | 5.6.2 | ||
| Command-Line Format | --innodb_stats_transient_sample_pages=# | ||
| System Variable | Name | innodb_stats_transient_sample_pages | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | integer | |
| Default | 8 | ||
The number of index pages to
sample when estimating
cardinality and other
statistics for an
indexed column, such as those calculated by
ANALYZE TABLE. The default
value is 8. Increasing the value improves the accuracy of
index statistics, which can improve the
query execution
plan, at the expense of increased I/O when opening an
InnoDB table or recalculating statistics.
For additional information, see
Section 14.6.11.2, “Configuring Non-Persistent Optimizer Statistics Parameters”.
Setting a high value for
innodb_stats_transient_sample_pages could
result in lengthy ANALYZE
TABLE execution time. To estimate the number of
database pages that will be accessed, see
Section 14.6.11.3, “Estimating ANALYZE TABLE Complexity for InnoDB Tables”.
This option only applies when the
innodb_stats_persistent
setting is turned off for a table; when this option is turned
on for a table, the
innodb_stats_persistent_sample_pages
setting applies instead. Takes the place of the
innodb_stats_sample_pages option.
| Introduced | 5.6.16 | ||
| Command-Line Format | --innodb_status_output | ||
| System Variable | Name | innodb_status_output | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | boolean | |
| Default | OFF | ||
Enables or disables periodic output for the standard
InnoDB Monitor. Also used in combination
with
innodb_status_output_locks to
enable or disable periodic output for the
InnoDB Lock Monitor. See
Section 14.17, “InnoDB Monitors” for additional information.
| Introduced | 5.6.16 | ||
| Command-Line Format | --innodb_status_output_locks | ||
| System Variable | Name | innodb_status_output_locks | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | boolean | |
| Default | OFF | ||
Enables or disables the InnoDB Lock
Monitor. When enabled, the InnoDB Lock
Monitor prints additional information about locks in
SHOW ENGINE INNODB STATUS output and in
periodic output printed to the MySQL error log. Periodic
output for the InnoDB Lock Monitor is
printed as part of the standard InnoDB
Monitor output. The standard InnoDB Monitor
must therefore be enabled for the InnoDB
Lock Monitor to print data to the MySQL error log
periodically. See Section 14.17, “InnoDB Monitors” for more
information.
| Command-Line Format | --innodb_strict_mode=# | ||
| System Variable | Name | innodb_strict_mode | |
| Variable Scope | Global, Session | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | boolean | |
| Default | OFF | ||
When innodb_strict_mode is
ON, InnoDB returns
errors rather than warnings for certain conditions. The
default value is OFF.
Strict mode helps
guard against ignored typos and syntax errors in SQL, or other
unintended consequences of various combinations of operational
modes and SQL statements. When
innodb_strict_mode is
ON, InnoDB raises error
conditions in certain cases, rather than issuing a warning and
processing the specified statement (perhaps with unintended
behavior). This is analogous to
sql_mode in
MySQL, which controls what SQL syntax MySQL accepts, and
determines whether it silently ignores errors, or validates
input syntax and data values.
The innodb_strict_mode setting affects the
handling of syntax errors for CREATE
TABLE, ALTER TABLE
and CREATE INDEX statements.
innodb_strict_mode also enables a record
size check, so that an INSERT or
UPDATE never fails due to the record being
too large for the selected page size.
Oracle recommends enabling
innodb_strict_mode when using
ROW_FORMAT and
KEY_BLOCK_SIZE clauses on
CREATE TABLE,
ALTER TABLE, and
CREATE INDEX statements. When
innodb_strict_mode is
OFF, InnoDB ignores
conflicting clauses and creates the table or index, with only
a warning in the message log. The resulting table might have
different behavior than you intended, such as having no
compression when you tried to create a compressed table. When
innodb_strict_mode is
ON, such problems generate an immediate
error and the table or index is not created, avoiding a
troubleshooting session later.
You can turn innodb_strict_mode
ON or OFF on the command
line when you start mysqld, or in the
configuration
file my.cnf or
my.ini. You can also enable or disable
innodb_strict_mode at runtime with the
statement SET [GLOBAL|SESSION]
innodb_strict_mode=,
where mode is
either modeON or OFF.
Changing the GLOBAL setting requires the
SUPER privilege and affects the operation
of all clients that subsequently connect. Any client can
change the SESSION setting for
innodb_strict_mode, and the setting affects
only that client.
| Command-Line Format | --innodb_support_xa | ||
| System Variable | Name | innodb_support_xa | |
| Variable Scope | Global, Session | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | boolean | |
| Default | TRUE | ||
Enables InnoDB support for two-phase commit
in XA transactions, causing an
extra disk flush for transaction preparation. This setting is
the default. The XA mechanism is used internally and is
essential for any server that has its binary log turned on and
is accepting changes to its data from more than one thread. If
you turn it off, transactions can be written to the binary log
in a different order from the one in which the live database
is committing them. This can produce different data when the
binary log is replayed in disaster recovery or on a
replication slave. Do not turn it off on a replication master
server unless you have an unusual setup where only one thread
is able to change data.
For a server that is accepting data changes from only one
thread, it is safe and recommended to turn off this option to
improve performance for InnoDB tables. For
example, you can turn it off on replication slaves where only
the replication SQL thread is changing data.
You can also turn off this option if you do not need it for safe binary logging or replication, and you also do not use an external XA transaction manager.
| Introduced | 5.6.3 | ||
| Command-Line Format | --innodb_sync_array_size=# | ||
| System Variable | Name | innodb_sync_array_size | |
| Variable Scope | Global | ||
| Dynamic Variable | No | ||
| Permitted Values | Type | integer | |
| Default | 1 | ||
| Min Value | 1 | ||
| Max Value | 1024 | ||
Splits an internal data structure used to coordinate threads, for higher concurrency in workloads with large numbers of waiting threads. This setting must be configured when the MySQL instance is starting up, and cannot be changed afterward. Increasing this option value is recommended for workloads that frequently produce a large number of waiting threads, typically greater than 768.
| Command-Line Format | --innodb_sync_spin_loops=# | ||
| System Variable | Name | innodb_sync_spin_loops | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | integer | |
| Default | 30 | ||
| Min Value | 0 | ||
| Max Value | 4294967295 | ||
The number of times a thread waits for an
InnoDB mutex to be freed before the thread
is suspended. The default value is 30.
| Command-Line Format | --innodb_table_locks | ||
| System Variable | Name | innodb_table_locks | |
| Variable Scope | Global, Session | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | boolean | |
| Default | TRUE | ||
If autocommit = 0,
InnoDB honors LOCK
TABLES; MySQL does not return from LOCK
TABLES ... WRITE until all other threads have
released all their locks to the table. The default value of
innodb_table_locks is 1,
which means that LOCK TABLES
causes InnoDB to lock a table internally if
autocommit = 0.
In MySQL 5.6,
innodb_table_locks = 0 has no
effect for tables locked explicitly with
LOCK TABLES ...
WRITE. It does have an effect for tables locked for
read or write by
LOCK TABLES ...
WRITE implicitly (for example, through triggers) or
by LOCK TABLES
... READ.
| Introduced | 5.6.29 | ||
| Command-Line Format | --innodb_tmpdir=path | ||
| System Variable | Name | innodb_tmpdir | |
| Variable Scope | Global, Session | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | directory name | |
| Default | NULL | ||
The innodb_tmpdir option is used to define
an alternate directory for temporary sort files created during
online ALTER TABLE operations
that rebuild the table.
Online ALTER TABLE operations
that rebuild a table also create an
intermediate table file in the same
directory as the original table. The
innodb_tmpdir option is not applicable to
intermediate table files.
A valid value is any directory path other than the MySQL data
directory path. If the value is NULL (the default), temporary
files are created MySQL temporary directory
($TMPDIR on Unix, %TEMP%
on Windows, or the directory specified by the
--tmpdir configuration
option). If an innodb_tmpdir directory is
specified, existence of the directory and permissions are only
checked when innodb_tmpdir is configured
using a
SET
statement. If a symlink is provided in a directory string, the
symlink is resolved and stored as an absolute path. The path
should not exceed 512 bytes. An online
ALTER TABLE operation reports
an error if innodb_tmpdir is set to an
invalid directory. innodb_tmpdir overrides
the MySQL tmpdir setting but
only for online ALTER TABLE
operations.
The FILE privilege is required to configure
innodb_tmpdir.
The innodb_tmpdir option was introduced to
help avoid overflowing a temporary file directory located on a
tmpfs file system. Such overflows could
occur as a result of large temporary sort files created during
online ALTER TABLE operations
that rebuild the table.
In replication environments, only consider replicating an
innodb_tmpdir setting if all servers have
the same operating system environment. Otherwise, replicating
an innodb_tmpdir setting could result in a
replication failure when running online
ALTER TABLE operations that
rebuild the table. If server operating environments differ, it
is recommended that you configure
innodb_tmpdir on each server individually.
For related information, see Where InnoDB Stores Temporary Files.
| Command-Line Format | --innodb_thread_concurrency=# | ||
| System Variable | Name | innodb_thread_concurrency | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | integer | |
| Default | 0 | ||
| Min Value | 0 | ||
| Max Value | 1000 | ||
InnoDB tries to keep the number of
operating system threads concurrently inside
InnoDB less than or equal to the limit
given by this variable (InnoDB uses
operating system threads to process user transactions). Once
the number of threads reaches this limit, additional threads
are placed into a wait state within a “First In, First
Out” (FIFO) queue for execution. Threads waiting for
locks are not counted in the number of concurrently executing
threads.
The range of this variable is 0 to 1000. A value of 0 (the
default) is interpreted as infinite concurrency (no
concurrency checking). Disabling thread concurrency checking
enables InnoDB to create as many threads as
it needs. A value of 0 also disables the queries
inside InnoDB and queries in queue
counters in the ROW OPERATIONS
section of SHOW ENGINE INNODB STATUS
output.
Consider setting this variable if your MySQL instance shares
CPU resources with other applications, or if your workload or
number of concurrent users is growing. The correct setting
depends on workload, computing environment, and the version of
MySQL that you are running. You will need to test a range of
values to determine the setting that provides the best
performance. innodb_thread_concurrency is a
dynamic variable, which allows you to experiment with
different settings on a live test system. If a particular
setting performs poorly, you can quickly set
innodb_thread_concurrency back to 0.
Use the following guidelines to help find and maintain an appropriate setting:
If the number of concurrent user threads for a workload is
less than 64, set
innodb_thread_concurrency=0.
If your workload is consistently heavy or occasionally
spikes, start by setting
innodb_thread_concurrency=128, and
lowering the value to 96, 80, 64, and so on, until you
find the number of threads that provides the best
performance. For example, suppose your system typically
has 40 to 50 users, but periodically the number increases
to 60, 70, or even 200. You find that performance is
stable at 80 concurrent users but starts to show a
regression above this number. In this case, you would set
innodb_thread_concurrency=80 to avoid
impacting performance.
If you do not want InnoDB to use more
than a certain number of vCPUs for user threads (20 vCPUs
for example), set
innodb_thread_concurrency to this
number (or possibly lower, depending on performance
results). If your goal is to isolate MySQL from other
applications, you may consider binding the
mysqld process exclusively to the
vCPUs. Be aware, however, that exclusive binding could
result in non-optimal hardware usage if the
mysqld process is not consistently
busy. In this case, you might bind the
mysqld process to the vCPUs but also
allow other applications to use some or all of the vCPUs.
From an operating system perspective, using a resource
management solution (if available) to manage how CPU
time is shared among applications may be preferable to
binding the mysqld process. For
example, you could assign 90% of vCPU time to a given
application while other critical process are
not running, and scale that value back to 40%
when other critical processes are
running.
innodb_thread_concurrency values that
are too high can cause performance regression due to
increased contention on system internals and resources.
In some cases, the optimal
innodb_thread_concurrency setting can
be smaller than the number of vCPUs.
Monitor and analyze your system regularly. Changes to
workload, number of users, or computing environment may
require that you adjust the
innodb_thread_concurrency setting.
For related information, see Section 14.6.6, “Configuring Thread Concurrency for InnoDB”.
| Command-Line Format | --innodb_thread_sleep_delay=# | ||
| System Variable | Name | innodb_thread_sleep_delay | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values (>= 5.6.17) | Type | integer | |
| Default | 10000 | ||
| Min Value | 0 | ||
| Max Value | 1000000 | ||
| Permitted Values (32-bit platforms, <= 5.6.16) | Type | integer | |
| Default | 10000 | ||
| Min Value | 0 | ||
| Max Value | 4294967295 | ||
| Permitted Values (64-bit platforms, <= 5.6.16) | Type | integer | |
| Default | 10000 | ||
| Min Value | 0 | ||
| Max Value | 18446744073709551615 | ||
How long InnoDB threads sleep before
joining the InnoDB queue, in microseconds.
The default value is 10000. A value of 0 disables sleep. In
MySQL 5.6.3 and higher, you can set the configuration option
innodb_adaptive_max_sleep_delay
to the highest value you would allow for
innodb_thread_sleep_delay, and InnoDB
automatically adjusts
innodb_thread_sleep_delay up or down
depending on the current thread-scheduling activity. This
dynamic adjustment helps the thread scheduling mechanism to
work smoothly during times when the system is lightly loaded
and when it is operating near full capacity.
For more information, see Section 14.6.6, “Configuring Thread Concurrency for InnoDB”.
innodb_trx_purge_view_update_only_debug
| Command-Line Format | --innodb_trx_purge_view_update_only_debug=# | ||
| System Variable | Name | innodb_trx_purge_view_update_only_debug | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | boolean | |
| Default | OFF | ||
Pauses purging of delete-marked records while allowing the
purge view to be updated. This option artificially creates a
situation in which the purge view is updated but purges have
not yet been performed. This option is only available if
debugging support is compiled in using the
WITH_DEBUG
CMake option.
| Command-Line Format | --innodb_trx_rseg_n_slots_debug=# | ||
| System Variable | Name | innodb_trx_rseg_n_slots_debug | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | integer | |
| Default | 0 | ||
| Max Value | 1024 | ||
Sets a debug flag that limits
TRX_RSEG_N_SLOTS to a given value for the
trx_rsegf_undo_find_free function which
looks for a free slot for an undo log segment. This option is
only available if debugging support is compiled in using the
WITH_DEBUG
CMake option.
| Introduced | 5.6.3 | ||
| Command-Line Format | --innodb_undo_directory=dir_name | ||
| System Variable | Name | innodb_undo_directory | |
| Variable Scope | Global | ||
| Dynamic Variable | No | ||
| Permitted Values | Type | directory name | |
| Default | . | ||
The relative or absolute directory path where
InnoDB creates separate tablespaces for the
undo logs. Typically used to place those logs on a different
storage device. Used in conjunction with
innodb_undo_logs and
innodb_undo_tablespaces,
which determine the disk layout of the undo logs outside the
system
tablespace. The default value of
“.” represents the same
directory where InnoDB creates its other
log files by default.
An absolute directory path must be set for embedded MySQL installations. Otherwise, the server may not be able to locate undo tablespaces that are created when the MySQL instance is initialized.
For more information about configuring separate tablespaces for undo logs, see Section 14.7.7, “Storing InnoDB Undo Logs in Separate Tablespaces”.
| Introduced | 5.6.3 | ||
| Command-Line Format | --innodb_undo_logs=# | ||
| System Variable | Name | innodb_undo_logs | |
| Variable Scope | Global | ||
| Dynamic Variable | Yes | ||
| Permitted Values | Type | integer | |
| Default | 128 | ||
| Min Value | 0 | ||
| Max Value | 128 | ||
Defines the number of
rollback segments
used by InnoDB for data-modifying
transactions that generate undo records. Each rollback segment
can support a maximum of 1024 data-modifying transactions.
This setting is appropriate for tuning performance if you
observe mutex contention related to the undo logs. The
innodb_undo_logs option
replaces
innodb_rollback_segments. For
the total number of available rollback segments, rather than
the number of active ones, see the
Innodb_available_undo_logs
status variable.
Although you can increase or decrease the number of rollback
segments used by InnoDB, the number of
rollback segments physically present in the system never
decreases. Thus you might start with a low value for this
parameter and gradually increase it, to avoid allocating
rollback segments that are not required. If
innodb_undo_logs is not set,
it defaults to the maximum value of 128.
For information about rollback segments, see Section 14.3, “InnoDB Multi-Versioning”. For information about configuring separate undo tablespaces, see Section 14.7.7, “Storing InnoDB Undo Logs in Separate Tablespaces”.
| Introduced | 5.6.3 | ||
| Command-Line Format | --innodb_undo_tablespaces=# | ||
| System Variable | Name | innodb_undo_tablespaces | |
| Variable Scope | Global | ||
| Dynamic Variable | No | ||
| Permitted Values | Type | integer | |
| Default | 0 | ||
| Min Value | 0 | ||
| Max Value | 126 | ||
The number of
tablespace files that
rollback segments
are divided between when you use a non-zero
innodb_undo_logs setting. By
default, rollback segments are assigned to the
system
tablespace, and the system tablespace is always
assigned at least one rollback segment.
Because undo logs can become large during long-running
transactions, having undo logs in multiple tablespaces reduces
the maximum size of any one tablespace. The undo tablespace
files are created in the location defined by
innodb_undo_directory, with
names in the form of
undo, where
NN is a sequential series of
integers (including leading zeros). The default size of an
undo tablespace file is 10M.
innodb_undo_tablespaces can
only be configured prior to initializing the MySQL instance
and cannot be changed afterward. If no value is specified,
the instance is initialized using the default setting
(0). Attempting to restart
InnoDB with a greater number of undo
tablespaces than specified when the MySQL instance was
initialized results in a startup failure and an error
stating that InnoDB did not find the
expected number of undo tablespaces.
For information about configuring separate undo tablespaces, see Section 14.7.7, “Storing InnoDB Undo Logs in Separate Tablespaces”.
| Command-Line Format | --innodb_use_native_aio=# | ||
| System Variable | Name | innodb_use_native_aio | |
| Variable Scope | Global | ||
| Dynamic Variable | No | ||
| Permitted Values | Type | boolean | |
| Default | ON | ||
Specifies whether to use the Linux asynchronous I/O subsystem. This variable applies to Linux systems only, and cannot be changed while the server is running. Normally, you do not need to touch this option, because it is enabled by default.
As of MySQL 5.5, the
asynchronous I/O
capability that InnoDB has on Windows
systems is available on Linux systems. (Other Unix-like
systems continue to use synchronous I/O calls.) This feature
improves the scalability of heavily I/O-bound systems, which
typically show many pending reads/writes in the output of the
command SHOW ENGINE INNODB STATUS\G.
Running with a large number of InnoDB I/O
threads, and especially running multiple such instances on the
same server machine, can exceed capacity limits on Linux
systems. In this case, you may receive the following error:
EAGAIN: The specified maxevents exceeds the user's limit of available events.
You can typically address this error by writing a higher limit
to /proc/sys/fs/aio-max-nr.
However, if a problem with the asynchronous I/O subsystem in
the OS prevents InnoDB from starting, you
can start the server with
innodb_use_native_aio=0
disabled (use
innodb_use_native_aio=0 in
the option file). This option may also be turned off
automatically during startup if InnoDB
detects a potential problem such as a combination of
tmpdir location, tmpfs
filesystem, and Linux kernel that does not support AIO on
tmpfs.
| Deprecated | 5.6.3 | ||
| Command-Line Format | --innodb_use_sys_malloc=# | ||
| System Variable | Name | innodb_use_sys_malloc | |
| Variable Scope | Global | ||
| Dynamic Variable | No | ||
| Permitted Values | Type | boolean | |
| Default | ON | ||
Whether InnoDB uses the operating system
memory allocator (ON) or its own
(OFF). The default value is
ON. See
Section 14.6.4, “Configuring the Memory Allocator for InnoDB” for more
information.
As of MySQL 5.6.3,
innodb_use_sys_malloc is
deprecated and will be removed in a future MySQL release.
The InnoDB version number. Starting in
5.6.11, the separate numbering for InnoDB
is discontinued and this value is the same as for the
version variable.
| Command-Line Format | --innodb_write_io_threads=# | ||
| System Variable | Name | innodb_write_io_threads | |
| Variable Scope | Global | ||
| Dynamic Variable | No | ||
| Permitted Values | Type | integer | |
| Default | 4 | ||
| Min Value | 1 | ||
| Max Value | 64 | ||
The number of I/O threads for write operations in
InnoDB. The default value is 4. Its
counterpart for read threads is
innodb_read_io_threads. See
Section 14.6.7, “Configuring the Number of Background InnoDB I/O Threads” for
more information. For general I/O tuning advice, see
Section 8.5.8, “Optimizing InnoDB Disk I/O”.
On Linux systems, running multiple MySQL servers (typically
more than 12) with default settings for
innodb_read_io_threads,
innodb_write_io_threads, and the Linux
aio-max-nr setting can exceed system
limits. Ideally, increase the aio-max-nr
setting; as a workaround, you might reduce the settings for
one or both of the MySQL configuration options.
You should also take into consideration the value of
sync_binlog, which controls
synchronization of the binary log to disk.
For general I/O tuning advice, see Section 8.5.8, “Optimizing InnoDB Disk I/O”.