摘要
本文基于MySQL5.7为基础,讨论与数据库性能相关的一下内容,包括InnoDB和MySIAM的启动配置,影响MySQL性能的参数等。
1 InnoDB启动配置
建议您在创建InnoDB实例之前定义数据文件,日志文件和页面大小配置。
在某些情况下,如果数据并非全部放在同一物理磁盘上,则数据库性能会提高。(提高I/O)
eg. 对系统表空间使用原始磁盘分区
1.1 系统表空间数据文件配置
innodb_data_file_path
启动选项定义了InnoDB系统表空间数据文件的名称,大小和属性。
完整数据文件规范语法包括文件名,文件大小,autoextend属性和 max属性:
[mysqld]
file_name:file_size[:autoextend[:max:max_file_size]]
要指定自动扩展数据文件的最大大小,请使用max属性后面的 autoextend属性。max仅在限制磁盘使用率至关重要的情况下才使用该属性。以下配置允许ibdata1增长到500MB的限制:
[mysqld]
innodb_data_file_path=ibdata1:12M:autoextend:max:500M
1.2 重做日志文件配置
innodb_log_group_home_dir
定义InnoDB日志文件的目录路径(重做日志)。如果未配置此选项, InnoDB则会在MySQL数据目录(datadir)中创建日志文件。您可以使用此选项将InnoDB 日志文件放在与InnoDB数据文件不同的物理存储位置, 以避免潜在的I / O资源冲突。
[mysqld]
innodb_log_group_home_dir = /dr3/iblogs
innodb_log_files_in_group
定义日志组中的日志文件数。默认值和建议值为2。innodb_log_file_size
定义日志组中每个日志文件的大小(以字节为单位)。日志文件的总大小(innodb_log_file_size
*innodb_log_files_in_group
)不能超过略小于512GB的最大值,通常,日志文件的总大小应足够大,以便服务器可以消除工作负载活动中的高峰和低谷,这通常意味着有足够的重做日志空间来处理超过一小时的写入活动。值越大,缓冲池中需要的检查点刷新活动越少,从而节省了磁盘I / O. 有关其他信息
1.3 页面大小配置
innodb_page_size
选项指定InnoDB MySQL实例中所有表空间的页面大小。该值在创建实例时设置,之后保持不变。有效值为64KB,32KB,16KB(默认值),8KB和4KB。
默认页面大小16KB适用于各种工作负载,特别是涉及表扫描和涉及批量更新的DML操作的查询。较小的页面大小对于涉及许多小写入的OLTP工作负载可能更有效,其中当单个页面包含许多行时争用可能是一个问题。较小的页面也可能对SSD存储设备有效,后者通常使用小块大小。保持InnoDB页面大小接近存储设备块大小可以最大限度地减少重写到磁盘的未更改数据量。
1.4 内存配置
MySQL为各种缓存和缓冲区分配内存,以提高数据库操作的性能。 为InnoDB分配内存时,请始终考虑操作系统所需的内存,分配给其他应用程序的内存以及为其他MySQL缓冲区和缓存分配的内存。
innodb_buffer_pool_size
定义缓冲池的大小,缓冲池的大小对系统性能很重要,通常建议将innodb_buffer_pool_size配置为系统内存的50%到75%。默认缓冲池大小为128MB。- 在具有大量内存的系统上,可以通过将缓冲池划分为多个缓冲池实例来提高并发性。缓冲池实例的数量由
innodb_buffer_pool_instances
选项控制。默认情况下,InnoDB创建一个缓冲池实例。 innodb_log_buffer_size
定义InnoDB用于写入磁盘上日志文件的缓冲区的大小(以字节为单位)。 默认大小为16MB。大型日志缓冲区使大型事务能够运行,而无需在事务提交之前将日志写入磁盘。如果您有更新,插入或删除许多行的事务,您可以考虑增加日志缓冲区的大小以节省磁盘I/O。
在Linux上,如果内核启用了大页面支持,则InnoDB可以使用大页面为其缓冲池分配内存。
2 MyISAM启动配置
2.1 bulk_insert_buffer_size
说明:批量插入优化中使用的缓存的大小。
注意:这个参数是线程独占的,为每个线程分配合理的缓存大小能够提高MyISAM批量插入的性能。
2.2 delay_key_write=ALL
说明:不要在任何MyISAM表的写入之间刷新键缓冲区 ,防止索引损坏。
2.3 myisam_max_sort_file_size
说明:在重新创建MyISAM索引时(包括 REPAIR TABLE
,ALTER TABLE
, LOAD DATA
)),允许MySQL使用的临时文件的最大大小。
注意:如果临时文件大小大于此值,那么将使用键缓存来创建索引,这会更慢。
2.4 myisam_recover_options=mode
说明:设置自动恢复崩溃模式 。
2.5 myisam_sort_buffer_size
说明:设置恢复表时使用的缓冲区大小。
3 影响MySQL性能的重要参数
3.1 key_buffer_size
说明:键缓存,所有线程共享;
适用:MyISAM 存储引擎
使用方法:mysql5.1 以后提供了多个 key_buffer,可以将指定的表索引缓存入指定的 key_buffer,这样可以更小的降低线程之间的竞争,相关语法如下:
mysql> CACHE INDEX t1, t2, t3 IN hot_cache;
要想删除键高速缓冲,将其大小设置为零:
mysql> SET GLOBAL keycache1.key_buffer_size=0;
3.2 table_cache
说明:数据库中打开表的缓存数量。table_cache 与 max_connections 有关。例如, 对于 200 个并行运行的连接,应该让表的缓存至少有 200 * N,这里 N 是执行一个联接查询中表的最大数量。
设置技巧:可以通过检查 mysqld 的状态变量 Opened_tables 确定表缓存是否太小:
mysql> SHOW STATUS LIKE 'Opened_tables';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| Opened_tables | 2741 |
+---------------+-------+
如果value的值很大,即使你没有发出许多 FLUSH TABLES 语句,也应增加表缓存的大小。
3.3 innodb_buffer_pool_size
参考本文1.4
3.4 innodb_flush_log_at_trx_commit
0:日志缓冲每秒一次地被写到日志文件,并且对日志文件做到磁盘操作的刷新, 但是在一个事务提交不做任何操作。
1:在每个事务提交时,日志缓冲被写到日志文件,对日志文件做到磁盘操作的 刷新。
2:在每个提交,日志缓冲被写到文件,但不对日志文件做到磁盘操作的刷新。 对日志文件每秒刷新一次。
默认值是 1,也是最安全的设置,即每个事务提交的时候都会从 log buffer 写 到日志文件,而且会实际刷新磁盘,但是这样性能有一定的损失。如果可以容忍在数据库崩溃的时候损失一部分数据,那么设置成 0 或者 2 都会有所改善。不过我想在绝大多数情况下,你是不会允许损失数据的。
在 mysql 的手册中,为了确保事务的持久性和复制设置的耐受性、一致性,都是 建议将这个参数设置为 1 的。
3.5 innodb_lock_wait_timeout
Mysql 可以自动的监测行锁导致的死锁并进行相应的处理,但是对于表锁导致的 死锁不能自动的监测,所以**该参数主要被用来在出现类似情况的时候对锁定进行的后续处理(返回ERR)**。默认值是 50 秒,根据应用的需要进行调整。
3.6 innodb_support_xa
通过该参数设置是否支持分布式事务,默认值是 ON 或者 1,表示支持分布式事 务。如果确认应用中不需要使用分布式事务,则可以关闭这个参数,减少磁盘刷新的次数并获得更好的 InnoDB 性能。
3.7 innodb_doublewrite
默认地,InnoDB 存储所有数据两次,第一次存储到 doublewrite 缓冲,然后存 储到确实的数据文件。如果对性能的要求高于对数据完整性的要求,那么可以通过-- skip-innodb-doublewrite 关闭这个设置。
3.8 innodb_log_buffer_size
默认的设置在中等强度写入负载以及较短事务的情况下,服务器性能还可以。如 果存在更新操作峰值或者负载较大,就应该考虑加大它的值了。如果它的值设置太高 了,可能会浪费内存 – 它每秒都会刷新一次,因此无需设置超过 1 秒所需的内存空 间。通常 8-16MB 就足够了。越小的系统它的值越小。
3.9 innodb_log_file_size
在高写入负载尤其是大数据集的情况下很重要。这个值越大则性能相对越高,但 是要注意到可能会增加恢复时间。
参考
[1] MySQL 5.7 Reference Manual.
[2] [eimhe.com]网易技术部的MySQL中文资料.