# 深度分页案例学习总结 (B)

+ 页面中缓存第一行和最后一行的排序列值和自增主键 **id** 字段的值
+ 在类似 **ename** 排序字段上，我们需要建立索引，提高排序性能
+ (下一页按钮逻辑)

```
SELECT * 
FROM emp 
WHERE ename >= 'Frank' AND (ename > 'Frank' OR id > 18) 
ORDER BY ename, id LIMIT 10;
```

![right](./student-guide/diagram/01-27-1.png)

------------------------------------------------------------

这个时候我们必须加入自增主键id列作为附加条件来处理第1页和第2页之间的重复行问题，对于第1页，我们可以这样写“下一页”按钮的逻辑：

```
SELECT * 
FROM emp 
WHERE ename >= 'Frank' AND (ename > 'Frank' OR id > 18) 
ORDER BY ename, id LIMIT 10;
```

对于第2页，我们可以这样写“上一页”按钮的逻辑：

```
SELECT * 
FROM emp 
WHERE ename >= 'Frank' AND (ename > 'Frank' OR id > 18) 
ORDER BY ename, id LIMIT 10;
```

结论是我们只要在页面中记住第一行和最后一行的排序列值和自增主键id列值，就可以避免LIMIT M OFFSET N(LIMIT N,M)带来的性能衰减了。这里还要记住一点就是在ename这种排序列上，我们需要建立索引，提高排序性能。

```
ALTER TABLE emp ADD KEY idx_ename(ename);
```