背景
上文说到,由于用户表数据量过大,通过水平拆分用户表到不同的数据库实际上来提高数据库性能。本文将分析如何解决不同数据库实例上的数据分页解决方案。
现假设有N个数据库实例,按照时间time排序,查询偏移量为X,查询数据量为Y。
全局视野法
全局视野法是通过将每一个数据库实例上的分页数据查询到内存中,然后在服务层进行内存排序,得到分页数据。主要步骤如下:
将分页语句orderbytimeoffsetXlimitY,改写成orderbytimeoffset0limitX+Y。服务层对得到的N*(X+Y)条数据进行内存排序,内存排序后再取偏移量X后的Y条记录。此种方式能够精确返回所需数据,但是方法随着翻页的进行数据的传输量和排序的数据量不会随着不断翻页而导致性能下降,返回的数据量越来越大,性能越来越低。
翻页查询法
翻页查询法是通过折中业务需求,砍掉跳页查询的需求,只查询下一页数据。主要步骤如下:
用正常的方法取得第一页数据,并得到第一页记录的time_max。每次翻页,将分页语句orderbytimeoffsetXlimitY,改写成orderbytimewheretimetime_maxlimitY。数据合并,内存排序,取第一页数据。此种方式的数据的传输量和排序的数据量不会随着不断翻页而导致性能下降,但是可以保证每次只返回一页数据,性能为常量。
模糊查询法
模糊查询法是以业务上可以接受一定的数据偏差,允许数据精度损失为前提。具体步骤如下:
将分页语句orderbytimeoffsetXlimitY,改写成orderbytimeoffsetX/NlimitY/N。数据合并,内存排序。二次查询法
二次查询法是通过两次查询数据库的方式得到分页数据的方法。具体步骤如下:
将分页语句orderbytimeoffsetXlimitY,改写成orderbytimeoffsetX/NlimitY。合并数据,内存排序,找到最小值time_min。between二次查询,orderbytimebetweentime_minandtime_i_max。设置虚拟time_min,找到time_min在各个分库的offset,从而得到time_min在全局的offset。得到了time_min在全局的offset,自然得到了全局的offsetXlimitY。二次查询法能够精确地返回业务所需数据,每次返回的数据量都非常小,不会随着翻页增加数据的返回量,但是每次都需要两次查询,对性能有一定的影响。
总结
实际跨库分页查询方案的选择应该根据实际业务来选择,是侧重于性能,还是侧重于功能,作一定的取舍。
大数据量高并发数据库优化总结
数据库优化-数据表水平拆分
从Spring框架中学习设计模式
JAVA面试题:你在项目中使用多线程的场景?
聚合支付系统架构设计和