`
langzhe
  • 浏览: 286152 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

分析 mnesia 索引慢的问题,结果出乎意料.

 
阅读更多
分析 mnesia 索引慢的问题,结果出乎意料.
因为 ejabberd 设计思路对 mnesia 做缓存情有独钟。
排除 cowboy 系统本身性能问题之后决定分析代码。
前段时间对Cloud做压力测试意外发现,当测试将要结束时,从出现socket断开开始系统变得非常缓慢。甚至一个 http 请求相应也得花上1分多钟,甚至更长,这显然问题非常严重。对缓存性能之前做过测试,所以分析问题时直接跳过了。其实问题就是出现在缓存上。最终定位,当缓存数据达到5W条记录后,性能急剧下降,特别是删除数据和同样重复写入。每秒也就只能处理2k~3k 的样子。这结果令人沮丧,这样的性能怎能适合做缓存。
深深的回忆,之前测试和现在区别就是多了 index。难道 index 对性能影响如此之大。查了一下手册,手册上是这样说的:
Indices do not come free, they occupy space which is proportional to the size of the table. They also cause insertions into the table to execute slightly slower.
好吧,我相信了是索引造成的。
开始解决索引问题。差了好多资料有说慢的,可是没有找到与我一样的描述。因为我没有用 disc_copes。我全部用的 ram_copies. 群里咨询也没有看到很好的反馈,也得到了些帮助,在此感谢。
头脑中产生了两种想法。一是用 多表+transaction,二是纯碎多表+no transaction.
赶紧写代码测试,transaction 在意料之中慢的很,还抛出一些错误。no transaction 不但没有预期的快,还发写数据和删除现数据不完整。
分析了一下数据存储形式,list 过程会导致性能降低(dict数据结构从思绪中闪过)。为了解决多表no transaction数据不完整问题,把表的默认类型从 set 改为 bag.这样数据能准确的插入和删除,不会出现覆盖问题。测试没问题。速度有所降低,但还能接受。数据不完整问题也解决了。想到此方法是否可以用到transaction 上面。
 
开始了 transaction+bag 测试。性能降低到同样让人绝望。想到用 transaction+bag +单表测试。结果发现 速度很快超出预期。一个个表添加依然很快。最后定为到 ws_type 表上面去了。这样一下子明白了。立刻切回 no transaction+index 去掉 type索引读写删速度都非常之快50W条数据都在毫秒内完成,第一次写总共花费 14121 ms,第二次重复写 21423 ms,删除数据 14777 ms,心情一下子晴朗了。接下来需要解决的就是 type 问题了。
无论用 index 还是 bag 类型,甚至分表K<->ValueList当 ValueList 超过2W 速度照样拖慢。这才是拖慢读写的本质。

<!--?xml version="1.0" encoding="UTF-8" standalone="no"?-->

Type 当前只有两种类型 D和C。当有5W 条数据后。index、bag、另一张表(与 index 类似)速度通通慢的不行。 
1
0
分享到:
评论

相关推荐

    Mnesia用户手册 4.4.10版.rar

    Mnesia是一个分布式数据库管理系统(DBMS),适合于电信和其它需要持续运行和具备软实时特性的Erlang应用。 目 录 1 、介绍 . . .. . .. . . .. . 4 1.1 关于 Mnesia . . .. . .. . . .. . 4 1.2 Mnesia ...

    erlang——Mnesia用户手册.pdf

    1.2.Mnesia.数据库管理系统(DBMS 2、开始.Mnesia 2.1.首次启动.Mnesia 2.2.一个示例 3、构建.Mnesia.数据库 3.1.定义模式 3.2.数据模型 3.3.启动.Mnesia 3.4.创建新表 4、事务和其他上下文存取 ...

    erlang-mnesia-19.3.6.4-1.el7.x86_64.rpm

    erlang-mnesia-19.3.6.4-1.el7.x86_64.rpm

    Mnesia User's Guide

    • Mnesia provides an introduction to Mnesia. • Getting Started introduces Mnesia with an example database. Examples are included how to start an Erlang session, specify a Mnesia database directory, ...

    Mnesia用户手册.zip

    《Mnesia用户手册》是专为理解和操作Erlang编程语言中的Mnesia数据库管理系统而编写的详尽指南。Mnesia是Erlang OTP (Open Telephony Platform) 库中的一个核心组件,它是一个强大的分布式数据库系统,特别适用于...

    Mnesia table fragmentation 过程及算法分析

    在分析 Mnesia 表分片的过程和算法之前,首先要理解分片的必要性和它所解决的问题。随着业务的发展,数据量会迅速增加,读写请求的次数也会大幅增长。为了保证服务的高可用性,系统需要能够在短时间内处理大量的读写...

    erlang-18.3-1.el7.centos.x86_64.zip

    Erlang是一种高级编程语言,特别为构建分布式、并发、实时和容错系统而设计。在标题中的"erlang-18.3-1.el7.centos.x86_64.zip",我们看到的是Erlang的一个特定版本,18.3,针对64位的CentOS 7操作系统(el7)的...

    Mnesia 用户手册中文版 pdf

    Mnesia的设计初衷是为了解决电信应用中的数据管理问题,如快速实时的键值查找、非实时的复杂查询、分布式数据管理、高容错性、动态重配置能力以及支持复杂对象的存储。 Mnesia的主要特性包括: 1. 动态重配置的...

    erlang-18.3-1.el7.centos.x86_64.rpm

    RabbitMQ安装需要的安装包

    mnesia数据库文档

    5. **模式定义**:Mnesia允许用户定义数据库模式,包括表、索引和属性等,提供了一种结构化的方式来组织和访问数据。 6. **查询语言**:Mnesia提供了自己的查询语言,允许用户执行复杂的查询和数据操作,同时也有对...

    Mnesia用户手册(docx版)

    Mnesia 是一个强大的分布式数据库管理系统(DBMS),专门为Erlang编程语言设计,特别适用于需要高可用性、持续运行和软实时特性的电信和其他关键业务应用。这个系统允许在多个节点间同步数据,提供了一种在分布式...

    mnesia_pg:Postgres后端通过mnesia_ext到Mnesia

    “mnesia_pg:Postgres后端通过mnesia_ext到Mnesia” 这个标题揭示了一个项目,它的目标是将PostgreSQL数据库作为Erlang的Mnesia分布式数据库系统的一个后端。Mnesia_ext是Mnesia的一个扩展,它允许添加自定义的数据...

    Mnesia Overview

    ### Mnesia概述与关键知识点 #### 一、Mnesia数据库管理系统简介 Mnesia是一个专为电信应用设计的分布式、容错数据库管理系统(DBMS)。它由爱立信公司的计算机科学实验室开发,旨在解决传统商用数据库管理系统...

    Api-Social-Amnesia.zip

    Api-Social-Amnesia.zip,忘记过去。社交健忘症确保你的社交媒体帐户只显示你最近的历史,而不是5年前“那个阶段”的帖子。,一个api可以被认为是多个软件设备之间通信的指导手册。例如,api可用于web应用程序之间的...

Global site tag (gtag.js) - Google Analytics