Oracle和MySQL分页的区别

113 阅读1分钟

Oracle和MySQL在分页查询上有一些区别,主要体现在语法和功能上的差异:

1.语法差异:

2.Oracle:在 Oracle 中,使用 ROWNUM 函数结合子查询实现分页查询。例如:

SELECT * FROM ( SELECT emp.*, ROWNUM AS rn FROM employees emp WHERE ROWNUM <= 10 ) WHERE rn > 5;

3.MySQL:在 MySQL 中,可以使用 LIMIT 和 OFFSET 关键字实现分页查询。例如:

SELECT * FROM employees LIMIT 5 OFFSET 5;

4.行号差异:

5.Oracle:在 Oracle 中,ROWNUM 是一个伪列,它表示返回结果集中的行号。需要注意的是,ROWNUM 是在查询结果返回之后再进行分配的行号,所以在子查询中使用时,需要先进行排序,然后再在外层查询中限制行数。

6.MySQL:在 MySQL 中,没有直接类似于 ROWNUM 的概念。MySQL 使用 LIMIT 和 OFFSET 设置返回的起始位置和行数。LIMIT 指定返回的最大行数,OFFSET 表示从哪一行开始返回结果。

7.性能差异:

8.Oracle:在 Oracle 中,使用 ROWNUM 进行分页查询可能导致一些性能问题,特别是当需要跳过大量行时(例如跳过前几万行),因为 ROWNUM 是在结果集返回之后再分配的行号。

9.MySQL:在 MySQL 中,使用 LIMIT 和 OFFSET 进行分页查询性能较好,因为 MySQL 在内部优化了这些操作。

延伸下深分页问题

深分页问题主要是跳过了大量的数据来获取所需的数据,DB是要计算出跳过的行数

可以依靠有序键值(索引肯定是要建立的)

SELECT * FROM 
table_name 
WHERE sort_key > last_seen_value 
ORDER BY sort_key FETCH NEXT 100 ROWS ONLY;

注意 OFFSET-FETCH 是从 12C 版本后才有