#### 15.20.6.3 调优 InnoDB memcached 插件性能

因为使用`InnoDB`结合**内存缓存**涉及将所有数据写入磁盘，无论是立即还是稍后的某个时间，原始性能预计会比使用**内存缓存**通过它自己。使用时`InnoDB` **内存缓存**插件，重点调整目标**内存缓存**比等效 SQL 操作获得更好性能的操作。

基准表明查询和[DML](glossary.html#glos_dml)使用**内存缓存**接口比传统的 SQL 更快。DML 操作通常会看到较大的改进。因此，考虑调整写入密集型应用程序以使用**内存缓存**先说界面。还要考虑优先适应使用缺乏可靠性的快速、轻量级机制的写入密集型应用程序。

##### 调整 SQL 查询

最适合简单的查询类型`得到`请求是具有单个子句或一组`和`中的条件`在哪里`条款：

```
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` [缓冲池](glossary.html#glos_buffer_pool)，通过[`innodb_buffer_pool_size`](innodb-parameters.html#sysvar_innodb_buffer_pool_size)配置选项。对于具有数 GB 缓冲池的系统，请考虑提高[`innodb_buffer_pool_instances`](innodb-parameters.html#sysvar_innodb_buffer_pool_instances)当大多数操作涉及已缓存在内存中的数据时，可获得最大吞吐量。

##### 减少冗余 I/O

`InnoDB`具有许多设置，可让您在高可靠性（以防崩溃）和高写入工作负载期间的 I/O 开销量之间选择平衡。例如，考虑设置[`innodb_doublewrite`](innodb-parameters.html#sysvar_innodb_doublewrite)到`0`和[`innodb_flush_log_at_trx_commit`](innodb-parameters.html#sysvar_innodb_flush_log_at_trx_commit)到`2`.用不同的方法衡量性能[`innodb_flush_method`](innodb-parameters.html#sysvar_innodb_flush_method)设置。

有关为表操作减少或调整 I/O 的其他方法，请参阅[第 8.5.8 节，“优化 InnoDB 磁盘 I/O”](optimizing-innodb-diskio.html).

##### 减少事务开销

默认值为 1[`daemon_memcached_r_batch_size`](innodb-parameters.html#sysvar_daemon_memcached_r_batch_size)和[`daemon_memcached_w_batch_size`](innodb-parameters.html#sysvar_daemon_memcached_w_batch_size)旨在实现结果的最大可靠性以及存储或更新数据的安全性。

根据应用程序的类型，您可能会增加这些设置中的一项或两项，以减少频繁使用的开销[犯罪](glossary.html#glos_commit)操作。在繁忙的系统上，您可能会增加[`daemon_memcached_r_batch_size`](innodb-parameters.html#sysvar_daemon_memcached_r_batch_size)，知道通过 SQL 对数据所做的更改可能不可见**内存缓存**立即（也就是说，直到*`ñ`*更多的`得到`处理操作）。在处理必须可靠存储每个写入操作的数据时，请离开[`daemon_memcached_w_batch_size`](innodb-parameters.html#sysvar_daemon_memcached_w_batch_size)调成`1`.在处理大量仅用于统计分析的更新时增加设置，其中丢失最后一个*`ñ`*意外退出中的更新是可接受的风险。

例如，假设一个系统监控通过繁忙桥梁的交通，每天记录大约 100,000 辆汽车的数据。如果应用程序计算不同类型的车辆来分析交通模式，改变[`daemon_memcached_w_batch_size`](innodb-parameters.html#sysvar_daemon_memcached_w_batch_size)从`1`到`100`将提交操作的 I/O 开销降低了 99%。如果发生中断，最多会丢失 100 条记录，这可能是可接受的误差范围。相反，如果应用程序为每辆车执行自动收费，您将设置[`daemon_memcached_w_batch_size`](innodb-parameters.html#sysvar_daemon_memcached_w_batch_size)到`1`确保每条收费记录立即保存到磁盘。

因为路`InnoDB`组织**内存缓存**磁盘上的键值，如果您要创建大量键，在应用程序中按键值对数据项进行排序可能会更快，并且`添加`它们按排序顺序排列，而不是按任意顺序创建键。

这**微信**命令，它是常规的一部分**内存缓存**分发但不包括在`daemon_memcached`插件，可用于对不同配置进行基准测试。它还可用于生成示例键值对以在您自己的基准测试中使用。看[**libmemcached**命令行实用程序](https://dev.mysql.com/doc/refman/5.6/en/ha-memcached-interfaces-libmemcached.html#ha-memcached-interfaces-libmemcached-utilities)详情。
