簡體   English   中英

在 Java 中不為 SQL 查詢解析整個表的方法 - JDBC

[英]Method to not parse the whole table for an SQL Query in Java - JDBC

假設我們有一個非常大的表,我們有以下形式的查詢(這只是一個例子)

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:沒有關於birthYear 的索引:

  • 1900:它只會掃描表,直到有 50 行與WHERE子句匹配 這很可能是前 50 名。
  • 2010 年:它將掃描大部分或全部表格,除非它是幼兒目錄。 因此,它可能需要讀取所有行才能找到 50。

案例 2:birthYear開頭的索引:

它將跳到索引的中間,到第一個值 >1900(或 >2010),然后抓取接下來的 50 行(或更少)。 對於這些行中的每一行,它將進入personID表。

案例 3: INDEX(birthYear, personID)

與案例 2 一樣,但它不需要“伸手到桌子上”。 這是因為personID是索引的一部分。

只有在第 1 種情況下,並且只有當少於 50 行的行數大於 1900(似乎不太可能)時,它才會掃描整個表。 案例 2 和案例 3 在 50 處立即停止。

在這種情況下你必須做兩件事——

  1. 創建一個birthYear 和personID 的索引
  2. 按年份在表上進行分區

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM