Mysql - 超过10米数据的查询表

时间:2015-03-07 02:00:53

标签: mysql sql bigdata

我正在使用Java& amp;维护一个Web项目。 MySQL的。

一个mysql表有超过1000万条记录,我按日期对表进行了分区,以便减少每个分区中的行数。索引也会根据查询正确添加。

在大多数查询中,只使用第一个或第一个分区,并且这些使用的分区中的记录总和小于200米,它仍然很快。

但是有些查询需要加载10个以上的分区来执行某些统计,因此单个查询中涉及超过10万条记录,这非常慢,随着数据的增长而变得更糟。

表格的一部分:

id(int), amount(double), type(varchar), user_id(int), event_date(timestamp)
-- `id` is primary key, `type` has index,

其中一个大问题类似于:

select count(id), sum(amount) group by (type)
where event_date between '2014-01-01' and '2014-12-31 23:59:59' and amount >= 10

-- The start & end datetime and the amount range might change.

我的问题是:

如何更快地进行超过10米记录的查询?

这是我的猜测,但不确定:

  • 使用mysql集群? (我之前从未使用过。)
  • 使用大缓存。 (Memcache,但不经常使用大查询。)

3 个答案:

答案 0 :(得分:1)

您还可以采取其他一些措施来提升绩效。

  • 分析查询并根据需要引入索引。
  • 识别应用程序的数据访问模式,您只能缓存经常访问的数据以减少磁盘I / O.

答案 1 :(得分:1)

如果旧数据是静态的,我会拍摄一些预聚合并将它们存储为表格。然后根据预聚合表进行初始查询,一旦有人想要更多细节,然后转到粒度级别的数据。您可以创建许多不同的汇总/聚合表,即使您通过2-3个字段进行分组(不知道您的数据cotext /结构)。

但请考虑一下......如果您有10米的记录,并且您确实汇总了所有静态/旧数据的数据,这些数据分组在... 3个字段中,这会将设置减少到甚至100万条记录,这会有所帮助。然后,如果您只对其中一个条件感兴趣,那么您可以通过3个字段查询聚合但是按1分组,因此您的1m记录是查询的基础而不是完整的10个。一旦用户找到了特别需要交叉的fieldX = ???和fieldY = ???,然后转到您的10米记录集,以获取可能需要的完整原始数据。

答案 2 :(得分:0)

在日期字段中应用了哪种类型的分区?是范围类型?如果您使用像hash这样的WRONG分区类型,那么它将查找几乎所有分区,并且不会对分区使用。