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

方法不解析Java-JDBC中SQL查询的整个表,java,mysql,sql,jdbc,query-optimization,Java,Mysql,Sql,Jdbc,Query Optimization,假设我们有一个非常大的表,我们有如下形式的查询(这只是一个示例) 我想最大限度地提高获取该查询结果的性能,问题是数据库将解析整个表以找到与条件匹配的元组,然后返回前50个元组。如果我们有一个有数百万或数十亿元组的数据库,这就是一个问题 在Java-JDBC或SQL中,有没有一种方法可以不解析整个表并逐步解析它并获得符合条件的前50行,或者解析前1000行并获得所有符合条件的行,并在用户单击“Show more”按钮时继续获取更多结果 谢谢您的时间。问题不是真的。下面是对可能发生的情况的分析: S

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

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

在Java-JDBC或SQL中,有没有一种方法可以不解析整个表并逐步解析它并获得符合条件的前50行,或者解析前1000行并获得所有符合条件的行,并在用户单击“Show more”按钮时继续获取更多结果


谢谢您的时间。

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

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:以出生年份开始的索引:

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

案例3:
索引(生日,人名)

与案例2一样,但它不需要“进入表格”。这是因为
personID
是索引的一部分


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

在这种情况下,您必须做两件事-

  • 创建生日和人名的索引
  • 每年对表进行分区

  • 你们有关于生日栏的索引吗?您可以限制50条记录,但顺序是什么?您总是需要一个带有限制的ORDERBY子句,否则mysql将随机返回50条记录查询只是一个示例。不会总是在生日等的地方。这是真的吗?当我这样做时,查询结果的大小就是行的总数,这就是为什么我认为它会扫描整个表。没有?@PavTze-你有1900年以前出生的人吗?我认为没有一个活着的人是那么老的。换一种说法,。。。优化器使用任何可用的方法来最小化要执行的工作——索引、位置、限制等。例如,查询可以包含所需的任何值,而不是1900。因此,关于案例1,我要问的是,对于任何有限制的查询,它是否会解析表,直到有50行与where子句匹配为止?@PavTze-如果允许最终用户创建查询,将进行表扫描;试图防止这种情况的发生是非常复杂的。另一方面,如果您提供一个API,您可以控制用户询问的“问题”,然后您可以(大部分)防止“缓慢”查询。但这意味着当用户需要新功能时,愿意加入索引。而且仍然会有难以优化的查询。(看看这个论坛上所有要求“优化”、“更快”或“性能”的查询。)
    SELECT personID FROM people WHERE birthYear>1900 LIMIT 50
    SELECT personID FROM people WHERE birthYear>2010 LIMIT 50