小视频源码,Mysql深度分页为何越往后越让人抓狂
小视频源码,Mysql深度分页为何越往后越让人抓狂
假设电商平台的订单表存储了 2000 万条记录,表结构如下,主键是 id,(user_id + create_time )联合索引。
REATE TABLE `orders` ( `id` int NOT NULL AUTO_INCREMENT, -- id自增 `user_id` int DEFAULT NULL, `amount` decimal(10,2) DEFAULT NULL, `create_time` datetime DEFAULT CURRENT_TIMESTAMP, -- 创建时间默认为当前时间 PRIMARY KEY (`id`), KEY `idx_userid_create_time` (`user_id`, `create_time`) -- 创建时间设置为普通索引 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
我们的分页语句一般这么写。
SELECT * FROM orders WhERE user_id = 'Chaya' ORDER BY create_time DESC LIMIT 0, 20;
当用户查询第 1000 页的订单(每页 20 条),常见的分页写法如下。
SELECT * FROM orders WhERE user_id = 'Chaya' ORDER BY create_time DESC LIMIT 19980, 20;
执行流程解析:
使用联合索引 idx_userid_create_time读取 19980 + 20 条数据。
利用索引在内存中排序。
丢弃 19880 条数据,返回剩下的 20 条。
随着页码增加,需要处理的数据量会线性增长。当 offset 达到 10w 时,查询耗时会显著增加,达到 100w 时,甚至需要数秒。
以上就是小视频源码,Mysql深度分页为何越往后越让人抓狂, 更多内容欢迎关注之后的文章