InnoDB最佳实现
- 用查询最频繁的一个或多个列作为主键,如果没有明显的主键,可以用自增列作为主键。
从多个表中取数据时,如表与表之间的关联基于恒等的值,使用join。使用外键有几个可以带来较快查询性能的技巧:
- 为关联列创建外键,并声明成相同的数据类型。
- 为关联列创建索引。
外键会把删除修改操作扩散到相关联的表中,如果子表中不存在关联的id,写操作会被阻止。
- 关闭自动提交。
- 使用
START TRANSACTION
,COMMIT
将大量的DML
(INSERT
,UPDATE
,DELETE
)语句分散到不同的事务中。即便是不想太频繁地提交事务,也不能一次提交一个一次跑几个小时的事务。 - 不使用锁表语句。在不牺牲可能性和高性能的前提下,InnoDB可以对同一张表同时处理多个对话的所有读写请求。通过
SELECT ... FOR UPDATE
语句来锁住想要修改的行,这样可以获取写操作独占的行。 - 激活
innodb_file_per_talbe
选项,将数据和索引放在表对应单独的文件中,而不是把所有表的数据、索引放在一个巨大的系统空间。innodb_file_per_talbe
选项从5.6.6版本开始使用。 - 创建表示使用压缩(CREATE TABLE (…) ROW_FORMAT=COMPRESSED)。压缩不会牺牲读写性能。
- 当创建表无法指定引擎时,我们可以在启动server时指定选项
--sql_mode=NO_ENGINE_SUBSTITUTION
来防止表被创建成使用其他类型的引擎的表。