分库分表 全局排序问题 优化:归并排序

简介: 【7月更文挑战第13天】

分库分表中间件一般采用的就是全局排序法。假如说我们要查询的是LIMIT X OFFSET y,那么分库分表中间件会把查询改写为LIMIT x+y OFFSET 0,然后把查询请求发送给所有的目标表。在拿到所有的返回值后,在内存中排序,然后根据排序结果找出全局符合条件的目标数据。

接下来可以先从性能问题上刷一个亮点,抓住受影响的三个方面:网络、内存和CPU

这个解决方案的最大问题就是性能不好。
首先是网络传输瓶颈,比如在LIMIT 10 OFFSET 1000这种场景下,如果没有分库分表,只需要传输10条数据;在分库分表的情况下,如果命中了N个表,那么需要传输的是(1000+10)N条数据。而实际上最终我们只会用其中的10条数据,存在巨大的浪费。
其次是内存瓶颈。收到那么多数据之后,中间件需要维持在内存中排序。
CPU也会成为瓶颈,因为排序本身是一个CPU密集的操作。所以在Proxy形态的分库分表中间件里,分页查询一多,就容易把中间件的内存耗尽,引发OOM,又或是CPU 100%。
不过可以通过*归并排序
来缓解这些问题。

关键在拿到数据之后,使用归并排序的算法。

在分库分表里,可以使用归并排序算法来给返回的结果排序,也就是说在改写为LIMIT x+y OFFSET 0之后,每个目标表返回的结果都是有序的,自然可以使用归并排序。在归并排序的过程中,我们可以逐条从返回结果中读取,这意味着没必要将所有的结果一次性放到内存中再排序。在分页的场景下,取够了数据可以直接返回,剩下的数据就可以丢弃了

前面说了全局查询这个方案的性能很差,那么有没有其他方案呢?
的确有,比如平均分页、禁用跨页查询、换用其他中间件等。不过任何方案都不是十全十美的,这些方案也存在一些难点,有的是需要业务折中,有的处理过程非常复杂。我们先来看第一个需要业务折中的平均分页方案

目录
相关文章
|
3月前
|
存储 中间件 数据库连接
|
16天前
|
存储 数据采集 监控
如何解决取模算法中数据倾斜的问题?
【10月更文挑战第25天】在实际应用中,需要根据具体的数据特点、系统架构和业务需求,选择合适的方法或方法组合来优化取模算法的数据分片效果。
|
5月前
|
关系型数据库 MySQL 数据库
MySQL索引优化:深入理解索引合并
MySQL索引优化:深入理解索引合并
|
4月前
|
人工智能 分布式计算 数据处理
数据倾斜问题之数据倾斜的定义如何解决
数据倾斜问题之数据倾斜的定义如何解决
74 0
|
4月前
|
数据库 存储 中间件
|
SQL 存储 分布式数据库
分库分表索引设计:二级索引、全局索引的最佳设计实践
对主键来说,要保证在所有分片中都唯一,它本质上就是一个全局唯一的索引。如果用大部分同学喜欢的自增作为主键,就会发现存在很大的问题。
|
存储 缓存 NoSQL
分库分表有哪些思路和技巧?(建议收藏)
分库分表有哪些思路和技巧?(建议收藏)
315 0
分库分表有哪些思路和技巧?(建议收藏)
|
SQL 算法 关系型数据库
MySQL索引优化(为排序)
MySQL索引优化(为排序)
89 0
MySQL索引优化(为排序)
|
存储 SQL 关系型数据库
索引到底能提升多少查询效率?何时该使用索引?一文快速搞懂数据库索引及合理使用它
索引到底能提升多少查询效率?何时该使用索引?一文快速搞懂数据库索引及合理使用它
663 0
索引到底能提升多少查询效率?何时该使用索引?一文快速搞懂数据库索引及合理使用它
|
存储 数据库 索引
数据分表分库的基本思路
当一个数据库被创建之后,随着时间的推移和业务量的增加,数据库中的表以及表中的数据量都会越来越多,就有可能会出现两种弊端: (1)数据库的存储资源是有限的,其负载能力也是有限的,数据的大量积累肯定会导致其处理数据的能力下降; (2)数据量越多,那么对数据的增删改查等操作的开销也会越来越大; 所以,当出现如上两种情况,分库分表势在必行。
121 0