### 15.1.2 InnoDB 表的最佳实践

本节介绍使用时的最佳实践`InnoDB`表。

-   使用最频繁查询的一个或多个列为每个表指定一个主键，如果没有明显的主键，则指定一个自动增量值。

-   只要基于这些表中相同的 ID 值从多个表中提取数据，就可以使用连接。为了快速连接性能，在连接列上定义外键，并在每个表中声明具有相同数据类型的列。添加外键可确保对引用的列进行索引，从而提高性能。外键还会将删除和更新传播到所有受影响的表，如果父表中不存在相应的 ID，则防止在子表中插入数据。

-   关闭自动提交。每秒提交数百次会限制性能（受存储设备的写入速度限制）。

-   通过将一组相关的 DML 操作用括号括起来，将它们分组到事务中`开始交易`和`犯罪`陈述。虽然您不想过于频繁地提交，但您也不想发布大量的[`插入`](insert.html),[`更新`](update.html)， 要么[`删除`](delete.html)运行数小时而不提交的语句。

-   不使用[`锁定表`](lock-tables.html)陈述。`InnoDB`可以同时处理多个会话，同时读取和写入同一个表，而不会牺牲可靠性或高性能。要获得对一组行的独占写入访问权限，请使用[`选择 ... 更新`](innodb-locking-reads.html)仅锁定要更新的行的语法。

-   启用[`innodb_file_per_table`](innodb-parameters.html#sysvar_innodb_file_per_table)变量或使用通用表空间将表的数据和索引放入单独的文件而不是系统表空间。这[`innodb_file_per_table`](innodb-parameters.html#sysvar_innodb_file_per_table)默认情况下启用变量。

-   评估您的数据和访问模式是否受益于`InnoDB`表或页面压缩功能。你可以压缩`InnoDB`不牺牲读/写能力的表。

-   运行服务器[`--sql_mode=NO_ENGINE_SUBSTITUTION`](server-system-variables.html#sysvar_sql_mode)防止使用您不想使用的存储引擎创建表的选项。
