InnoDB memcached Plugin在2012年NoSQL Memcached API for MySQL中提出 ,可谓达到mysql的最高水准,据说MySQL 5.7版本中单机已经支持到每秒百万级,很多时候我们在研究新技术,更多的时候还是借鉴它的设计理念,并从中得到启发。
测试基准
InnoDB memcached Architecture
innodb memcached插件将memcached实现为一个mysql插件守护进程,该守护进程直接访问innodb存储引擎,绕过mysql sql层。它的好处在于提高单个数据库服务器的效率,而不是利用未使用的内存或将查找分布在大量服务器上。
为了更好的吞吐量,innodb memcached通过控制较低提交新数据和更改数据的频率。当memcached操作插入、更新或删除基础innodb表中的数据时,可能会立即将更改提交到innodb表(如果守护进程memcached的批处理大小=1)或稍后某个时间(如果守护进程memcached的批处理大小值大于1)。无论哪种情况,都不能回滚更改。如果增加守护进程memcached的批处理大小的值以避免繁忙时间的高I/O开销,那么当工作负载减少时提交可能变得不频繁。作为安全措施,后台线程会定期自动提交通过memcached API所做的更改。同步间隔由innodb_api_bk_commit_interval 配置项控制,默认设置为5秒。
InnoDB Memcached与传统Memcached的区别
可以参阅相关文章
谁在用?
Facebook、阿里tddl
使用场景
类 KeyValue 查询(例如,SELECT id, name FROM users WHERE id=1002),这类 SQL 已经非常简单,但使用比率非常高。
memcached Commands and Associated DML or DDL Operations
memcached Command | DML or DDL Operations |
---|---|
get | a read/fetch command |
set | a search followed by an INSERT or UPDATE (depending on whether or not a key exists) |
add | a search followed by an INSERT or UPDATE |
replace | a search followed by an UPDATE |
append | a search followed by an UPDATE (appends data to the result before UPDATE ) |
prepend | a search followed by an UPDATE (prepends data to the result before UPDATE ) |
incr | a search followed by an UPDATE |
decr | a search followed by an UPDATE |
delete | a search followed by a DELETE |
flush_all | TRUNCATE TABLE (DDL) |
相关参数
使用 innodb_api_trx_level配置项控制事务隔离级别。
使用 innodb_api_disable_rowlock 选项禁用行锁。
使用 innodb_api_enable_mdl来禁用这些表上的DDL操作
使用
最适合简单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
引用资料