14.1.2 InnoDBtable 的最佳做法
本节介绍使用InnoDB
table 时的最佳做法。
-
使用一个或多个最频繁查询的列为每个 table 指定一个primary key,如果没有明显的主键,则指定一个auto-increment值。
-
使用joins时,将根据来自多个 table 的相同 ID 值从这些 table 中提取数据。为了提高连接性能,请在连接列上定义foreign keys,然后在每个 table 中使用相同的数据类型声明这些列。添加外键可确保对引用的列进行索引,从而可以提高性能。外键还会将删除或更新传播到所有受影响的 table,并且如果父 table 中不存在相应的 ID,则可以防止在子 table 中插入数据。
-
关闭autocommit。每秒提交数百次会限制性能(受存储设备的写入速度限制)。
-
通过将
START TRANSACTION
和COMMIT
语句放在方括号中,将相关的DML操作集分组为transactions。虽然您不想过于频繁地提交,但是您也不想发出大量的INSERT,UPDATE或DELETE语句,这些语句运行了几个小时而没有提交。 -
不使用LOCK TABLES语句。
InnoDB
可以一次处理所有一次读取和写入同一张 table 的多个会话,而不会牺牲可靠性或高性能。要获得对一组行的排他性写访问权限,请使用选择...更新语法仅锁定要更新的行。 -
启用innodb_file_per_table选项或使用常规 table 空间将 table 的数据和索引放入单独的文件中,而不是system tablespace。
默认情况下启用innodb_file_per_table选项。
-
评估您的数据和访问模式是否受益于
InnoDB
table 或第compression页功能。您可以压缩InnoDB
个 table 而不会牺牲读/写功能。 -
如果在CREATE TABLE的
ENGINE=
子句中指定的引擎存在问题,请使用选项--sql_mode=NO_ENGINE_SUBSTITUTION运行服务器以防止使用其他存储引擎创建 table。