算法分析--对大量随机读取数据库的性能优化

it2023-01-07  69

春风如贵客,一到便繁华。各位看官先赞再看,养成好习惯(●´∀`●)

前言:

假设,有一张100W规模,并且活跃度很高的数据库表,需要从数据库中随机读取20条数据,并且对性能要求很高的要求。

本文不涉及任何传统的算法结构,仅从解决实际问题出发,代码仅作实例!!!

方案一:

使用数据库随机取20条,代码如下:

SELECT * FROM t_user u WHERE 1 = 1 ORDER BY RAND() LIMIT 20

优点:方便,逻辑简单,代码简洁,不引入新的中间件和风险,方便快速开发。

缺点:数据量大之后,存在sql优化的必要。大量请求的话,会造成数据库链接过多

方案二:

随机读取 数据库主键

使用JAVA代码,随机生成30个id,按照大小排列(随机生成30个,取前20个是比较保险的做法)

SELECT * FROM t_user u WHERE 1 = 1 AND u.user_id IN ( -- 随机的id ) LIMIT 20

优点:逻辑比较简单,代码简洁,不引入新的中间件和风险,方便快速开发。

缺点:需要提前设置好该表的主键id,避免取到空id。大量请求的话,会造成数据库链接过多

方案三:

方案二的改进,使用方案二读取200条数据,存放到redis中,每次再从redis中,获取200条数据后,随机选择20条。redis的过期时间为10分钟。(可以根据需求适当扩大redis的数据)

优点:逻辑比较简单,代码简洁,

缺点:随机数短期内是在小范围内的选择,引入新的中间件

方案四:

将100W条数据,按照10000条进行分片,预热到redis中,根据hash算法、取余、平均分配、轮流平均分配等分配原则,随机读写即可

优点:效率较高,逻辑较为清晰。

缺点:需要提前分片和预热数据。

方案五:

引入其他中间件,与此同时可能会引起新的风险!!!建议团队评估后再做实施!!!


创作不易,各位的支持和认可,就是我创作的最大动力,

【转载请联系本人】 如有问题,请联系我。欢迎斧正!不胜感激 !

求点赞👍 求关注❤️ 求分享👥 求留言📪

最新回复(0)