Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Best Practices for InnoDB Tables

17.1.2 InnoDB 表的最佳实践

本节描述了使用 InnoDB 表时的最佳实践。

  • 为每个表指定一个主键,使用最频繁查询的列或列组,或者如果没有明显的主键,则使用自动递增值。

  • 在从多个表中提取数据时,使用连接操作,基于这些表中的相同 ID 值。为了快速连接性能,在连接列上定义外键,并在每个表中声明相同的数据类型。添加外键可以确保引用的列被索引,从而提高性能。外键还可以将删除和更新操作传播到所有受影响的表,并防止在父表中不存在相应 ID 的情况下插入数据到子表。

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

  • 使用 START TRANSACTIONCOMMIT 语句将相关的 DML 操作分组到事务中。虽然您不想太频繁地提交,也不想发出数小时不提交的大批量 INSERTUPDATEDELETE 语句。

  • 不要使用 LOCK TABLES 语句。InnoDB 可以处理多个会话同时读取和写入同一个表,而不牺牲可靠性或高性能。要获取某些行的独占写入访问权限,可以使用 SELECT ... FOR UPDATE 语法锁定这些行。

  • 启用 innodb_file_per_table 变量或使用通用表空间将表的数据和索引放入单独的文件中,而不是系统表空间。innodb_file_per_table 变量默认启用。

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

  • 使用 --sql_mode=NO_ENGINE_SUBSTITUTION 选项运行服务器,以防止创建使用不想使用的存储引擎的表。