MySQL|ES能为你解决什么问题,又会带来什么问题?
【MySQL|ES能为你解决什么问题,又会带来什么问题?】
业务需求痛点
- 业务增长 , 查询条件越来越多 , 索引越来越多业务发展初期 , 数据量不多 。 查询 , 写入都很快 。 随着业务的发展 , 数据量增大 , 出现慢查询 , 开始往表里不断的加索引 , 保证数据查询效率 。 但是当数据量继续增大 , 业务查询越来越复杂 。 程序员天天想着这个表怎么加索引 。 索引的增加 , 写入数据的时间成本越来越高 。
- 表数据增加 , 数据拆分越来越复杂数据量增大 , 开始进行分表处理 。 慢慢的发现 , 尼玛 , 分的表越来越多 。 再这么下去 , 这台数据库服务器上都容不下他了 , 这是要做数据分片的操作啊 。 分表已经够费劲了 , 还要分片?
- 全文检索功能嗨 , 哥们 , 给我加个全文搜索的功能 。 简单的一句话 , 你心里十万个草尼马 。 这么多的数据量你让我搞全文搜索 。 上面业务通点总结起来就是要查的快 , 要分布式 , 要全文搜 。
ES 搜索为什么快的原因
本文插图
对于mysql中如上的数据表 , ES会对每个字段的值建立索引 , 通过索引的值去找数据 , 而且这些索引都是在内存里面的 。
name段索引:
本文插图
age字段索引
本文插图
address 字段索引
本文插图
这样 , 当我们要找上海市 , 年龄为21岁的数据就能够通过address,age索引快递定位到数据id=2的是我们需要查找的 。
然后再从磁盘中把数据id=2的数据读取出来 。
上面的其实就是ES中倒排索引的一个简化版本 。
实际上的ES的倒排序使用的是前缀作为索引 , 同时会使用FST对索引数据进行压缩 , 以保证在内存的数据量不会因为索引多而带来比较大的内存消耗 。
本文插图
对于上面的数据表 , 如果采用HashMap的方式对name字段索引的话 , 索引所占用内存20个字节 。
本文插图
但是如果转换成FST结构的话 , 可以用四个字节表示name,总共占用内存为4+4*3=16 。 (假设数据范围只有M,i,e,c) 四个字符 。
本文插图
ES 分布式数据结构设计
- 数据分片均衡分片是 Elasticsearch 在集群中分发数据的关键 。 文档存储在分片中 , 然后分片分配到集群中的节点上 。 当集群扩容或缩小 , Elasticsearch 将会自动在节点间迁移分片 , 以使集群保持平衡 。
- 数据可靠分片有主分片 , 复制分片 。 复制分片只是主分片的一个副本 , 它可以防止硬件故障导致的数据丢失 , 同时可以提供读请求 , 比如搜索或者从别的 shard 取回文档 。 每个主分片都有一个或多个副本分片 , 当主分片异常时 , 副本可以提供数据的查询等操作 。 主分片和对应的副本分片是不会在同一个节点上的。
推荐阅读
- 天极网|LCD 屏内多点指纹解决方案亮相:触控、显示、指纹识别多合一
- 苹果笔记本|如何让macbook合上时工作?解决苹果电脑合盖自动休眠问题-macw
- 魅族手机|京东买手机神券抢不停 最高为你省出一个月房租
- |真全面屏手机要来了!微软给出新解决方案:提高屏下前摄效果
- 行业互联网,云计算|虎牙联合华为云发布昇腾AI内容审核解决方案
- 苹果手机|iphone 8触屏失灵怎么办?小白如何解决
- 行业互联网|Wenco和Oxbotica合作开发采矿业的第一个开放式自主解决方案
- 行业互联网|虎牙联合华为云发布昇腾AI内容审核解决方案
- 数据库|面试官:说说MySQL数据库分库分表,并且会有哪些问题?
- 电气小助手|农业高效节水灌溉系统解决方案
