Mysql-数据量超过10m的查询表
我正在使用Java和mysql维护一个web项目 一个mysql表有超过1000万条记录,我按日期对表进行了分区,以便减少每个分区中的行数。索引也会根据查询正确添加 在大多数查询中,只使用前1或2个分区,并且这些分区中记录的总和小于200m,这仍然是相当快的 但是一些查询需要加载超过10个分区才能进行一些静态查询,因此单个查询涉及超过10m条记录,这相当慢,而且随着数据的增长,情况会变得更糟 表格的一部分:Mysql-数据量超过10m的查询表,mysql,sql,bigdata,Mysql,Sql,Bigdata,我正在使用Java和mysql维护一个web项目 一个mysql表有超过1000万条记录,我按日期对表进行了分区,以便减少每个分区中的行数。索引也会根据查询正确添加 在大多数查询中,只使用前1或2个分区,并且这些分区中记录的总和小于200m,这仍然是相当快的 但是一些查询需要加载超过10个分区才能进行一些静态查询,因此单个查询涉及超过10m条记录,这相当慢,而且随着数据的增长,情况会变得更糟 表格的一部分: id(int), amount(double), type(varchar), user
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.
我的问题是:
如何使涉及超过1000万条记录的查询更快
以下是我的猜测,但不确定:
- 使用mysql集群?(我以前从未用过。)
- 使用大缓存。(Memcache,但不经常使用大查询。)
- 分析查询并根据需要引入索引李>
- 识别应用程序的数据访问模式,您可以只缓存频繁访问的数据,以减少磁盘I/O
- 为了提高性能,您还可以做其他几件事
但是考虑一下这个…如果您有10万条记录,并且您确实为分组在上的所有静态/旧数据聚合数据,例如。。。3个字段,这将设置减少到甚至100万条记录,这很有帮助。然后,如果您只对其中一个条件的总计感兴趣,那么您可以按3个字段查询聚合,但按1分组,因此您的1m记录是查询的基础,而不是完整的10个字段。一旦用户发现fieldX=???交叉点的特殊需求???和fieldY=?,然后转到10m记录集,获取所需的完整原始数据。在日期字段上应用了什么类型的分区?是射程型的吗?如果您使用了错误的分区类型(如哈希),那么它将查找几乎所有的分区,导致分区无效。我已经根据查询非常小心地添加了索引,是的,我在最新的1或2分区中缓存了一些数据,但我遇到的查询涉及大量数据,其中大多数不经常使用,所以不能缓存所有的任务。@EricWang,如果这些是您的问题所建议的统计分析查询,那么在应用程序级别调度这些任务怎么样?运行并准备好数据后通知用户。因此,考虑到数据负载相关,它不必运行得很快;什么是查询?您是否考虑过设置多个表并限制每个表的行数?例如,每个月都有一个新表_year@Andrew我用表和查询信息更新了问题。您的建议适用于某些查询,但仍然需要查询一年中所有数据的统计信息。