Mybatis组通过查询超时

时间:2014-03-01 07:32:57

标签: java mysql spring mybatis

我遇到了使用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>

1 个答案:

答案 0 :(得分:0)

如果没有关于表格列,索引,基数等的任何其他信息,我的直接膝跳反应是当有适当的覆盖索引可用时,将获得此查询的最佳性能。

例如,

... ON hotplay_vv (hotplay_id, brand_id, province_id, dt, hotplay_vv)

为什么那些列按顺序排列?首先,这是查询中引用的所有列,因此可以从索引中满足查询,而无需访问表中的页面。这就是“覆盖”指数的含义。

hotplay_idbrand_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”操作就不那么吸引人了。