千万级数据量如何快速分页 MySQL深度分页

MySQL深度分页(千万级数据量如何快速分页),博智网带你了解详细信息 。
目录

  • 前言
  • 案例
  • 优化
  • 小结

前言后端开发中为了防止一次性加载太多数据导致内存、磁盘IO都开销过大,经常需要分页展示,这个时候就需要用到MySQL的LIMIT关键字 。但你以为LIMIT分页就万事大吉了么,Too young,too simple啊,LIMIT在数据量大的时候极可能造成的一个问题就是深度分页 。
案例这里我以显示电商订单详情为背景举个例子,新建表如下:
CREATE TABLE `cps_user_order_detail` (`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',`user_id` varchar(32) NOT NULL DEFAULT '' COMMENT '用户ID',`order_id` bigint(20) DEFAULT NULL COMMENT '订单id',`sku_id` bigint(20) unsigned NOT NULL COMMENT '商品ID',`order_time` datetime DEFAULT NULL COMMENT '下单时间,格式yyyy-MM-dd HH:mm:ss',PRIMARY KEY (`id`),KEY `idx_time_user` (`order_time`,`user_id`) USING BTREE) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='用户订单详情';
然后手动向表里插入120W条数据 。
现在有个需求:分页展示用户的订单详情,按照下单时间倒序 。
表结构精简了,需求也简单 。于是哗哗哗的写完代码,提测上线了 。早期运行一切正常,可随着订单量的不断增大,发现系统越发的缓慢,还时不时报出几个慢查询
这个时候你就该想到是LIMIT偏移的问题了,没错,不是你的SQL不够优美,就是MySQL自身的机制 。
这里我就简单以两条SQL为例,如下图,分别是从100和100W的位置偏移分页,可以看到时间相差很大 。这还不算其它数据运算和处理的时间,单一条SQL的查询就耗时一秒以上,在对用户提供的功能里这是不能容忍的(电商里经常要求一个接口的RT不超过200ms) 。
千万级数据量如何快速分页 MySQL深度分页


千万级数据量如何快速分页 MySQL深度分页


千万级数据量如何快速分页 MySQL深度分页


千万级数据量如何快速分页 MySQL深度分页


二是通过Elastic Search搜索引擎优化(基于倒排索引),实际上类似于淘宝这样的电商基本上都是把所有商品放进ES搜索引擎里的(那么海量的数据,放进MySQL是不可能的,放进Redis也不现实) 。但即使用了ES搜索引擎,也还是有可能发生深度分页的问题的,这时怎么办呢?答案是通过游标scroll 。关于此点这里不做深入,感兴趣的可以做研究 。
小结写这篇博客是因为前段时间在开发中真实经历到了,并且之前在字节面试中确实也和面试官探讨了一番 。知道LIMIT的限制以及优化,在面试中能提到是加分项,不能说到MySQL优化就是建索引,调整SQL(实际上在真实开发中这两种优化方案的成效微乎其微) 。毕竟MySQL优化那么牛X的话,就不会有那么多中间件产生了 。
【千万级数据量如何快速分页 MySQL深度分页】到此这篇关于MySQL深度分页(千万级数据量如何快速分页)的文章就介绍到这了,更多相关MySQL 深度分页内容请搜索趣讯吧以前的文章或继续浏览下面的相关文章希望大家以后多多支持趣讯吧!

    推荐阅读