14.1.2 InnoDBtable 的最佳做法

本节介绍使用InnoDBtable 时的最佳做法。

  • 使用一个或多个最频繁查询的列为每个 table 指定一个primary key,如果没有明显的主键,则指定一个auto-increment值。

  • 使用joins时,将根据来自多个 table 的相同 ID 值从这些 table 中提取数据。为了提高连接性能,请在连接列上定义foreign keys,然后在每个 table 中使用相同的数据类型声明这些列。添加外键可确保对引用的列进行索引,从而可以提高性能。外键还会将删除或更新传播到所有受影响的 table,并且如果父 table 中不存在相应的 ID,则可以防止在子 table 中插入数据。

  • 关闭autocommit。每秒提交数百次会限制性能(受存储设备的写入速度限制)。

  • 通过将START TRANSACTIONCOMMIT语句放在方括号中,将相关的DML操作集分组为transactions。虽然您不想过于频繁地提交,但是您也不想发出大量的INSERTUPDATEDELETE语句,这些语句运行了几个小时而没有提交。

  • 不使用LOCK TABLES语句。 InnoDB可以一次处理所有一次读取和写入同一张 table 的多个会话,而不会牺牲可靠性或高性能。要获得对一组行的排他性写访问权限,请使用选择...更新语法仅锁定要更新的行。

  • 启用innodb_file_per_table选项或使用常规 table 空间将 table 的数据和索引放入单独的文件中,而不是system tablespace

默认情况下启用innodb_file_per_table选项。

  • 评估您的数据和访问模式是否受益于InnoDBtable 或第compression页功能。您可以压缩InnoDB个 table 而不会牺牲读/写功能。

  • 如果在CREATE TABLEENGINE=子句中指定的引擎存在问题,请使用选项--sql_mode=NO_ENGINE_SUBSTITUTION运行服务器以防止使用其他存储引擎创建 table。