Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql-数据量超过10m的查询表_Mysql_Sql_Bigdata - Fatal编程技术网

Mysql-数据量超过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

我正在使用Java和mysql维护一个web项目

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

在大多数查询中,只使用前1或2个分区,并且这些分区中记录的总和小于200m,这仍然是相当快的

但是一些查询需要加载超过10个分区才能进行一些静态查询,因此单个查询涉及超过10m条记录,这相当慢,而且随着数据的增长,情况会变得更糟

表格的一部分:

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

      如果旧数据是静态的,我会尝试进行一些预聚合并将它们存储为表。然后根据预聚合表进行初始查询,一旦有人需要更多详细信息,则转到数据的粒度级别。您可以创建许多不同的摘要/聚合表,即使您按照2-3个字段进行分组(不知道您的数据上下文/结构)


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

      在日期字段上应用了什么类型的分区?是射程型的吗?如果您使用了错误的分区类型(如哈希),那么它将查找几乎所有的分区,导致分区无效。

      我已经根据查询非常小心地添加了索引,是的,我在最新的1或2分区中缓存了一些数据,但我遇到的查询涉及大量数据,其中大多数不经常使用,所以不能缓存所有的任务。@EricWang,如果这些是您的问题所建议的统计分析查询,那么在应用程序级别调度这些任务怎么样?运行并准备好数据后通知用户。因此,考虑到数据负载相关,它不必运行得很快;什么是查询?您是否考虑过设置多个表并限制每个表的行数?例如,每个月都有一个新表_year@Andrew我用表和查询信息更新了问题。您的建议适用于某些查询,但仍然需要查询一年中所有数据的统计信息。