DOC HOME SITE MAP MAN PAGES GNU INFO SEARCH PRINT BOOK
 

(mysql.info.gz) InnoDB tuning

Info Catalog (mysql.info.gz) InnoDB transaction model (mysql.info.gz) InnoDB (mysql.info.gz) InnoDB Multi-Versioning
 
 15.12 `InnoDB' Performance Tuning Tips
 ======================================
 
    * If the Unix `top' tool or the Windows Task Manager shows that the
      CPU usage percentage with your workload is less than 70%, your
      workload is probably disk-bound. Maybe you are making too many
      transaction commits, or the buffer pool is too small.  Making the
      buffer pool bigger can help, but do not set it bigger than 80% of
      physical memory.
 
    * Wrap several modifications into one transaction. `InnoDB' must
      flush the log to disk at each transaction commit if that
      transaction made modifications to the database. Since the rotation
      speed of a disk is typically at most 167 revolutions/second, that
      constrains the number of commits to the same 167th/second if the
      disk does not fool the operating system.
 
    * If you can afford the loss of some of the latest committed
      transactions, you can set the `my.cnf' parameter
      `innodb_flush_log_at_trx_commit' to 0. `InnoDB' tries to flush the
      log once per second anyway, although the flush is not guaranteed.
 
    * Make your log files big, even as big as the buffer pool. When
      `InnoDB' has written the log files full, it has to write the
      modified contents of the buffer pool to disk in a checkpoint.
      Small log files will cause many unnecessary disk writes. The
      drawback of big log files is that recovery time will be longer.
 
    * Make the log buffer quite big as well (say, 8MB).
 
    * Use the `VARCHAR' column type instead of `CHAR' if you are storing
      variable-length strings or if the column may contain many `NULL'
      values. A `CHAR(N)' column always takes N bytes to store data,
      even if the string is shorter or its value is `NULL'. Smaller
      tables fit better in the buffer pool and reduce disk I/O.
 
    * (Relevant from 3.23.39 up.)  In some versions of GNU/Linux and
      Unix, flushing files to disk with the Unix `fsync()' and other
      similar methods is surprisingly slow.  The default method `InnoDB'
      uses is the `fsync()' function.  If you are not satisfied with the
      database write performance, you might try setting
      `innodb_flush_method' in `my.cnf' to `O_DSYNC', although `O_DSYNC'
      seems to be slower on most systems.
 
    * When importing data into `InnoDB', make sure that MySQL does not
      have autocommit mode enabled because that would require a log
      flush to disk for every insert.  To disable autocommit during your
      import operation, surround it with `SET AUTOCOMMIT' and `COMMIT'
      statements:
 
           SET AUTOCOMMIT=0;
           /* SQL import statements ... */
           COMMIT;
 
      If you use the `mysqldump' option `--opt', you will get dump files
      that are fast to import into an `InnoDB' table, even without
      wrapping them with the `SET AUTOCOMMIT' and `COMMIT' statements.
 
    * Beware of big rollbacks of mass inserts: `InnoDB' uses the insert
      buffer to save disk I/O in inserts, but no such mechanism is used
      in a corresponding rollback.  A disk-bound rollback can take 30
      times the time of the corresponding insert. Killing the database
      process will not help because the rollback will start again at the
      server startup. The only way to get rid of a runaway rollback is
      to increase the buffer pool so that the rollback becomes CPU-bound
      and runs fast, or to use a special procedure.   Forcing
      recovery.
 
    * Beware also of other big disk-bound operations.  Use `DROP TABLE +
      CREATE TABLE' to empty a table, not `DELETE FROM TBL_NAME'.
 
    * Use the multiple-row `INSERT' syntax to reduce communication
      overhead between the client and the server if you need to insert
      many rows:
 
           INSERT INTO yourtable VALUES (1,2), (5,5), ...;
 
      This tip is valid for inserts into any table type, not just
      `InnoDB'.
 
    * If you have `UNIQUE' constraints on secondary keys, starting from
      MySQL 3.23.52 and 4.0.3, you can speed up table imports by
      temporarily turning off the uniqueness checks during the import
      session:
 
           SET UNIQUE_CHECKS=0;
 
      For big tables, this saves a lot of disk I/O because `InnoDB' can
      use its insert buffer to write secondary index records in a batch.
 
    * If you have `FOREIGN KEY' constraints in your tables, starting
      from MySQL 3.23.52 and 4.0.3, you can speed up table imports by
      turning the foreign key checks off for a while in the import
      session:
 
           SET FOREIGN_KEY_CHECKS=0;
 
      For big tables, this can save a lot of disk I/O.
 
    * If you often have recurring queries to tables that are not updated
      frequently, use the query cache available as of MySQL 4.0:
 
           [mysqld]
           query_cache_type = ON
           query_cache_size = 10M
 
      In MySQL 4.0, the query cache works only with autocommit enabled.
      This restriction is removed in MySQL 4.1.1 and up.
 

Menu

 
* InnoDB Monitor              `SHOW INNODB STATUS' and the `InnoDB' Monitors
 
Info Catalog (mysql.info.gz) InnoDB transaction model (mysql.info.gz) InnoDB (mysql.info.gz) InnoDB Multi-Versioning
automatically generated byinfo2html