Warning: Do
not convert MySQL system tables in the
mysql database from
MyISAM to InnoDB tables!
This is an unsupported operation. If you do this, MySQL does
not restart until you restore the old system tables from a
backup or re-generate them with the
mysql_install_db script.
A table cannot contain more than 1000 columns.
The internal maximum key length is 3500 bytes, but MySQL
itself restricts this to 1024 bytes.
The maximum row length, except for VARCHAR,
BLOB and TEXT columns,
is slightly less than half of a database page. That is, the
maximum row length is about 8000 bytes.
LONGBLOB and LONGTEXT
columns must be less than 4GB, and the total row length,
including also BLOB and
TEXT columns, must be less than 4GB.
InnoDB stores the first 768 bytes of a
VARCHAR, BLOB, or
TEXT column in the row, and the rest into
separate pages.
-
Although InnoDB supports row sizes larger
than 65535 internally, you cannot define a row containing
VARCHAR columns with a combined size larger
than 65535:
mysql> CREATE TABLE t (a VARCHAR(8000), b VARCHAR(10000),
-> c VARCHAR(10000), d VARCHAR(10000), e VARCHAR(10000),
-> f VARCHAR(10000), g VARCHAR(10000)) ENGINE=InnoDB;
ERROR 1118 (42000): Row size too large. The maximum row size for the
used table type, not counting BLOBs, is 65535. You have to change some
columns to TEXT or BLOBs
On some older operating systems, files must be less than 2GB.
This is not a limitation of InnoDB itself,
but if you require a large tablespace, you will need to
configure it using several smaller data files rather than one
or a file large data files.
The combined size of the InnoDB log files
must be less than 4GB.
The minimum tablespace size is 10MB. The maximum tablespace
size is four billion database pages (64TB). This is also the
maximum size for a table.
InnoDB tables do not support
FULLTEXT indexes.
-
ANALYZE TABLE determines index cardinality
(as displayed in the Cardinality column of
SHOW INDEX output) by doing eight random
dives to each of the index trees and updating index
cardinality estimates accordingly. Note that because these are
only estimates, repeated runs of ANALYZE
TABLE may produce different numbers. This makes
ANALYZE TABLE fast on
InnoDB tables but not 100% accurate as it
doesn't take all rows into account.
MySQL uses index cardinality estimates only in join
optimization. If some join is not optimized in the right way,
you can try using ANALYZE TABLE. In the few
cases that ANALYZE TABLE doesn't produce
values good enough for your particular tables, you can use
FORCE INDEX with your queries to force the
use of a particular index, or set the
max_seeks_for_key system variable to ensure
that MySQL prefers index lookups over table scans. See
Section 5.2.2, “Server System Variables”, and
Section A.6, “Optimizer-Related Issues”.
SHOW TABLE STATUS does not give accurate
statistics on InnoDB tables, except for the
physical size reserved by the table. The row count is only a
rough estimate used in SQL optimization.
InnoDB does not keep an internal count of
rows in a table. (In practice, this would be somewhat
complicated due to multi-versioning.) To process a
SELECT COUNT(*) FROM t statement,
InnoDB must scan an index of the table,
which takes some time if the index is not entirely in the
buffer pool. To get a fast count, you have to use a counter
table you create yourself and let your application update it
according to the inserts and deletes it does. If your table
does not change often, using the MySQL query cache is a good
solution. SHOW TABLE STATUS also can be
used if an approximate row count is sufficient. See
Section 14.2.11, “InnoDB Performance Tuning Tips”.
On Windows, InnoDB always stores database
and table names internally in lowercase. To move databases in
binary format from Unix to Windows or from Windows to Unix,
you should always use explicitly lowercase names when creating
databases and tables.
For an AUTO_INCREMENT column, you must
always define an index for the table, and that index must
contain just the AUTO_INCREMENT column. In
MyISAM tables, the
AUTO_INCREMENT column may be part of a
multi-column index.
While initializing a previously specified
AUTO_INCREMENT column on a table,
InnoDB sets an exclusive lock on the end of
the index associated with the
AUTO_INCREMENT column. In accessing the
auto-increment counter, InnoDB uses a
specific table lock mode AUTO-INC where the
lock lasts only to the end of the current SQL statement, not
to the end of the entire transaction. Note that other clients
cannot insert into the table while the
AUTO-INC table lock is held; see
Section 14.2.10.2, “InnoDB and AUTOCOMMIT”.
When you restart the MySQL server, InnoDB
may reuse an old value that was generated for an
AUTO_INCREMENT column but never stored
(that is, a value that was generated during an old transaction
that was rolled back).
When an AUTO_INCREMENT column runs out of
values, InnoDB wraps a
BIGINT to
-9223372036854775808 and BIGINT
UNSIGNED to 1. However,
BIGINT values have 64 bits, so do note that
if you were to insert one million rows per second, it would
still take nearly three hundred thousand years before
BIGINT reached its upper bound. With all
other integer type columns, a duplicate-key error results.
This is similar to how MyISAM works,
because it is mostly general MySQL behavior and not about any
storage engine in particular.
DELETE FROM
tbl_name does not
regenerate the table but instead deletes all rows, one by one.
Under some conditions, TRUNCATE
tbl_name for an
InnoDB table is mapped to DELETE
FROM tbl_name and doesn't
reset the AUTO_INCREMENT counter. See
Section 13.2.9, “TRUNCATE Syntax”.
In MySQL 5.1, the MySQL LOCK
TABLES operation acquires two locks on each table if
innodb_table_locks=1 (the default). In
addition to a table lock on the MySQL layer, it also acquires
an InnoDB table lock. Older versions of
MySQL did not acquire InnoDB table locks;
the old behavior can be selected by setting
innodb_table_locks=0. If no
InnoDB table lock is acquired,
LOCK TABLES completes even if some records
of the tables are being locked by other transactions.
All InnoDB locks held by a transaction are
released when the transaction is committed or aborted. Thus,
it does not make much sense to invoke LOCK
TABLES on InnoDB tables in
AUTOCOMMIT=1 mode, because the acquired
InnoDB table locks would be released
immediately.
Sometimes it would be useful to lock further tables in the
course of a transaction. Unfortunately, LOCK
TABLES in MySQL performs an implicit
COMMIT and UNLOCK
TABLES. An InnoDB variant of
LOCK TABLES has been planned that can be
executed in the middle of a transaction.
The LOAD TABLE FROM MASTER statement for
setting up replication slave servers does not yet work for
InnoDB tables. A workaround is to alter the
table to MyISAM on the master, do then the
load, and after that alter the master table back to
InnoDB. Do not do this if the tables use
InnoDB-specific features such as foreign
keys.
The default database page size in InnoDB is
16KB. By recompiling the code, you can set it to values
ranging from 8KB to 64KB. You must update the values of
UNIV_PAGE_SIZE and
UNIV_PAGE_SIZE_SHIFT in the
univ.i source file.
Currently, triggers are not activated by cascaded foreign key
actions.