求教sql语句优化

周靖峰 2014-09-05 10:41:35
数据库的表结构如下:


CREATE TABLE RecordData(ID INTEGER PRIMARY KEY, Disk INTEGER, Position INTEGER, Ch INTEGER, Type INTEGER, TypeIndex INTEGER, StartTime INTEGER, EndTime INTEGER);


其中ID为索引,Disk为硬盘号,Position表示录像所在位置,Ch为通道号,Type为什么类型的录像(其中-1表示真实的录像,其它表示录像记录),TypeIndex未用,StartTime表示起始时间,EndTime表示结束时间(其中-1表示还没有结束)

现在该表中既存储录像文件的信息,又存储录像记录的信息,根据这两者的信息获取实际的录像信息,例如有以下几条记录:

ID Disk Position Ch Type TypeIndex StartTime EndTime
1 1 1 1 -1 -1 100 200
2 -1 -1 1 1 -1 100 -1
3 1 2 1 -1 -1 201 -1
4 -1 -1 1 2 -1 220 260

由上表可知1、3的Type为-1,为实际录像文件;2、4的Type不为-1,为录像记录文件
因此它们两两组合能够得出实际的录像信息:
1与2组合得:录像1,起始时间100,结束时间200
1与4组合得:无录像
3与2组合得:录像2,起始时间201,结束时间-1(也就是还没有结束)
3与4组合得:录像3,起始时间220,结束时间260

基于以上信息,我就写了对应的sql查询语句(假设通道为20,起始时间为1409875200,结束时间为1409961540),如下所示:

select File.Disk, File.Position, File.StartTime, File.EndTime, Record.Ch, Record.Type, Record.StartTime, Record.EndTime
from
(select * from RecordData where Ch = 20 and StartTime < 1409961540 and (EndTime > 1409875200 or EndTime == -1) and Type == -1) as File,
(select * from RecordData where Ch = 20 and StartTime < 1409961540 and (EndTime > 1409875200 or EndTime == -1) and Type != -1) as Record
where (File.EndTime > Record.StartTime or File.EndTime == -1) and (File.StartTime < Record.EndTime or Record.EndTime == -1) limit 50;


但是这个语句执行效率极其低下,当通道20录像文件有3000多条,录像记录有30000多条时,程序要过好几分钟才会返回结果,所以我在这里发帖求教上面的sql语句的优化办法
...全文
178 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ACMAIN_CHM 2014-09-05
  • 打赏
  • 举报
回复
create index xxx on RecordData(ch,Type,StartTime)
周靖峰 2014-09-05
  • 打赏
  • 举报
回复
引用 1 楼 ACMAIN_CHM 的回复:
create index xxx on RecordData(ch,Type,StartTime)
非常感谢,原来索引这么牛逼啊
wwwwb 2014-09-05
  • 打赏
  • 举报
回复
(ch,Type,StartTime,EndTime)

56,677

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