我遇到了使用mybatis3.1 + spring的奇怪问题。 这是我的xml代码
select(sum(hotplay_vv)> 0的情况,然后sum(hotplay_vv),否则0结束)作为provincevv,
province_id作为来自hotplay_vv的provinceid
dt> =#{startdt}和dt< =#{enddt}和brand_id =#{brandId}
和hotplay_id =#{hotplayId}按省份分组
]>
这是我的测试代码:
@Test
public void testSearchValue() {
List< Province >sumvv= (List<Province>) service.getSumGroupProvinces("2014-01-20", "2014-02-01", 1,1000);
System.out.println("total-->"+sumvv.get(0).getProvinceVV()+" size-->"+sumvv.size());
Assert.assertEquals(59346, sumvv.get(0).getProvinceVV());
}
当我选择结束时间'2014-02-01'我可以获得价值但改为'2014-02-10',没有结果返回,我该如何解决这个问题.... < / p>
答案 0 :(得分:0)
如果没有关于表格列,索引,基数等的任何其他信息,我的直接膝跳反应是当有适当的覆盖索引可用时,将获得此查询的最佳性能。
例如,
... ON hotplay_vv (hotplay_id, brand_id, province_id, dt, hotplay_vv)
为什么那些列按顺序排列?首先,这是查询中引用的所有列,因此可以从索引中满足查询,而无需访问表中的页面。这就是“覆盖”指数的含义。
hotplay_id
和brand_id
列是第一列,因为这些列上有等式谓词。在这些列上具有合理的基数,我们希望它是表中所有行的相对较小的子集,因此应该给我们索引范围扫描操作,这将在我们需要的行上为零,而不需要检查很多我们不需要的行。索引中这些列的顺序对于此特定查询可能并不重要,因此无论哪个顺序都有利于其他查询可能是决定因素,否则,我们希望将具有最高基数的列作为前导列。< / p>
接下来是province_id
列,因为对此进行了GROUP BY
操作。 (净效果与GROUP BY hotplay_id, brand_id, province_id
相同,因为前两列只有一个值。
dt
列是下一个......目前还不清楚MySQL是否必须查看所有dt值,或者它是否可以执行较低级别范围扫描来优化这一点。
最后包含hotplay_vv列,这样我们就可以从索引中获取值而无需访问表页。
我们希望EXPLAIN显示“使用索引”并对文件排序操作进行编码。
dt
上的索引范围扫描看起来很吸引少量行,即索引。
... ON hotplay_vv (hotplay_id, brand_id, dt, province_id, hotplay_vv)
但是如果访问的行数很大,那么执行GROUP BY操作的“使用filesort”操作就不那么吸引人了。