海量数据查询

362 阅读2分钟

分析类系统

数据量在 GB 量级以下,MySQL 仍然是可以考虑的,因为它的查询能力足以应付大部分分析系统的业务需求。并且可以和在线业务系统合用一个数据库,不用做 ETL(数据抽取),省事儿并且实时性好。这里还是要提醒你,最好给分析系统配置单独的 MySQL 实例,避免影响线上业务。

如果数据量级已经超过 MySQL 极限,可以选择一些列式数据库,比如:HBase、Cassandra、ClickHouse,这些产品对海量数据,都有非常好的查询性能,在正确使用的前提下,10GB 量级的数据查询基本上可以做到秒级返回。高性能的代价是功能上的缩水,这些数据库对数据的组织方式都有一些限制,查询方式上也没有 MySQL 那么灵活。大多都需要你非常了解这些产品的脾气秉性,按照预定的姿势使用,才能达到预期的性能。

另外一个值得考虑的选择是 Elasticsearch(ES),由于它的数据都存储在内存中,并且也支持类似于 Map-Reduce 方式的分布式并行查询,所以对海量结构化数据的查询性能也非常好。

在这个级别的几个选手中,强烈建议你优先考虑 ES。但是 ES 有一个缺点,就是你需要给它准备大内存的服务器,硬件成本有点儿高。

数据量级超过 TB 级的时候,对这么大量级的数据做统计分析,无论使用什么存储系统,都快不到哪儿去。这个时候的性能瓶颈已经是磁盘 IO 和网络带宽了。这种情况下,实时的查询和分析肯定做不了。解决的办法都是,定期把数据聚合和计算好,然后把结果保存起来,在需要时对结果再进行二次查询。这么大量级的数据,一般都选择保存在 HDFS 中,配合 Map-Reduce、Spark、Hive 等等这些大数据生态圈产品做数据聚合和计算。

根据查询来选择存储系统

ES 采用的倒排索引的数据结构,并没有比 MySQL 的 B+ 树更快或者说是更先进,但是面对“全文搜索”这个查询需求,选择使用 ES 的倒排索引,就比使用其他的存储系统和数据结构,性能上要高出几十倍。

而对于物流规划的查询需求,查询方式是多变的,可以把数据放到 Hive 表中,按照时间进行分片。

  • ES是“可靠的”存储:同步复制
  • Redis是“不可靠的”存储:异步复制

此文章为3月Day22学习笔记,内容来源于极客时间《后端存储实战课》