ElasticSearch 索引设计的一个案例

同的一份数据,如下,我们可以设计两种存储方式:

方式一:

在es中存储为一个索引
{
    "skuId": 1,
    "spuId": 11,
    "skuTitle": "华为xxx手机",
    "price": 888, 
    "saleCount": 99,
    "attrs": [
        {"size": "5英寸"},
        {"cpu": "高通945"},
    ]
}

方式二:

在es中存储为两个索引
{
    "skuId": "1",
    "spuId": "11",
    "skuTitle": "华为xxx手机",
    "price": 888, 
    "saleCount": 99,
}

{
    "spuId": 11,
    "attrs": [
        {"size": "5英寸"},
        {"cpu": "高通945"},
    ]
}

分析方式一存储和方式二存储的优劣:

方式一,当有1000万数据的时候,假如每条数据 attr 字段,占1kb空间。那么总共会占用 1000万 * 1KB = 10GB。冗余存储需要多占用10GB的内存空间。

方式二存储比方式一节省10GB的存储空间。但是想象一个场景。我们搜索skuTitle字段中包含“手机”的记录。假如搜索出1000万数据,而这1000万数据中,假如有2000不同的spu,首先需要网络传输这2000个不同的spu去关联 attrs索引。若只传输这2000个spu,若spu以long存储,那么一次网络请求,传输2000spu需要多传输 2000 * 8byte = 16kb数据。如现在系统有10000并发,那么需要同时网络多传输的数据是 16kb * 10000 = 160MB数据,而网络传输数据是与网络并发数呈线性关系的。

方式一是一种以空间换时间的方式,虽然数据有冗余,但是响应时间会根块。而方式二节省了空间,但是响应时间会更慢一些。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值