MySQL 大表分页优化

有这样一张表 t_user,在 user_no 字段上建了索引,总数据量大约 1000 万。

1
2
3
4
5
6
7
8
9
CREATE TABLE `t_user` (
`user_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户 ID',
`user_no` varchar(20) NOT NULL COMMENT '用户编号',
`user_name` varchar(100) DEFAULT NULL COMMENT '用户姓名',
`user_type` varchar(2) DEFAULT NULL COMMENT '用户类型',
`user_sex` char(1) DEFAULT NULL COMMENT '性别',
PRIMARY KEY (`user_id`),
KEY `idx_user_no_2` (`user_no`)
) ENGINE=InnoDB AUTO_INCREMENT=10019904 DEFAULT CHARSET=latin1;

1614857457946

现要查 user_no 从 550 万后的 10 条记录。

一,使用普通的查询

1
select * from t_user order by user_no asc limit 5500000, 10;

耗时 41 秒

1614857653575

1614857773218

二,利用 user_no 索引的特性,先定位到 user_no 为第 550 万的位置,再根据索引位置去查找。

1
select * from t_user where user_no > (select user_no from t_user order by user_no asc limit 5500000, 1) order by user_no asc limit 10;

耗时:1.9 秒

1614859529266

1614859559006