ALTER TABLE
或 CREATE INDEX
来修改一个已经有了外键约束或参考了外键约束的表。使用
DROP TABLE
和 CREATE TABLE
来代替它。
'user'
或 'host'
)转换成 InnoDB 类型。系统表必须总是为 MyISAM 类型的。
SELECT COUNT(*) FROM T
,InnoDB 不得不扫描表的一个索引,如果表没有完全在缓冲池中这将花费一些时间。
为了得到更快的计数你不得不使用自己创建一个计数表,让你的应用程序在插入与删除时自己更新它。 消除因锁等待引起的瓶颈的一个方法就是创建整体的计数器集。应用程序可以随机地每次选择一个。
为了得到计数,仅仅只要对计数器求和:SELECT SUM(counter_column) FROM your_counter_table
。
CREATE TABLE
语句中使用 AUTO_INCREMENT=...
。这个子句是为了给一个 auto-increment 列设置第一个值(默认的第一个值为 1)。工作区(Workaround):向自增列中插入一个指定的值做为第一个值。从此,InnoDB
将从这值开始增加。
SHOW TABLE STATUS
不能给出 InnoDB 表的精密统计数据,除了由表保留的物理大小之外。记录行数只能通过一个优化的 SQL 来获得大致的估计。
load
table from master
仍然不能在 InnoDB 表中工作。 在主(master)服务器中开设一个工作区(workaround
)用于将表转换成 MyISAM 型,然后再进行 load,之后再在 master 中将表改回 InnoDB 类型。
CREATE TABLE T (A CHAR(20), B INT, INDEX T_IND (A(5))) TYPE = InnoDB;
InnoDB 将内在的在整个列上建立一个索引,而不是仅以设定的首部分。
INSERT
DELAYED
。
LOCK TABLES
操作无法知道一个 SQL 语句已完成对 InnoDB 的行锁定:这就意味着即使已有其它用户的事务在同一张表上设置了行锁,你仍然会锁定该表。 所以你在这张表上的操作与其它用户的锁定冲突则不得不等待。同样死锁也是可能的。无论如何,
这能事务完整性(transaction integrity)并不危险,因为 InnoDB 设置的行级锁定通常会照顾完整性(integrity)的。同样,一个表级锁定可以防止其它事务在表上获得更多的行级锁定(锁定模式不一致)。
BLOB
或
TEXT
字段上无法设置索引。
DELETE FROM TABLE
除了删除所有记录行之外不再重建表,一个接一个地删除,这并不那么快。在将来的 MySQL 版本中可以使用 TRUNCATE
,这是相当快的。
DROP DATABASE
之前,必须调用 DROP TABLE
来移除(drop) 个体的 InnoDB 表。这个限制在 >= 3.23.44 的版本中不再存在。
UNIV_PAGE_SIZE
和 UNIV_PAGE_SIZE_SHIFT
。在版本 <= 3.23.39a 的 InnoDB中,最大记录行长度为比数据库页面长度的一半稍小点。从源释放版本
3.23.39b (但是在 MySQL
-Max 3.23.40 二进制释放版本中仍然没有)开始, BLOB 和 TEXT 字段允许 < 4 GB,整个行长度同样 < 4 GB。InnoDB
不在分开的页面中存储尺寸 <= 128 bytes 的字段。在 InnoDB 通过将长字段存储在分开的页面上修改记录后,剩余的记录行长度必须小于数据库页面的一半。最大键长为
500 bytes。