索引表和ES的一点点思考 - CSDN博客

标签: | 发表时间:2018-03-01 14:57 | 作者:
出处:http://blog.csdn.net

索引表设计


在电商项目中,物理库存系统是个极其重要的系统,订单支付后,就会开始来占用物理库存。一般情况下,库存系统都是要分库的,因为主要的操作是写操作,例如占用/释放/取消等写操作。使用分库可以降低数据库写的压力。尽管写操作为主,但是读操作也是有的。比如说,库存占用的时候,得先查询是否有库存,而这个查询操作并不都会带上分库因子(用于路由到具体的某个数据库),而是一些比较宽松的查询条件,这些查询条件对应的数据可能分布在不同的数据库上。这个时候为了查询的方便,会构建一个索引表。这个索引表是 存在另外的单独的一个数据库中,不会再分库了的。

索引表的设计也分不同情况,大体可以分三种。
1、查询字段+数据库主键

把查询字段放到索引表,还需要把对应的数据库主键ID也放置进去。当查询请求到来时,根据查询条件找出对应的数据主键,再根据数据主键路由到对应的存有完整业务数据的数据分库上。这种方案呢。索引表占用空间小,可以支撑很久。但是要找出业务数据,还是需要路由到分库上。另外,如果要把索引表的数据存储到ES搜索引擎上的话,这种方式就不行了。因为索引表中没有外部系统要的业务数据。所以当时的库存系统没有使用这种索引表设计方案。

2、查询字段+数据库主键+需要展示的业务字段

这种方案呢。当请求到来的时候,直接查询索引表即可。无需根据主键路由到分库了。同时如果要结合ES的话。可以直接把索引表的数据弄到ES上即可。后续直接让ES暴露查询接口即可。目前我在唯品会参与的物理库存项目中,是使用这种方式的。但是这个方案也有个缺点。就是索引表的体积比较大,后续数据量一大的话,也是个问题。能不能优化一下呢?

3、索引表拆分

上面说到的第二种方案,索引表的膨胀可能很快,可以考虑将索引表拆分。比如说:索引表只是保存查询条件和主键,而需要展示给外部系统的数据,另外存储在单独的表上。比如叫index_detail表。这个表拥有索引表的主键。这样的话,当查询请求到来的时候,先从索引表查询到主键,再根据主键从index_detail表中查询出数据。当然这样做的话。ES的数据来源就变成多张表了,不过这是可以接受的。


如何把业务数据写入到索引表


使用MQ


一般来说,构建索引数据是使用单独一个应用来做的。比如叫data-index域。这个域会从消息队列中读取消息,用于构建索引数据。当业务数据发生变化后,生产者发送MQ消息到队列上。
这里的消息设计也分两种情况。一种是消息只是带有数据主键和操作类型(ADD/Update/DELETE),消费者拿到主键后再去DB获取完整的数据并插入到索引表中。另一种方案呢,是消息包含了大部分需要的字段,消费者拿到消息后直接把数据插入到索引表中。这两种消息设计,我在实际项目中都有用过。


直接操作DB


这种方案呢就比较粗暴,直接配置一个索引表库的数据源,当业务数据发生变化时,使用Mybatis或者JDBC把数据更新到索引表中。一般不建议这么做,一来构建索引数据的逻辑跟数据的CRUD操作融合在一起了。二来,操作其他数据库的数据,要么通过接口的方式,要么由单独的域来做。建议还是使用MQ的方式来构建索引数据。


如何把索引表数据弄到ES上


监听数据库表的数据变化


像在唯品会这边,自研了一个叫VDP的组件,使用storm job去监听索引表数据的变化,一旦有变化,就把数据同步到队列中,ES直接从队列中获取数据,并存储到ES上。
这种方案的好处是,我们无需写任何代码,数据自动可以同步到ES上。


使用MQ


如果公司内部没有开发VDP这样的组件,可以通过发送MQ消息的方式来将索引表的数据同步数据到ES上。


让ES暴露CUD接口


另外一种方案是,让ES暴露CUD接口,用于同步索引表数据。但是这样就跟ES耦合在一块了。不太推荐这么做。


进一步的思考


1、ES不支持Group By这样的操作,所以在构建索引表的时候,可以事先计算好Group By的一些统计数据,并存储到索引表中;
2、一些后台应用中,如果数据库表的数量已经很大,好几个亿了,并且查询的SQL还非常变态,用数据库已经无法支持了,那么可以使用ES,查询速度快,也支持一些统计操作;
3、使用ES输出数据时,也有个坑。经常会拿到脏数据的。例如当数据发送变化后,构建索引数据并把索引数据同步到ES上是需要时间的,但是我们后台通常有将数据下架的操作,下架的操作操作完后,再次点击查询按钮,可能还是看到脏数据,因为数据同步到ES上没那么快。现在我还没想到很好的办法来解决这个问题。欢迎网友提些建议。

