sql limit order by and where

1 sql limit

limit size,返回前size行。

limit offset , size,返回offset开始的size行,offset从0行开始。

2 sql limit with where

where先对基础数据按行进行过滤,然后limit操作在这个经过过滤的数据基础至上。

3 sql limit with order by

对基础数据进行排序,然后再进行limit操作,这样保证返回的结果的顺序确定。

用了order by返回的结果也不是确定的,如果是基于非唯一字段排序的,那么返回的结果也可能不一样,要确定一样,那么就要基于唯一性字段排序。

用了limit的order by不会全表排序的,它会全表扫描,然后找到前n大的后就直接返回了,如果是索引列的话,因为已经排好序了,就会非常快了。

如果非唯一字段排序,但是要求结果一致的话,可以采用下面的办法:

可以额外加一个排序条件。例如id字段是唯一的,可以考虑在排序字段中额外加个id排序去确保顺序稳定。

所以上面的情况下可以在SQL再添加个排序字段,比如fund_flow的id字段,这样分页的问题就解决了。修改后的SQL可以像下面这样:
SELECT * FROM user ORDER BY create_time,id LIMIT 6,2;

4 sql limit without order by

返回的结果的顺序不是固定的,但是结果是一致的,只要原始数据不变化。

5 大表时提高limit的效率

select * from product limit 866613, 20   37.44秒

limit语句的查询时间与起始记录的位置成正比,因为需要从头开始遍历整个表来找到866613的位置。

解决办法:

使用索引,帮助sql引擎找到866613的位置。使用覆盖索引,即只包含索引的列。

select id from product limit 866613, 20 0.2秒

SELECT * FROM product WHERE ID > =(select id from product limit 866613, 1) limit 20

或者使用join

SELECT * FROM product a JOIN (select id from product limit 866613, 20) b ON a.id = b.id

原文地址:https://www.cnblogs.com/hustdc/p/11492041.html