做电子商城网站注意事项,互联网产品开发,中山网站推广词,上海网站建设优势大家好#xff0c;我是冰河~~
最近不少小伙伴在实际工作过程中#xff0c;遇到了单表大数据量分页的问题#xff0c;问我怎么优化分页查询。其实#xff0c;这就是典型的深分页问题。今天趁着周末#xff0c;给大家整理一些在深分页场景的简单处理方案。
一、普通分页查…大家好我是冰河~~
最近不少小伙伴在实际工作过程中遇到了单表大数据量分页的问题问我怎么优化分页查询。其实这就是典型的深分页问题。今天趁着周末给大家整理一些在深分页场景的简单处理方案。
一、普通分页查询存在的问题
如果数据表中的数据量非常大那么使用类似如下SQL语句分页查询数据就会导致性能低下。
select * from test limit 10000000, 1000;性能低下的原因是上述SQL会查询数据表中的10001000条数据最终舍弃前面的10000000条数据返回1000条数据。这种大数据量下查询大页码数据的现象也叫作深分页问题。
二、深分页常见优化方案
常见的深分页方案包括范围查询、子查询、延迟关联和覆盖索引。
2.1 范围查询
如果数据表中存在连续的自增ID则按照ID的范围查询可以优化一定的性能例如下面的SQL。
select * from test where id 10000000 and id 10001000 order by id asc;也可以记录上一次已经查询到的当前最大ID值查询大于此ID值的N条数据作为返回结果如下所示。
select * from test where id 10000000 limit 1000;这种方案需要ID连续递增并且不能解决跳页的问题。
PS跳页问题的场景是不连续分页从第1页直接翻到第2页以外的其他页码例如从第1页直接翻到第10页等等。
2.2 子查询
通过子查询的方式可以先查询limit 1这条数据对应的主键值随后再根据这个主键值作为查询条件查询分页数据例如下面的查询SQL。
select * from test where id (select id from test limit 10000000, 1) limit 1000;子查询的过程会产生一种新的临时表会影响到查询性能并且这种方案只能使用在ID正序的场景。
2.3 延迟关联查询
延迟关联查询的方案中会使用INNER JOIN并且包含子查询的方式查询数据。
select t1.* from test t1 INNER JOIN (select id from test limit 10000000, 1000) t2 on (t1.id t2.id);这里还可以使用逗号连接子查询。
select t1.* from test t1, (select id from test limit 10000000, 1000) t2 where t1.id t2.id;2.4 覆盖索引
覆盖索引说的是要查询的字段尽量都在索引树中尽量不要再回表查询数据假设只需要查询test表中的id, username则在id和username上添加索引使得查询的所有字段数据都在索引上。
select id, username from test limit 10000000, 1000;这种方案需要保证要查询的字段都被添加了索引但是如果当前分页查询的数据占整张表的大部分数据时索引可能失效造成回表查询。
好了这就是给大家分享的几种简单处理深分页问题的方案今天就到这儿吧我是冰河我们下期见~~