小弟用的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语句或者增加什么索引才能在最短时间内得到结果呢?
表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语句或者增加什么索引才能在最短时间内得到结果呢?
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
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
queries对qid建索引
timestamp分别对uid,qid建索引