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

简介: 【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之后,每个目标表返回的结果都是有序的,自然可以使用归并排序。在归并排序的过程中,我们可以逐条从返回结果中读取,这意味着没必要将所有的结果一次性放到内存中再排序。在分页的场景下,取够了数据可以直接返回,剩下的数据就可以丢弃了

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

目录
相关文章
|
4月前
|
缓存 关系型数据库 MySQL
MySQL查询优化:提速查询效率的13大秘籍(合理使用索引合并、优化配置参数、使用分区优化性能、避免不必要的排序和group by操作)(下)
MySQL查询优化:提速查询效率的13大秘籍(合理使用索引合并、优化配置参数、使用分区优化性能、避免不必要的排序和group by操作)(下)
186 0
|
2月前
|
数据库 存储 中间件
|
3月前
|
关系型数据库 MySQL 数据库
MySQL索引优化:深入理解索引合并
MySQL索引优化:深入理解索引合并
|
4月前
|
存储 关系型数据库 MySQL
mysql索引优化,更好的创建和使用索引
mysql索引优化,更好的创建和使用索引
|
4月前
|
SQL 存储 关系型数据库
MySQL索引的使用,大大提升你代码的效率
MySQL索引的使用,大大提升你代码的效率
|
10月前
|
SQL 存储 分布式数据库
分库分表索引设计:二级索引、全局索引的最佳设计实践
对主键来说,要保证在所有分片中都唯一,它本质上就是一个全局唯一的索引。如果用大部分同学喜欢的自增作为主键,就会发现存在很大的问题。
|
SQL 存储 关系型数据库
MySQL索引优化一
MySQL索引优化一
104 0
|
SQL 算法 关系型数据库
MySQL索引优化(为排序)
MySQL索引优化(为排序)
83 0
MySQL索引优化(为排序)
|
SQL 数据可视化 关系型数据库
Mysql索引优化
Mysql索引优化
120 0
Mysql索引优化
|
存储 SQL 关系型数据库
索引到底能提升多少查询效率?何时该使用索引?一文快速搞懂数据库索引及合理使用它
索引到底能提升多少查询效率?何时该使用索引?一文快速搞懂数据库索引及合理使用它
617 0
索引到底能提升多少查询效率?何时该使用索引?一文快速搞懂数据库索引及合理使用它