热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:刚刚,MySQL战胜了老大哥Memcached!

篇首语:本文由编程笔记#小编为大家整理,主要介绍了刚刚,MySQL战胜了老大哥Memcached!相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了刚刚,MySQL 战胜了老大哥 Memcached!相关的知识,希望对你有一定的参考价值。






        





破产码农






IT圈最会讲故事的网红 · 南山彭于晏

mysql毫无疑问是当前OLTP领域的霸主,最新的MySQL 8.0版本更是能够轻松跑出百万QPS。

在KV内存领域,虽然这些年Redis风头正劲,但老大哥Memcached凭借其多线程的特性,依然牢牢占据一定的市场份额。

刚刚,MySQL 战胜了老大哥 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.
刚刚,MySQL 战胜了老大哥 Memcached!










测试















业界没有好用的Memcached基准测试程序,所以,这次还是使用之前自己写的my_test测试程序,测试分为三种场景:




  • 只读:Get 请求;



  • 只写:Set 请求;



  • 读写:Get、Set请求,读写比例 5:1;



只读测试是内存KV数据库的强项,但是我们的MySQL已经跑出了220万QPS,所以MySQL能否挑战Memcached呢?最后的结果如下所示:


刚刚,MySQL 战胜了老大哥 Memcached!


可以看到Memcached非常强悍,在128个线程下可以跑到超过400万的QPS。


对比MySQL,虽然使用KV接口减少了SQL解析的开销,使用InnoDB的自适应哈希索引提升性能,但B+树的数据结构,依然无法匹敌Memcached。128线程下,MySQL的性能约280万。


只读测试让我有些郁闷,即便自适应哈希索引加持,MySQL依然无法战胜Memcached。性能差不多为Memcached只读测试的70%。


本以为接下去的测试会是一边倒的情况,没想到,只写测试,Memcached“翻车”了!!!


刚刚,MySQL 战胜了老大哥 Memcached!


可以看到 Memcached 在Set只写测试中,8线程能够跑出35万的QPS,但是随着线程的增加,性能不断下降。反复测试,结果依然如此。


对比MySQL,在32线程下可以取得18万的Set结果。要知道这时,MySQL有事务的保障,需要有额外的开销。


这一轮,虽然Memcached的极限性能值更高,但是MySQL的表现更为平稳,并且有事务保障,数据不会丢失。这一轮,MySQL胜。



最后,我们来看看混合读写测试场景,大多KV数据库用于读多写少的场景,这里我们测试选择读写比例5:1,读取比例超过80%。最后的测试结果为:


刚刚,MySQL 战胜了老大哥 Memcached!


测试结果与只写测试类似,在低并发下,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的测试结果如下所示:



刚刚,MySQL 战胜了老大哥 Memcached!


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么?



仔细想想,是不是都是错误的架构!!!


科学尚未普及。



希望各位粉丝看完后点击右下角的“在看”,以示鼓励。长期坚持原创很不容易,多次想放弃。坚持是一种信仰,专注是一种态度,一路陪伴,一起星辰大海。













直播













刚刚,MySQL 战胜了老大哥 Memcached!



本周五21:00,抖音直播,欢迎关注抖音号













IMG群是码农的交流社区,IMG微信群交流内容包括但不限于技术、经济、军事、八卦等话题。欢迎有态度的码农们加入IMG大家庭。

IMG目前有少林群、武当群、峨眉群、华山群、M悦会(高端VIP群)

仅限码农入群,猎头或其他行业勿加,入群请加姜老师个人微信 82946772,并备注:码农入IMG群

-----------------------

视频号:破产码农

抖音号:破产码农

B站号:姜老师带你飞

长按下图二维码关注,将感受到一个有趣的灵魂,每篇文章都会有新惊喜。







          




往期推荐







































推荐阅读
  • Redis:缓存与内存数据库详解
    本文介绍了数据库的基本分类,重点探讨了关系型与非关系型数据库的区别,并详细解析了Redis作为非关系型数据库的特点、工作模式、优点及持久化机制。 ... [详细]
  • 本文详细介绍了Oracle RMAN中的增量备份机制,重点解析了差异增量和累积增量备份的概念及其在不同Oracle版本中的实现。通过对比两种备份方式的特点,帮助读者选择合适的备份策略。 ... [详细]
  • 本文详细介绍了在 Windows 7 上安装和配置 PHP 5.4 的 Memcached 分布式缓存系统的方法,旨在减少数据库的频繁访问,提高应用程序的响应速度。 ... [详细]
  • 本文详细介绍了如何处理Oracle数据库中的ORA-00227错误,即控制文件中检测到损坏块的问题,并提供了具体的解决方案。 ... [详细]
  • 本文详细介绍了PHP中的几种超全局变量,包括$GLOBAL、$_SERVER、$_POST、$_GET等,并探讨了AJAX的工作原理及其优缺点。通过具体示例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 构建Python自助式数据查询系统
    在现代数据密集型环境中,业务团队频繁需要从数据库中提取特定信息。为了提高效率并减少IT部门的工作负担,本文探讨了一种利用Python语言实现的自助数据查询工具的设计与实现。 ... [详细]
  • Kubernetes 实践指南:初次体验
    本文介绍了如何通过官方提供的简易示例,快速上手 Kubernetes (K8S),并深入理解其核心概念和操作流程。 ... [详细]
  • 利用Cookie实现用户登录状态的持久化
    本文探讨了如何使用Cookie技术在Web应用中实现用户登录状态的持久化,包括Cookie的基本概念、优势及主要操作方法,并通过一个简单的Java Web项目示例展示了具体实现过程。 ... [详细]
  • 本文探讨了Android系统中联系人数据库的设计,特别是AbstractContactsProvider类的作用与实现。文章提供了对源代码的详细分析,并解释了该类如何支持跨数据库操作及事务处理。源代码可从官方Android网站下载。 ... [详细]
  • 本文详细介绍了在MyBatis框架中如何通过#和$两种方式来传递SQL查询参数。使用#方式可以提高执行效率,而使用$则有助于在复杂SQL语句中更好地查看日志。此外,文章还探讨了不同场景下的参数传递方法,包括实体对象、基本数据类型以及混合参数的使用。 ... [详细]
  • 本文深入探讨了MySQL中的高级特性,包括索引机制、锁的使用及管理、以及如何利用慢查询日志优化性能。适合有一定MySQL基础的读者进一步提升技能。 ... [详细]
  • Java连接MySQL数据库的方法及测试示例
    本文详细介绍了如何安装MySQL数据库,并通过Java编程语言实现与MySQL数据库的连接,包括环境搭建、数据库创建以及简单的查询操作。 ... [详细]
  • 本文深入探讨了领域驱动设计(DDD)中的聚合概念及其在事件溯源架构中的应用。聚合是一组紧密相关的类,这些类作为一个整体运作,形成一个有明确边界的组织。只有通过聚合根才能与聚合内的对象进行交互。 ... [详细]
  • ED Tree HDU4812 点分治+逆元
    这道题非常巧妙!!!我们进行点分治的时候,算出当前子节点的所有子树中的节点,到当前节点节点的儿子节点的距离,如下图意思就是当前节点的红色节点,我们要求出红色节点的儿子节点绿色节点, ... [详细]
  • 本文介绍了基于Java的在线办公工作流系统的毕业设计方案,涵盖了MyBatis框架的应用、源代码分析、调试与部署流程、数据库设计以及相关论文撰写指导。 ... [详细]
author-avatar
kerra璐56_609
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有