1.若是 Unixtop或 Windows任务管理器(Task Manager)显示服务的 CPU 占用率小于 70%,你的系统瓶颈可能在磁盘读写上。
或许你提交了大量的事务,或者是缓冲池(buffer pool)过小了。将缓冲池设大点会有所帮助,但必定要注意不能大于物理内存的 80%。
2.在一个事务中包含几个修改。若是事务对数据库进行了修改,那么在这个事务提交时 InnoDB 必须刷新日志到磁盘上。
由于硬盘的旋转速度一般至多为 167 转/秒,那么只要磁盘不欺骗操做系统,提交的事务数目限止也一样为 167 次/秒·用户。
3.若是掉失最近的几个事务无所谓的话,能够在my.cnf文件中将参数innodb_flush_log_at_trx_commit设置为 0。
InnoDB 不管如何老是尝试一秒刷新(flush)一第二天志,尽管刷新并不能获得保证。
4.将日志文件(log files)设大一点,使日志文件的总和正好与缓冲池(buffer pool)同样大。
当 InnoDB 用光日志文件的空间时,它不得不在一个时间点上将缓冲池内修改过的内容写到磁盘上。
小的日志文件可能引发没必要要的磁盘写操做。可是大的日志文件的缺点就是在数据恢复时将占用较长的时间。
5.一样 log buffer 尽可能设大点,好比说 8 MB。
6.若是要存储变长的字符串或字段可能会包含大量的 NULLs,请使用VARCHAR型字段代替CHAR。
一个CHAR(n)字段老是使用 n bytes 来存储数据,即便这个字符串很短或是一个 NULL 值。
较小的表更加适合缓冲池同时可以减小磁盘 I/O 。
7.(适合从 3.23.41 以上版本) 在某些版本的 Linux 和 Unixes 中,使用 Unixfsync或其它相似的方法将文件刷新到磁盘是异常地慢的。
InnoDB 默认的方法就是fsync。若是你对数据库系统的磁盘写性能不能感到满意,你能够尝试在my.cnf中将innodb_flush_method设置为O_DSYNC,
尽管O_DSYNC选项在多数的系统上看起来比较慢。
8.在向 InnoDB 导入数据时,请确认 MySQL 没有打开autocommit=1。
不然每一个插入语句都要将 log 刷新到磁盘。在你的 SQL 导入文件的第一行加入
set autocommit=0;并在最后一行加入commit;
若是使用mysqldump选项--opt,你将会获得一个快速导入 InnoDB 表的转储(dump)文件,甚至能够再也不使用上面所提的set autocommit=0; ... commit;。
9.当心 insert 集全的大回滚(roolback):在插入时 InnoDB 使用插入缓冲来减小磁盘 I/O,但在相应的回滚中却没有使用这样的机制。
一个 disk-bound rollback 可能会花费相应插入时间的 30 倍。若是发生一个失控的回滚,你能够查看第 6.1 章节的技巧来中止它。
10.一样也要当心一个大的 disk-bound 的操做。使用DROP TABLE或TRUNCATE(从 MySQL-4.0 以上) 来清空一个表,而不要使用DELETE FROM yourtable。
11.若是须要插入大量记录行可使用多行(multi-line)的INSERT来减小客户端与服务器端的通讯开销:
INSERT INTO yourtable VALUES (1, 2), (5, 5);这个技巧对插入任何表均有效,而不单单是 InnoDB。
12.若是在辅键上有UNIQUE约束,从 3.23.52 和 4.0.3 开始,能够经过在一个导入会话中将惟一键检查(uniqueness check)关闭来提升数据导入速度:
SET UNIQUE_CHECKS=0;一个大的表导入这将减小大量的磁盘 I/O,由于这时 InnoDB 可能使用自身的插入缓冲来分批地记录辅助索引。
13.若是在表中有一个子FOREIGN KEY约束,从 3.23.52 和 4.0.3 开始,能够经过在一个导入会话中将外键检查(foreign key check)关闭来提升数据导入速度:
SET FOREIGN_KEY_CHECKS=0; 对一个大的表导入这将减小大量的磁盘 I/O。