Historically, all InnoDB tables and indexes
were stored in the system
tablespace. This monolithic approach was targeted at
machines dedicated entirely to database processing, with carefully
planned data growth, where any disk storage allocated to MySQL
would never be needed for other purposes.
InnoDB's
file-per-table
tablespace feature provides a more flexible alternative,
where each InnoDB table and its indexes are
stored in a separate
.ibd data
file. Each such
.ibd data
file represents an individual
tablespace. This feature is
controlled by the
innodb_file_per_table
configuration option, which is enabled by default in MySQL 5.6.6
and higher.
Advantages of File-Per-Table Tablespaces
You can reclaim disk space when truncating or dropping a table stored in a file-per-table tablepace. Truncating or dropping tables stored in the shared system tablespace creates free space internally in the system tablespace data files (ibdata files) which can only be used for new
InnoDBdata.Similarly, a table-copying
ALTER TABLEoperation on table that resides in a shared tablespace can increase the amount of space used by the tablespace. Such operations may require as much additional space as the data in the table plus indexes. The additional space required for the table-copyingALTER TABLEoperation is not released back to the operating system as it is for file-per-table tablespaces.The
TRUNCATE TABLEoperation is faster when run on tables stored in file-per-table tablepaces.You can store specific tables on separate storage devices, for I/O optimization, space management, or backup purposes. In previous releases, you had to move entire database directories to other drives and create symbolic links in the MySQL data directory, as described in Section 9.12.4, “Using Symbolic Links”. In MySQL 5.6.6 and higher, you can specify the location of each table using the syntax
CREATE TABLE ... DATA DIRECTORY =, as explained in Section 15.7.5, “Creating a File-Per-Table Tablespace Outside the Data Directory”.absolute_path_to_directoryYou can run
OPTIMIZE TABLEto compact or recreate a file-per-table tablespace. When you run anOPTIMIZE TABLE,InnoDBcreates a new.ibdfile with a temporary name, using only the space required to store actual data. When the optimization is complete,InnoDBremoves the old.ibdfile and replaces it with the new one. If the previous.ibdfile grew significantly but the actual data only accounted for a portion of its size, runningOPTIMIZE TABLEcan reclaim the unused space.You can move individual
InnoDBtables rather than entire databases.You can copy individual
InnoDBtables from one MySQL instance to another (known as the transportable tablespace feature).Tables created in file-per-table tablespaces use the Barracuda file format. The Barracuda file format enables features such as compressed and dynamic row formats.
You can enable more efficient storage for tables with large
BLOBorTEXTcolumns using the dynamic row format.File-per-table tablespaces may improve chances for a successful recovery and save time when a corruption occurs, when a server cannot be restarted, or when backup and binary logs are unavailable.
File-per-table tablespaces are convenient for per-table status reporting when copying or backing up tables.
You can monitor table size at a file system level, without accessing MySQL.
Common Linux file systems do not permit concurrent writes to a single file when
innodb_flush_methodis set toO_DIRECT. As a result, there are possible performance improvements when using file-per-table tablespaces in conjunction withinnodb_flush_method.The system tablespace stores the data dictionary and undo logs, and has a 64TB size limit. By comparison, each file-per-table tablespace has a 64TB size limit, which provides you with room for growth. See Section C.10.3, “Limits on Table Size” for related information.
Potential Disadvantages of File-Per-Table Tablespaces
With file-per-table tablespaces, each table may have unused space, which can only be utilized by rows of the same table. This could lead to wasted space if not properly managed.
fsyncoperations must run on each open table rather than on a single file. Because there is a separatefsyncoperation for each file, write operations on multiple tables cannot be combined into a single I/O operation. This may requireInnoDBto perform a higher total number offsyncoperations.mysqld must keep one open file handle per table, which may impact performance if you have numerous tables in file-per-table tablespaces.
More file descriptors are used.
innodb_file_per_tableis enabled by default in MySQL 5.6.6 and higher. You may consider disabling it if backward compatibility with MySQL 5.5 or 5.1 is a concern. Disablinginnodb_file_per_tablepreventsALTER TABLEfrom moving anInnoDBtable from the system tablespace to an individual.ibdfile in cases whereALTER TABLErecreates the table (ALGORITHM=COPY).For example, when restructuring the clustered index for an
InnoDBtable, the table is re-created using the current setting forinnodb_file_per_table. This behavior does not apply when adding or droppingInnoDBsecondary indexes. When a secondary index is created without rebuilding the table, the index is stored in the same file as the table data, regardless of the currentinnodb_file_per_tablesetting. This behavior also does not apply to tables added to the system tablespace usingCREATE TABLE ... TABLESPACEorALTER TABLE ... TABLESPACEsyntax. These tables are not affected by theinnodb_file_per_tablesetting.If many tables are growing there is potential for more fragmentation which can impede
DROP TABLEand table scan performance. However, when fragmentation is managed, having files in their own tablespace can improve performance.The buffer pool is scanned when dropping a file-per-table tablespace, which can take several seconds for buffer pools that are tens of gigabytes in size. The scan is performed with a broad internal lock, which may delay other operations. Tables in the system tablespace are not affected.
The
innodb_autoextend_incrementvariable, which defines increment size (in MB) for extending the size of an auto-extending shared tablespace file when it becomes full, does not apply to file-per-table tablespace files, which are auto-extending regardless of theinnodb_autoextend_incrementsetting. The initial extensions are by small amounts, after which extensions occur in increments of 4MB.