深度分页
假设电商平台的订单表存储了 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 条。
随着页码增加

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



