mysql - 短路 SQL 以返回找到的第一个 X 行

标签 mysql database oracle

我知道 SQL 只能像这样返回一定数量的行:

数据库: select ... order by num desc limit 10

甲骨文数据库: WHERE ROWNUM <= 10 and whatever_else

但我的印象是,这些执行是通过查找满足您的“where”条件的所有条目然后仅返回其中的一个子集来执行的。

我想告诉它,“给我你遇到的前 N ​​个满足我条件的条目并停止执行”,这样如果我只想要数据库中某些数据的示例,我的查询将执行得非常快而不是全部。

有谁知道如何在 MySQL 和/或 Oracle SQL 中执行此操作?首选 Oracle SQL,但如有任何帮助,我们将不胜感激。

另外,正确的说法是什么? “短路”一词描述了我正在寻找的内容,但我不确定它是否是关于数据库的官方术语。

最佳答案

一个简单的 select ... where ... limit ... 将在找到必要的项目后停止处理,此优化内置于 mysql 和其他引擎中。

一种常见的优化技术是在您知道只有一个匹配项时LIMIT 1,这可以防止数据库进行全面扫描。

但是,当您包含 ... order by ... 时,引擎别无选择,只能遍历所有项目以找到正确的元素。即使如此,也有关于不限制的优化,在您的示例中,数据库引擎可能只保留 10 个项目的列表,并在找到应在其上方排序的元素时弹出项目。

关于mysql - 短路 SQL 以返回找到的第一个 X 行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33380778/

相关文章:

mysql - 葡萄牙语 MYSQL 中的 MONTHNAME

mysql - 根据MySQL中不同表中某些列的值匹配两列

database - 如何解决这个SQLSTATE[HY000] [2002] no connection could be because the target machine actively refused

sql-server - 使用 Oracle Loader 文件填充 SQL Server 2k8

sql - 什么时候索引变得必要或有值(value)?

javascript - 使用 OPENROWSET 通过 SQL Server 访问 Oracle DB

mysql - 当MySQL查询基于相关表中的第二个关系时,如何获得一对多结果?

mysql - SQL 将多个查询汇总为一个

php - 如果 MySQL 中的数据为 NULL,则将其替换为 PHP

database - 删除一个表中的行会触发另一个表中的删除