14.21.5.3 调整 InnoDB 内存缓存插件性能

因为结合使用InnoDBmemcached 涉及将所有数据写入磁盘,无论是立即还是稍后,所以原始性能预计会比单独使用 memcached 慢一些。使用InnoDB memcached 插件时,请将 memcached 操作的调整目标集中在获得比等效 SQL 操作更好的性能上。

基准测试 table 明,使用 memcached 接口的查询和DML操作(插入,更新和删除)比传统 SQL 更快。 DML 操作通常会看到较大的改进。因此,请考虑让写密集型应用程序首先使用 memcached 接口。还应考虑优先考虑使用缺乏可靠性的快速,轻量级机制的写密集型应用程序的适配。

调整 SQL 查询

最适合简单GET请求的查询类型是在WHERE子句中具有单个子句或一组AND条件的查询:

SQL:
SELECT col FROM tbl WHERE key = 'key_value';

memcached:
get key_value

SQL:
SELECT col FROM tbl WHERE col1 = val1 and col2 = val2 and col3 = val3;

memcached:
# Since you must always know these 3 values to look up the key,
# combine them into a unique string and use that as the key
# for all ADD, SET, and GET operations.
key_value = val1 + ":" + val2 + ":" + val3
get key_value

SQL:
SELECT 'key exists!' FROM tbl
  WHERE EXISTS (SELECT col1 FROM tbl WHERE KEY = 'key_value') LIMIT 1;

memcached:
# Test for existence of key by asking for its value and checking if the call succeeds,
# ignoring the value itself. For existence checking, you typically only store a very
# short value such as "1".
get key_value
使用系统内存

为了获得最佳性能,请在配置为典型数据库服务器的计算机上部署daemon_memcached插件,其中大多数系统 RAM 通过innodb_buffer_pool_size配置选项专用于InnoDB buffer pool。对于具有数千兆字节缓冲池的系统,当大多数操作涉及已缓存在内存中的数据时,请考虑提高innodb_buffer_pool_instances的值以实现最大吞吐量。

减少冗余 I/O

InnoDB有许多设置,可让您在发生崩溃的情况下的高可靠性与高写入工作负载期间的 I/O 开销之间进行平衡。例如,考虑将innodb_doublewrite设置为0并将innodb_flush_log_at_trx_commit设置为2。使用不同的innodb_flush_method设置来衡量效果。

Note

innodb_support_xa已过时,将在以后的版本中删除。从 MySQL 5.7.10 开始,始终启用InnoDB支持 XA 事务中的两阶段提交,并且不再允许禁用innodb_support_xa

有关减少或调整 table 操作的 I/O 的其他方法,请参见第 8.5.8 节“优化 InnoDB 磁盘 I/O”

减少 Transaction 费用

daemon_memcached_r_batch_sizedaemon_memcached_w_batch_size的默认值 1 是为了最大程度地提高结果的可靠性以及存储或更新数据的安全性。

根据应用程序的类型,您可以增加这两个设置之一或全部以减少频繁进行commit操作的开销。在繁忙的系统上,您可能会增加daemon_memcached_r_batch_size,因为知道通过 SQL 进行的数据更改可能不会立即对 memcached 可见(即,直到* N 更多的get操作被处理)。当处理必须可靠存储每个写操作的数据时,请将daemon_memcached_w_batch_size设置为1。在处理仅用于统计分析的大量更新时增加设置,在这种情况下,崩溃中丢失最后的 N *更新是可以接受的风险。

例如,假设有一个系统监视穿过繁忙 bridge 梁的交通,每天记录大约 100,000 辆车的数据。如果应用程序使用不同类型的车辆来分析流量模式,则将daemon_memcached_w_batch_size1更改为100可以将提交操作的 I/O 开销减少 99%。如果发生中断,最多会丢失 100 条记录,这可能是可接受的错误范围。相反,如果该应用程序对每辆汽车执行自动收费,则应将daemon_memcached_w_batch_size设置为1以确保将每个收费记录立即保存到磁盘。

由于InnoDB在磁盘上组织 memcached 键值的方式,如果要创建大量键,则按应用程序中的键值对数据项进行排序并按排序 Sequencesadd对其进行排序可能会更快。比以任意 Sequences 创建密钥。

memslap 命令是常规 memcached **发行版的一部分,但不包含在daemon_memcached插件中,它对于基准测试不同的配置很有用。它还可以用于生成示例键值对以用于您自己的基准测试。有关详情,请参见libmemcached 命令行 Util