MySQL深分页是怎么去解决的?

数据构造

CREATE TABLE `t_member` (
  `id` int NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `sex` int DEFAULT NULL,
  `password` varchar(255) DEFAULT NULL,
  `create_time` datetime DEFAULT NULL,
  `token` varchar(255) DEFAULT NULL,
  `del_flag` int DEFAULT '0',
  PRIMARY KEY (`id`),
  KEY `index_name` (`name`) USING BTREE COMMENT '普通索引'
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

--- 定义存储过程
 
DELIMITER $
DROP PROCEDURE IF EXISTS `autoinsert`$
CREATE PROCEDURE `autoinsert`(IN insertCount INT)
BEGIN
  DECLARE count INT DEFAULT 0;
   WHILE(count < insertCount)
    DO
        INSERT INTO `t_member`( `name`, `sex`, `password`, `create_time`, `token`) 
select substring(MD5(RAND()),1,8),0,substring(MD5(RAND()),1,10),SYSDATE(),substring(MD5(RAND()),1,20) from dual;
        SET count = count+1;
    END WHILE;
    END$
DELIMITER;


-- 调用存储过程
call autoinsert(100000);

存储过程有点慢(可以试试java代码批量插入):

call autoinsert(1000000)

> OK

> 时间: 701.366s

使用代码插入也是要差不多,mybatisplus的批量插入(包含了构造数据)

结果现象

select * from t_member limit 10,10;

200w的数据,都是0.00几秒


select * from t_member limit 999990,10; -- 100w数据

select * from t_member limit 1999990,10; -- 200w数据

解决方案

方案1:使用子查询 & 索引

select a.*
from t_member a
join(
    select id
    from t_member order by id 
    limit 1999990,10
) b ON a.id = b.id;

200w的结果下,快了0.3s左右


方案2:where id > x & 索引

记录上次查询得到的最大id

select a.*
from t_member a
join(
    select id
    from t_member where id > 1999990 order by id 
    limit 10
) b ON a.id = b.id;

方案3:业务限制

强制指定查询条件,比如京东 web 端为例,根据关键词搜索历史订单,时间维度默认为近三个月,以年为单位允许用户手动切换,但不允许查询全量数据。


方案4:分库分表

  1. 业务复杂度:分库分表需要考虑数据的拆分和管理,这会增加业务逻辑的复杂度,包括数据的查询和更新等。
  2. 数据一致性:分库分表会导致数据被拆分存储在不同的数据库中,数据的一致性需要通过一些机制来保证,如分布式事务或者异步补偿机制等,这些机制都需要开发自己来实现。
  3. 数据库压力分散:分库分表可能会导致数据库的压力被分散到不同的数据库中,这可能会导致某些数据库的负载过高,而某些数据库的负载过低,导致资源的浪费。
  4. 数据库升级和迁移:分库分表方案可能会导致数据库的结构和数据被拆分存储在不同的数据库中,这会增加数据库的升级和迁移的复杂度。
展开阅读全文

页面更新:2024-02-01

标签:复杂度   可能会   负载   分散   索引   机制   数据库   业务   方案   数据

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top