lukaliou123 / lukaliou123.github.io

lukaliou123在2022年的面试用知识点总结
Other
5 stars 0 forks source link

一些有趣的sql语句 #32

Open lukaliou123 opened 1 year ago

lukaliou123 commented 1 year ago

1.我有个博客系统,这个博客有一个数据库,存每一个博客文章的信息。博客分页,用SQL语句取第二页的博文,怎么取?我曾经想过用Limit和offset,不过被告知不用这么麻烦,该如何解决呢?

对于分页查询,通常我们的做法确实是利用LIMIT和OFFSET关键字,比如你想要取第二页的数据,每页有10条数据,你可能会写出这样的SQL语句: sql

SELECT * FROM blog_posts ORDER BY post_date DESC LIMIT 10 OFFSET 10;

在这个例子中,OFFSET指定了跳过的记录数(在这里是10,因为第一页有10条数据),LIMIT则指定了返回记录的最大数量。

然而,使用OFFSET的方式在处理大数据量时会有性能问题,因为它会跳过OFFSET之前的所有记录。随着数据页数的增加,性能可能会急剧下降

对于这种情况,一种改进的方法是记住上一页的最后一条记录,并在查询下一页时使用这个记录的标识符(通常是ID)。这样,你可以直接从下一条记录开始获取,而无需跳过任何记录。这通常被称为"基于游标的分页"。例如: SELECT * FROM blog_posts WHERE id > last_id_on_previous_page ORDER BY id ASC LIMIT 10; 在这个查询中,我们没有使用OFFSET,而是只获取了大于上一页最后一条记录id的前10条记录。这种方法的效率比使用OFFSET要高得多,尤其是在大数据集上**。

所以,如果你的系统需要处理大量数据,并且需要进行频繁的分页操作,基于游标的分页可能是一个更好的选择哦