刚刚,MySQL 战胜了老大哥 Memcached!
Posted InsideMySQL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了刚刚,MySQL 战胜了老大哥 Memcached!相关的知识,希望对你有一定的参考价值。
mysql毫无疑问是当前OLTP领域的霸主,最新的MySQL 8.0版本更是能够轻松跑出百万QPS。
在KV内存领域,虽然这些年Redis风头正劲,但老大哥Memcached凭借其多线程的特性,依然牢牢占据一定的市场份额。
在前一篇文章:,我们已经利用MySQL的Memcached Plugin插件跑出了220万的QPS,通过Memcached协议访问MySQL,然后读取InnoDB存储引擎中的数据。
所以,完全可以将MySQL数据库打造成一个KV数据库。
那么,既然都是KV,MySQL KV和Memcached KV,谁的性能更好呢?
好了,这次安排~~~
This browser does not support music or audio playback. Please play it in Weixin or another browser.
业界没有好用的Memcached基准测试程序,所以,这次还是使用之前自己写的my_test测试程序,测试分为三种场景:
只读测试是内存KV数据库的强项,但是我们的MySQL已经跑出了220万QPS,所以MySQL能否挑战Memcached呢?最后的结果如下所示:
可以看到Memcached非常强悍,在128个线程下可以跑到超过400万的QPS。
对比MySQL,虽然使用KV接口减少了SQL解析的开销,使用InnoDB的自适应哈希索引提升性能,但B+树的数据结构,依然无法匹敌Memcached。128线程下,MySQL的性能约280万。
只读测试让我有些郁闷,即便自适应哈希索引加持,MySQL依然无法战胜Memcached。性能差不多为Memcached只读测试的70%。
本以为接下去的测试会是一边倒的情况,没想到,只写测试,Memcached“翻车”了!!!
可以看到 Memcached 在Set只写测试中,8线程能够跑出35万的QPS,但是随着线程的增加,性能不断下降。反复测试,结果依然如此。
对比MySQL,在32线程下可以取得18万的Set结果。要知道这时,MySQL有事务的保障,需要有额外的开销。
这一轮,虽然Memcached的极限性能值更高,但是MySQL的表现更为平稳,并且有事务保障,数据不会丢失。这一轮,MySQL胜。
最后,我们来看看混合读写测试场景,大多KV数据库用于读多写少的场景,这里我们测试选择读写比例5:1,读取比例超过80%。最后的测试结果为:
测试结果与只写测试类似,在低并发下,Memcached优势明显,高并发下MySQL后来居上。极限值Memcached可以达到近100万的QPS,MySQL 32线程下表现最佳,性能可达62万QPS。
上述测试,我们都是将MySQL当做事务型内存KV在和Memcached对比。
如果允许MySQL侧降低事务的要求,荣仍数据的丢失,那么我们还可以对MySQL Memcached Plugin做如下的配置:
daemon_memcached_enable_binlog = OFF
skip_log_bin = 1
innodb_flush_log_at_trx_commit = 0
loose_daemon_memcached_r_batch_size = 10
loose_daemon_memcached_w_batch_size = 10
transaction_isolation = READ-UNCOMMITTED
上面的配置中关闭了二进制日志的写入,然后将重做日志的刷新设置为每秒1次。
接着就是比较
魔幻
的几个参数。首先,在KV层设置为读写发生10次才提交一次,进一步降低刷盘频率。由于每10次写入才提交一次,因此需要将事物隔离级别设置为READ-UNCOMMITTED,这样才能读取到未提交的数据!
最后,我们还能继续降低写的频率,即通过下面的命令关闭InnoDB层的redo日志写入:
mysql > ALTER INSTANCE disable InnoDB redo_log;
这样在SET的过程中,没有任何二进制日志和重做日志的写入,进一步提升了MySQL Memcached Plugin在Set下的性能表现,最终SET的测试结果如下所示:
Memcached Plugin+就是启用“黑科技”后的MySQL性能,可以看到SET下性能得到了大幅提升,32、64线程极限值可达到48万+的QPS。
当然,取得上述性能的表现是因为我们牺牲了数据安全性!!!
1. 目前还是有脏页刷新磁盘的问题,如何不修改内核将MySQL打造一个纯内存KV数据库?
2. 如何修改InnoDB层内核代码,将MySQL打造成段页式全内存数据库。其性能又能达到多少?
可以看到,即便开启事务安全的配置,将MySQL打造成KV的性能是完全不输原生Memcached的,在写场景和混合读写场景都能比原生Memcached更好的表现。
Memcached的优势在于他需要的资源更少,但他的缺点是他只能做KV操作。而将InnoDB表映射为KV访问,则不但能提升MySQL数据库的性能,也能利用MySQL的事务特性、复制功能、SQL查询等功能,而这是传统KV数据库所不具备的能力。
BTW,你们的线上内存KV性能多少?一般也就5-10W QPS吧,所以,真的需要Memcached么?
希望各位粉丝看完后点击右下角的“在看”,以示鼓励。长期坚持原创很不容易,多次想放弃。坚持是一种信仰,专注是一种态度,一路陪伴,一起星辰大海。
IMG群是码农的交流社区,IMG微信群交流内容包括但不限于技术、经济、军事、八卦等话题。欢迎有态度的码农们加入IMG大家庭。
IMG目前有少林群、武当群、峨眉群、华山群、M悦会(高端VIP群)。
仅限码农入群,猎头或其他行业勿加,入群请加姜老师个人微信 82946772,并备注:码农入IMG群
-----------------------
视频号:破产码农
抖音号:破产码农
B站号:姜老师带你飞
长按下图二维码关注,将感受到一个有趣的灵魂,每篇文章都会有新惊喜。
以上是关于刚刚,MySQL 战胜了老大哥 Memcached!的主要内容,如果未能解决你的问题,请参考以下文章
小白谈memcache和memcached的区别
让memcached和mysql更好的工作
uestc 1073 秋实大哥与线段树 Label:线段树
UESTC 1073 秋实大哥与线段树 (线段树)
与 Redis 相比,memcached 是恐龙吗? [关闭]
Redis与Memcached的区别