MySQLES能为你解决什么问题,又会带来什么问题?


业务需求痛点

  • 业务增长 , 查询条件越来越多 , 索引越来越多业务发展初期 , 数据量不多 。 查询 , 写入都很快 。 随着业务的发展 , 数据量增大 , 出现慢查询 , 开始往表里不断的加索引 , 保证数据查询效率 。 但是当数据量继续增大 , 业务查询越来越复杂 。 程序员天天想着这个表怎么加索引 。 索引的增加 , 写入数据的时间成本越来越高 。
  • 表数据增加 , 数据拆分越来越复杂数据量增大 , 开始进行分表处理 。 慢慢的发现 , 尼玛 , 分的表越来越多 。 再这么下去 , 这台数据库服务器上都容不下他了 , 这是要做数据分片的操作啊 。 分表已经够费劲了 , 还要分片?
  • 全文检索功能嗨 , 哥们 , 给我加个全文搜索的功能 。 简单的一句话 , 你心里十万个草尼马 。 这么多的数据量你让我搞全文搜索 。 上面业务通点总结起来就是要查的快 , 要分布式 , 要全文搜 。
ES 能解决什么问题 S主要运用于全文搜索、数据分析 ,底层使用开源库Lucene , 拥有丰富的REST API 。 内部分布式的数据存储、倒排索引等设计 , 使其可以快速存储、搜索、分析海量数据 。 典型的使用方和应用场景 , 如github,StackOverflow , elasticsearch+logstash+kibana 一体化的日志分析 。
ES 搜索为什么快的原因
MySQLES能为你解决什么问题,又会带来什么问题?
本文插图
对于mysql中如上的数据表 , ES会对每个字段的值建立索引 , 通过索引的值去找数据 , 而且这些索引都是在内存里面的 。
name段索引:
MySQLES能为你解决什么问题,又会带来什么问题?
本文插图
age字段索引
MySQLES能为你解决什么问题,又会带来什么问题?
本文插图
address 字段索引
MySQLES能为你解决什么问题,又会带来什么问题?
本文插图
这样 , 当我们要找上海市 , 年龄为21岁的数据就能够通过address,age索引快递定位到数据id=2的是我们需要查找的 。
然后再从磁盘中把数据id=2的数据读取出来 。
上面的其实就是ES中倒排索引的一个简化版本 。
实际上的ES的倒排序使用的是前缀作为索引 , 同时会使用FST对索引数据进行压缩 , 以保证在内存的数据量不会因为索引多而带来比较大的内存消耗 。

MySQLES能为你解决什么问题,又会带来什么问题?
本文插图
对于上面的数据表 , 如果采用HashMap的方式对name字段索引的话 , 索引所占用内存20个字节 。
MySQLES能为你解决什么问题,又会带来什么问题?
本文插图
但是如果转换成FST结构的话 , 可以用四个字节表示name,总共占用内存为4+4*3=16 。 (假设数据范围只有M,i,e,c) 四个字符 。
MySQLES能为你解决什么问题,又会带来什么问题?
本文插图
ES 分布式数据结构设计