2015-06-19 63 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