前言
最近笔者在工作中遇上一个测试人员通过压力测试反馈的问题。这个问题就是测试人员一下子制造了上千万的数据,造成某个MysqL/oracle数据库表产生了500万以上的数据,造成分页查询offset过大的问题。即使查询条件加了索引以及采用懒加载策略,查询速率也还没提升。这里,笔者考虑了几种处理办法:oracle分区、分库分表、nosql法。下面对这几个方法进行表述。
oracle分区法
笔者在以前的公司工作时,遇上了告警数据量过多,超过1千万了,造成分页数据量过慢。当时存储告警的数据是在oracle里面,故数据库管理员采用了分区法,并且加入了定时清除1个月前数据和自动确认历史数据机制来处理。oracle分区法只是按照某个策略对库表进行分区,对于某个策略数量较小的性能是好的,一旦该分区数据量大了,也是治标不治本的。同时分区也是oracle特有的功能,不能兼容MysqL。
分库分表法
分库分表与上一个方法很相似,只不过是把表名加入了策略标记,通过分库分表中间件改写对应的sql的库表。和上一个方法一样,一旦一个字表数据量大了,也还是出现慢查询的问题,治标不治本。
nosql法
前面的oracle分区和分库分表法都不能从根本上解决这个超过500万条数据,只是延缓了这个超大量数据查询慢的问题。这里笔者搜索有关淘宝等有类似问题的公司,发现他们用了nosql法来进行处理的。几种nosql能够处理这个500万以上的数据的有Hbase、ElasticSearch、MongoDB、redis这4种。下表是对他们的简单比较。
如果对数据的读写要求极高,并且你的数据规模不大,也不需要长期存储,选 redis;
如果数据规模较大,对数据的读性能要求很高,数据表的结构需要经常变,有时还需要做一些聚合查询,选 MongoDB;
如果需要构造一个搜索引擎或者你想搞一个看着高大上的数据可视化平台,并且数据有一定的分析价值,选 ElasticSearch;
如果需要存储海量数据,并且不知道数据规模将来会增长多么大,那么选 HBase。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。