1、我现在有一张过车表(ITS_CAR_PASS),主要字段PASS_DATETIME(过车时间),PASS_PLATE_NO(号牌号码),PASS_PLATE_TYPE(号牌种类),PASS_PLATE_COLOR(号牌颜色),PASS_DEVICE_UNID(设备unid编号),2年的数量是大约20亿,是不是一定要采用大数据的架构来提高搜索速度。搜索条件常用是过车时间+号牌号码(精确,模糊),过车时间+号牌号码(精确,模糊)+号牌种类。还有一些统计报表经常会使用group by,和一些oracle函数,导致效率很差。
2、我要怎么设计才能提高搜索效率,之前采用oracle数据库,实现根据过车时间按月分表,表根据过车时间按小时分区。但是随着私家车数据量递增,过车数据也递增,数量越来越大,检索速度越来越慢,而且做一些业务上的分析操作,效率很差。
可以采用把多个表的数据加到一张表上,这样检索的话可以通过一条sql进行查询
为经常用于搜索条件的字段添加索引,优化sql
按月、按小时分表分区的思路是没问题的,这样的话,过车时间不会成为效率瓶颈。我估计你的效率瓶颈出现在车牌的查询上。
如果号牌号码只有精确查询,那么在这一项上建立哈希索引,能极大提高检索速度。
如果号牌号码还需要支持模糊搜索,那就很困难了。下面几种解决方案,都只能在一定程度上解决:
1. 在检索时,先检索过车时间,筛选完后再检索号牌。
2. 根据号牌的前几位分区,或者依据前几位建立二级B树索引,但这样只能支持给定前几位的模糊查询,不支持任意位的模糊查询,而且效率会低于哈希索引。
3. 根据模糊查询的条件,遍历出所有可能的结果,一一代入SQL语句做精确搜索,这样就可以利用上索引。但这样的搜索效率也不好说。
如果要支持完全的模糊查询,那必须遍历全表,想提高效率非常困难。建议不要完全依靠数据库的检索技术,而是在需求上考虑一下,是不是一定要用模糊搜索?搜索的需求能不能在一定程度上向精确搜索靠拢?换句话说,就是先简化问题,再依靠数据库。前面提的几种是我想到的解决方案,但不一定符合你的要求,仅供参考。