各位高手,目前碰到一个X亿级数据检索速度优化的难题,大家帮看看怎么解决。
涉及到的表有:
KeywordIndex:2.7亿条记录
Original:1014万条记录
KeywordIndex表包括四个字段,ID(PK,int)、KeywordID(int)、OriginalID(int)、ColumnID(int)
建立的索引:
业务需求是从KeywordIndex表中查找到同时符合多个KeywordID的记录(交集),然后根据这个交集从Original表中取出相应记录、排序后取出前X条
基本的语句如下
现在的问题是,上面的语句包含11个KeywordID ,查询速度需要18秒,怎样能够优化到3秒以内?
测试发现,如果符合某一个KeywordID记录数较少的话(比如几万条),查询可以再1秒内完成
如果减少KeywordID 数量,能较少一定的时间(去掉几个KeywordID ,时间在13秒左右),但并不明显
感觉主要的耗时在INTERSECT上。
我试过对KeywordIndex 分区,每5000万一个分区,按ID左右分区依据,没有效果
上面的SQL语句中,已经是按照KeywordID记录数从少到多拼接的KeywordID = 1933(346613条记录) , KeywordID = 24(10080873条记录)
执行计划如下:
希望各位高手帮忙指点一下,方向不限,优化SQL,更改表结构、索引,更改实现方式,换数据库都可以,非常感谢
看你的sql,感觉OriginalID 跟 KeywordID 应该是多对多的。
那么你可以先查出KeywordID in(11个数) 的数据集,然后对OriginalID 进行group by 求和,having count(1) = 11的数据,就是你要的数据了。
最后在用你的外层语句把这个子集包起来。
只是提供个想法,换个思路。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。