2015-06-19 66 views
0

我有這個bean /表「用戶信息」列id,用戶名和twitchChannel。 對於大多數用戶信息,twitchChannel列將爲空。我正在瀏覽表中的每個userinfo實體並搜索列twitchChannel,如果列不爲空,我將twitchChannel放入數組中。使用索引可以使這個請求更有效嗎?

這是我的要求是什麼樣子:

"SELECT ui FROM Userinfo ui WHERE ui.iduserinfo=:id" 

這是非常低效的,因爲我經歷的每一個實體,即使是那些有一個空twitchChannel,我不感興趣的那些。

這是java,但我評論每一行,因此很容易理解那些不知道它的人。

while (true) { // I'm going through the table in an infinite loop 
     int id = 0; //id that is incremented for searches 
     Userinfo ui; // this will be an object that will hold the result of my query 
     do { 
      ui = ups.getUserInfo(id); // this execute the query I posted above 
      id++; //incrementing id for next search 
      if (ui.getTwitch() != null) { // if the search didn't return null 
       twitchChannels.add(ui.getTwitch()); // put my twitch in an array 
      } 
     } while (ui != null); 
    } 

所以目前我正在經歷我的表中的每個實體,即使是那些有空抽搐的實體。根據我的理解,可以通過索引加速進程。

CREATE INDEX twitchChannel 
ON Userinfo (twitchChannel) 

所以像這樣的事情會有一個非空twitchChannel表。我如何通過上面這張桌子循環播放? 它會以與java持久性相同的方式工作嗎?

回答

1

查詢更改爲:

SELECT ui 
FROM Userinfo ui 
WHERE twitchChannel IS NOT NULL 

這會從索引中受益的Userinfo(twitchChannel)(假設真的是在充滿很少值)。最起碼,這減少了從數據庫傳遞到應用程序的數據量,即使沒有使用索引也是如此。

+0

但我必須指定像這樣的索引:CREATE INDEX twitchChannel ON Userinfo(twitchChannel)?它自動使用索引嗎?我不必在我的查詢中指定它 – Ced

+0

@Ced ...是的,查詢會自動使用索引,但索引並不總是被使用,根據數據的不同,90%或99%的索引可能必須是NULL。 –

+0

謝謝。好吧,這將是我的用戶庫插入的字段。至少我希望沒有99%的空洞。但這並不重要。謝謝。 – Ced

1

如果我已經正確理解你的問題。你有一個包含數字ID的表格。你正在搜索真實數字的空間,看看是否有任何這些對應於你的表中的id('twitch'id?)

假設你的用戶少於無窮大,我會認爲你可以反轉這個邏輯。

查詢更改爲:

SELECT iduserinfo FROM Userinfo ORDER BY iduserinfo 

然後你的Java代碼將沿着線的東西:

uiResult = ups.getUserInfo(id); // this executes the new query 
    while (uiResult.next()) { 
     twitchChannels.add(uiResult.getTwitch()); // put my twitch in an array 
    } 

(道歉,其因爲我已經使用JDBC很長一段時間) 。

對不起如果我誤解了這個問題。

+0

等一下,我想你是誤解了,或者我沒有。我有一個有3列的表格,分別是「id」,「username」和「twitch」。但我只是想了一些像「選擇抽搐從用戶信息,其中抽搐不是NULL。這不完全是我所期待的,但我認爲它會做到這一點。謝謝 – Ced