最近公司计划将风控逻辑移到slave库进行计算,因为考虑到业务表数据会比较大,此时如果还是走nest-loop的话,即使unique进行连接,因为还是需要至少2次以上LIO才能读一条记录,如果达到类似hash join效果的话,在大数据量下,性能通常可以大幅度提升。

因为memory引擎支持hash索引,根据mysql官方文档所述,其基本用途就是K/V存储,内部使用map而非b-tree的实现机制,这样来看,理论上确实达到了hash join的基础。所以,特地做了测试如下:

drop table tb_act_productunitasset_his_test_mem;
create table tb_act_productunitasset_his_test_mem like tb_act_productunitasset_his_test;
delete from tb_act_productunitasset_his_test_mem;
insert into tb_act_productunitasset_his_test_mem select * from tb_act_productunitasset_his_test_mem;
commit;
select count(1) from tb_act_productunitasset_his_test_mem;

在两个表各自的init_date,company_no,unit_code,product_id上包含了非唯一索引,其中XXX_test为btree索引,XXX_test_mem为hash索引。

278432

select u.unit_code,sum(init_asset),sum(original_amt)
from tb_act_unitaccount_his u,tb_act_productunitasset_his_test_mem p
where u.init_date = p.init_date
and u.company_no = p.company_no
and u.unit_code = p.unit_code
and u.product_id = p.product_id
group by u.unit_code

select u.unit_code,sum(init_asset),sum(original_amt)
from tb_act_unitaccount_his u,tb_act_productunitasset_his_test p
where u.init_date = p.init_date
and u.company_no = p.company_no
and u.unit_code = p.unit_code
and u.product_id = p.product_id
group by u.unit_code

从delete、insert来看,memory均性能高倍,因为memory存储的时候直接计算hash值,所以比btree快,这是完全意料中的。

因为测试环境,造实际的业务逻辑比较麻烦,实际业务系统中,可以认为,hash成为unique完全是可以的,比如就算资产表、交易委托表、成交表等都是可以做到的,只不过条件可能是变量值,而不是另外一张关联表而已。

所以,只要DML控制的好同时在mysql启动的时候,通过init-file启动后执行的命令进行初始化加载,很多常用的资料表和当前业务周期表都可以镜像一份memory,在读多写少的系统上,性能提升会非常明显。

mysql memory表性能测试以及使用场景的更多相关文章

  1. MySQL内存表(MEMORY)说明 | 一个PHP程序员的备忘录

    MySQL内存表(MEMORY)说明 | 一个PHP程序员的备忘录 MySQL内存表(MEMORY)说明

  2. mysql分表场景分析与简单分表操作

    为什么要分表 首先要知道什么情况下,才需要分表个人觉得单表记录条数达到百万到千万级别时就要使用分表了,分表的目的就在于此,减小数据库的负担,缩短查询时间. 表分割有两种方式: 1水平分割:根据一列或多 ...

  3. 详解MySQL大表优化方案( 转)

    当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑.部署.运维的各种复杂度,一般以整型 ...

  4. MySQL 大表优化方案探讨

    当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑.部署.运维的各种复杂度,一般以整型 ...

  5. MySQL大表优化方案

    转:https://segmentfault.com/a/1190000006158186?hmsr=toutiao.io&utm_medium=toutiao.io&utm_sour ...

  6. MySQL 大表优化方案

    当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑.部署.运维的各种复杂度,一般以整型 ...

  7. 优秀后端架构师必会知识:史上最全MySQL大表优化方案总结

    本文原作者“ manong”,原创发表于segmentfault,原文链接:segmentfault.com/a/1190000006158186 1.引言   MySQL作为开源技术的代表作之一,是 ...

  8. MySQL 大表优化方案(长文)

    当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除非单表数据未来会一直不断上涨,否则不要一开始就考虑拆分,拆分会带来逻辑.部署.运维的各种复杂度,一般以整型 ...

  9. MySQL大表优化方案 Mysql的row_format(fixed与dynamic)

    转自:https://mp.weixin.qq.com/s/VY69wWlrVLjRtKU7ULrYGw 当MySQL单表记录数过大时,增删改查性能都会急剧下降,可以参考以下步骤来优化: 单表优化 除 ...

随机推荐

  1. android target unknown and state offline解决办法

    没有错,将adb的版本升级一下就好了! 下载地址为:http://files.cnblogs.com/files/hujunzheng/adb1.0.32.zip

  2. Spark入门实战系列--1.Spark及其生态圈简介

    [注]该系列文章以及使用到安装包/测试数据 可以在<倾情大奉送--Spark入门实战系列>获取 .简介 1.1 Spark简介 年6月进入Apache成为孵化项目,8个月后成为Apache ...

  3. 漫谈可视化Prefuse(三)---Prefuse API数据结构阅读有感

    前篇回顾:上篇<漫谈可视化Prefuse(二)---一分钟学会Prefuse>主要通过一个Prefuse的具体实例了解了构建一个Prefuse application的具体步骤.一个Pre ...

  4. js每天进步一点点3

    JS之样式的改变

  5. No resource identifier found for attribute 'showAsAction' in package 'android'

    运行一个项目时在一个menu.xml文件item属性android:showAsAction 报错 No resource identifier found for attribute 'showAs ...

  6. jQuery对象和DOM对象的相关知识

    所谓的DOM就是Document Object Model(文档对象模型)的缩写,或许是我水平低的缘故,感觉就是HTML的标记元素嘛,所以作者画了下面的图: 像这样的元素,就是所谓的DOM对象,获取值 ...

  7. 【模式匹配】KMP算法的来龙去脉

    1. 引言 字符串匹配是极为常见的一种模式匹配.简单地说,就是判断主串\(T\)中是否出现该模式串\(P\),即\(P\)为\(T\)的子串.特别地,定义主串为\(T[0 \dots n-1]\),模 ...

  8. Struts2 源码分析——过滤器(Filter)

    章节简言 上一章笔者试着建一个Hello world的例子.是一个空白的struts2例子.明白了运行struts2至少需要用到哪一些Jar包.而这一章笔者将根据前面章节(Struts2 源码分析—— ...

  9. C#多线程技术总结(同步)

    二.串行(同步): 1.lock.Monitor--注意锁定的对象必需是引用类型(string类型除外) 示例: private static object syncObject = new obje ...

  10. Go语言接口

    接口是面向对象的必备属性之一,即便是像C语言这种面向过程的语言也可以通过指向函数的指针来实现接口.我们熟知的面向对象语言中更是少不了接口.最近闲了下来,又可以开始学习Go语言了,发现Go语言的接口吸收 ...