在oracle中分页有专门的写法,虽然理论上遇到的问题和mysql是一样的,就是当分页分到后面的时候,速度应该会慢许多,由于需要查询出来前面的数据之后,再取第n页的数据。但是实际上来说oracle的性能是相对稳定的。mysql的可能就差一些,越分页到最后,稍不留神性能就会下降得超级明显,需要额外的多思考一些。
如果一页十条数据,获取第11页的常见的写法是select * from tablename order by id desc limit 100 , 110。这个写法的问题就是数据库为了获取到第11页,需要把前面十页的数据全部查询出来,如果页数很大的时候性能会有较大的影响。
- 第一个优化思路是,如果能够记录下上一页的id的话,那么sql就可以变成 select * from tablename where id > {maxid} order by id desc limit 100。这样的优点是很快,缺点是不能够跳页,列如说直接跳转到多少页的功能就不能做了,只能够一页一页地往后面翻。互联网企业可以这么做,但是许多传统的管理企业你要这么改的话,需要和业务部门费很大的口舌去说服他们。
- 第二个优化思路是多添加一层子查询的方式,尽量避免数据库不必要的回表查询。列如:select * from(select id from tablename order by id desc limit 100 )
上面的sql如果id列有索引的话,里面的子查询就都是索引查询,这样虽然依然是查了前面的一百条数据,由于不会涉及到回表,所以速度还是可以的。
如果可以的话,第一种方式是最快的;第二种方式虽然增加了复杂度,但是也有必定的提升。
© 版权声明
文章版权归作者所有,未经允许请勿转载。如内容涉嫌侵权,请在本页底部进入<联系我们>进行举报投诉!
THE END


















暂无评论内容