首页 > 解决方案 > 不为 Java 中的 SQL 查询解析整个表的方法 - JDBC

问题描述

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

SELECT personID FROM people WHERE birthYear>2010 LIMIT 50

我想最大化获取该查询结果的性能,问题是数据库将解析整个表以找到匹配条件的元组,然后返回前 50 个。如果我们有一个数据库,那就是一个问题数百万或数十亿的元组。

Java - JDBC或SQL中有没有办法不解析整个表并逐步解析它并获取与条件匹配的前50行,或者例如解析前1000行并获取所有匹配的行并继续获取当用户单击“显示更多”按钮时,更多结果?

感谢您的时间。

标签: javamysqlsqljdbcquery-optimization

解决方案


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

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 一样,但不需要“伸手可及”。这是因为personID是索引的一部分。

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


推荐阅读