小弟用的DB是sqlite,程序用JAVA写的,现在有3个表,主要是用来查询满足条件的user所提交的query, 
表Q_USER(UID,NUM_OF_QUERIES)存放的是每个用户所提交查询的次数,UID为主键,有65万多条数据 
表QUERIES(QID,QUERY)存放的是所有的查询记录但不包括重复的记录,QID为主键,QUERY唯一,有1千多条数据 
表TIMESTAMP(UID,QID,TIMESTAMP)存放的是每个user查询的记录的相应QID和时间戳,三个字段都不是唯一的,有3千多万条数据。 
现在要求查找查询过m条到n条记录的user他们所查询过的所有记录和记录的时间戳,比如有100个人,他们最少查询过3次,最多查询过10次,那么要求得到这些人查询过的所有记录和它们的时间戳。。 
因为数据量比较大,请教各位大侠,如何写SQL语句或者增加什么索引才能在最短时间内得到结果呢?

解决方案 »

  1.   


    create table Q_USER (
      UID int primary key,
      NUM_OF_QUERIES int
    ) -- 65万
    create index idx_q_user_NUM_OF_QUERIES on Q_USER(NUM_OF_QUERIES)create table QUERIES (
      QID int primary key,
      QUERY varchar(32)
    ) -- 1千多
    create table TIMESTAMP (
      UID int ,
      QID int ,
      TIMESTAMP datetime
    ) -- 3千多万
    create index idx_TIMESTAMP_QID on TIMESTAMP (QID)
    /*
    现在要求查找查询过m条到n条记录的user他们所查询过的所有记录和记录的时间戳,
    比如有100个人,他们最少查询过3次,最多查询过10次,那么要求得到这些人查询过的所有记录和它们的时间戳
    */
    -- 现在要求查找查询过@m条到@n条记录的user
    select UID 
    into #t_U
    from Q_USER
    where NUM_OF_QUERIES between @m and @nselect QUERY, TIMESTAMP
    from QUERIES q
    join TIMESTAMP t on t.QID=q.QID
    where exists (select 1 from #t_U u where u.UID=t.UID)-- clear temp table
    drop table #t_U
    go
      

  2.   

    谢谢楼上详细的回复,不过我好像写错了一个地方,QUERIES这个表,不是1千多条数据,而是一千多万条数据,这样如果join的话会不会时间很长啊?因为我写的是类似的SQL,其中没用临时表,用的是视图,10万条数据要花近十分钟太慢了点好像。。
      

  3.   

    而且SQLite好像不支select .. into 临时表 这个语法
      

  4.   

    这样呢?-- 现在要求查找查询过@m条到@n条记录的user
    create table m_User (UID int primary key)
    insert into m_User
    select UID 
    from Q_USER
    where NUM_OF_QUERIES between @m and @nselect QUERY, TIMESTAMP
    from QUERIES q
    join TIMESTAMP t on t.QID=q.QID
    where exists (select 1 from m_User u where u.UID=t.UID)-- clear temp table
    drop table m_User
      

  5.   

    select * from queries a,timestamp b where a.qid=b.qid and exists(select * from q_user where uid=b.uid and query between 3 and 10)q_user对uid,query分别建索引
    queries对qid建索引
    timestamp分别对uid,qid建索引
      

  6.   

    不是很了解Sqlite的机制,理论上,PK应该有索引了