2016 - 2024

感恩一路有你

redis实现分页查询 mysql表数据量太大,达到了1亿多条数据,除了分库分表之外,还有没有其他的解决方式?

浏览量:2695 时间:2021-03-11 20:02:21 作者:admin

mysql表数据量太大,达到了1亿多条数据,除了分库分表之外,还有没有其他的解决方式?

在正常配置下,MySQL只能承载2000万数据(同时读写,表中有大文本字段,单服务器)。现在已经超过1亿,而且还在增加,建议按以下方式处理:

1子表。它可以按时间或一定的规则进行拆分,以便尽可能地查询子表中的数据库。这是最有效的方法。特别是写,放入一个新表,并定期同步。如果记录不断更新,最好将写入的数据放在redis中,并定期同步表3的大文本字段,将它们分隔成一个新的独立表。对于较大的文本字段,可以使用NoSQL数据库

4优化体系结构,或者优化SQL查询,避免联合表查询,尽量不要使用count(*)、in、recursion等性能消耗语句

5使用内存缓存,或者在前端读取时增加缓存数据库。重复读取时,直接从缓存中读取。

以上是一种低成本的管理方法,基本上几个服务器就可以做到,但是管理起来有点麻烦。

当然,如果总体数据量特别大,而且您不关心投资成本,可以使用集群或tidb

普通分页

普通分页用于缓存。您可以直接找到它并按页将其放入缓存,但这种缓存方法有许多缺点。

如果无法及时更新缓存,则一旦数据更改,所有以前的分页缓存都将无效。

例如,在像微博这样的场景中,微博下有排名靠前的次数。这在传统的分页中很难处理。

一个主意

最近,我想到了另一个主意。

数据缓存在redis中,ID为key;

数据ID和排序得分保存在redis的skip list中,即Zset;

查找数据时,首先从redis的skip list中提取相应的分页数据,得到ID list。

使用multi-get一次从redis获取ID列表中的所有数据。如果有缺少某个ID的数据,将从数据库中搜索并返回给用户,搜索到的数据将按ID缓存在redis中

在最后一步,您可以有一些提示:

例如,如果缺少某个ID数据,首先直接返回给用户,然后前端使用Ajax请求丢失的ID数据,然后动态刷新。

还有一些优化可能会将操作与Lua脚本合并,但是考虑到Lua脚本比较慢,您可能需要仔细测试它们。

如果您使用的是Lua脚本,则可以在一个请求中完成以下操作:

查找页面上的所有文章,返回缓存文章的ID和内容,以及不在缓存中的文章的ID列表。

其他事项:Lua支持LRU模式,类似memcached。但奇怪的是,没有人这样使用它。

也许redis已经准备好存储redis很长时间了,我不担心内存容量。

redis实现分页查询 redis千万级数据查询性能 redis分页查询java实现

版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。