相关 [索引 es 思考] 推荐:

索引表和ES的一点点思考 - CSDN博客

- -
在电商项目中,物理库存系统是个极其重要的系统,订单支付后,就会开始来占用物理库存. 一般情况下,库存系统都是要分库的,因为主要的操作是写操作,例如占用/释放/取消等写操作. 使用分库可以降低数据库写的压力. 尽管写操作为主,但是读操作也是有的. 比如说,库存占用的时候,得先查询是否有库存,而这个查询操作并不都会带上分库因子(用于路由到具体的某个数据库),而是一些比较宽松的查询条件,这些查询条件对应的数据可能分布在不同的数据库上.

ES优化总结

- - 非技术 - ITeye博客
最近一直在研究ES集群,也看了很多篇前辈们总结的博客,同事借鉴了官方给出的一些建议,做了一下几点总结,希望对后来者有用:. 为了防止ES进程的内存被置换到磁盘上(会导致在检索的时候发生内存交换导致检索速度迟缓)引起性能急速下降. 候可以把config/elasticsearch.yml中的bootstrap.mlockall设置为true就可以了.

es的连接查询

- - 行业应用 - ITeye博客
在一般的关系型数据库中,都支持连接操作. 在ES这种分布式方案中进行连接操作,代价是十分昂贵的. 不过ES也提供了相类似的操作,支持水平任意扩展,实现连接的效果. 其他内容, 参考Elasticsearch官方指南整理. 在ES中支持两种连接方式:嵌套查询 和 has_child、has_parent父子查询.

ES性能优化总结

- - 互联网 - ITeye博客
    Elasticsearch是目前大数据领域最热门的技术栈之一,经过近8年的发展,已从0.0.X版升级至6.X版本,虽然增加了很多的特性和功能,但是在主体架构上,还是没有太多的变化. 下面就把我对于ES使用实践的一些经验总结一下,供大家参考;也请大家拍砖. 如果有条件,尽可能使用SSD硬盘, 不错的CPU.

MySQL InnoDB 與 PostgreSQL 的 Partial Index(es) 是不一樣的東西…

- - Gea-Suan Lin's BLOG
MySQL InnoDB 指的 Partial Index 是:. An index that represents only part of a column value, typically the first N characters (the prefix) of a long VARCHAR value..

终极思考

- wei - 牛博国际
我的海淀剧院演讲门票放出后,八小时卖了四百多张,同事们说,日. 我淡淡地说,别这样,也许正是因为便宜才这么好卖嘛. 一转身我马上就打电话给老婆,操. 早知道就他妈把票价定高一点啦,真倒霉......干. 很大程度上,这可以解释两件事:1.为什么已婚事业男性的健康状况会相对好一些. 2.为什么在社会上受到尊重和认可的事业男性在老婆的眼里都是傻逼.

SQL Server--索引

- - CSDN博客推荐文章
         1,概念:  数据库索引是对数据表中一个或多个列的值进行排序的结构,就像一本书的目录一样,索引提供了在行中快速查询特定行的能力..             2.1优点:  1,大大加快搜索数据的速度,这是引入索引的主要原因..                             2,创建唯一性索引,保证数据库表中每一行数据的唯一性..

MongoDB 索引

- - 博客园_首页
索引是用来加快查询的,数据库索引与数据的索引类似,有了索引就不需要翻遍整本书,数据库可以直接在索引中查找,. 使得查询速度很快,在索引中找到条目后,就可以直接跳转到目标文档的位置.. 要掌握如何为查询配置最佳索引会有些难度.. MongoDB索引几乎和关系型数据库的索引一样.绝大数优化关系型数据库索引的技巧同样适用于MongoDB..

倒排索引

- - ITeye博客
倒排索引是文档检索系统中最常见的数据结构,被广泛的应用于搜索引擎. 它是一种根据内容查找文档的方式. 由于不是根据文档来找内容,而是根据进行了相反的操作,因此叫做倒排索引. 倒排索引的一个简单结构如下图所示:. 最常见的是使用词频作为权重,即单词在一个文档中出现的次数. 因此,当搜索条件为“MapReduce”“is”“simple”的时候,对应的集合为{(0.txt,1),(1.txt,1),(2.txt,2)}且{(0.txt,1),(1.txt,2)}且{(0.txt,1),(1.txt,1)}={0.txt,1.txt}.

索引原理

- - ITeye博客
索引是存储引擎用于快速找到记录的一种数据结构. 也就会说索引也是一种数据结构,也占用磁盘空间. 索引是对查询优化最有效的手段,可以将查询提升几个数量级,相当牛掰啊. 1)索引大大减少了服务器需要扫描的数据量. 2)索引可以帮助服务器避免排序和临时表. 3)索引可以将随机IO变为顺序IO. 数据库索引可以想象成一本书的目录,如果想在一本书中找到某个主题,那么先到书的目录中找到这个主题,然后根据目录提供的页码,找到要找的主题.