java - Java 中 SQL 查询不解析整个表的方法 - JDBC

标签 java mysql sql jdbc query-optimization

假设我们有一个非常大表,并且我们有以下形式的查询(这只是一个示例)

SELECT personID FROM people WHERE birthYear>2010 LIMIT 50

我想最大限度地提高获取该查询结果的性能,问题是数据库将解析整个表以查找与条件匹配的元组,然后返回前 50 个。如果我们有包含数百万或数十亿元组的数据库。

Java - JDBC 或 SQL 中是否有一种方法可以不解析整个表,而是逐步解析它并获取与条件匹配的前 50 行,或者解析前 1000 行并获取所有匹配的行,并在用户单击“显示更多”按钮时继续获取更多结果?

感谢您的宝贵时间。

最佳答案

这个问题并不真实。以下是对可能发生的情况的分析:

SELECT personID FROM people WHERE birthYear>1900 LIMIT 50
SELECT personID FROM people WHERE birthYear>2010 LIMIT 50

案例1:没有出生年份索引:

  • 1900:它将扫描表直到 50 行与 WHERE 子句匹配。这可能是前 50 个。
  • 2010:它将扫描大部分或全部表格,除非它是幼儿目录。因此,它可能需要读取所有行才能找到 50。

情况 2:索引开始:birthYear:

它将跳到索引中间,找到第一个大于 1900(或大于 2010)的值,然后抓取接下来的 50 行(或更少)。对于每一行,它将进入 personID 表。

情况3:INDEX(birthYear, personID):

与情况 2 一样,但它不需要“伸手到 table 上”。这是因为 personID 是索引的一部分。

仅在情况 1 中,并且只有少于 50 行且>1900(似乎不太可能)时,它才会扫描整个表。情况 2 和 3 立即停止于 50。

关于java - Java 中 SQL 查询不解析整个表的方法 - JDBC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59429844/

相关文章:

mysql - 如何组合触发器和事件并使事件使用特定的行 ID?

mysql - 提高文本性能?

mysql - 使用每个主键不同的内容更新多个记录

sql - VS Code 无法识别 SQL 代码中带括号的字符串

sql - 如何在 SQL Server 和 LINQ-to-SQL 中定义一侧可选的一对一关系?

java - spring-boot 2.0.6 速度 View 与资源加载器路径属性的问题

java - 如何向 JTable 中的现有行添加新行

java - java中两个对象是否必须具有相同的内存地址才能指向同一个对象

java - 线程在进入下一个 Activity 之前保持更新一段时间,并且冲突已关闭

sql - 当连接超时时,Postgres 行锁会发生什么情况?