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

Posted

技术标签:

【中文标题】Mysql - 超过 10m 数据的查询表【英文标题】:Mysql - query table with over 10m data 【发布时间】:2015-03-07 02:00:53 【问题描述】:

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

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

在大多数查询中,只使用前1或2个分区,并且这些分区的记录总和不到200m,还是很快的。

但是有些查询需要加载超过 10 个分区来做一些静态化,因此单个查询涉及超过 1000 万条记录,这很慢,并且随着数据的增长变得更糟。

部分表格:

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,但大查询不常用。)

【问题讨论】:

好的;什么查询?您是否考虑过设置多个表并限制每个表的行数?比如每个月新的table_month_year @Andrew 我用表格和查询信息更新了问题。您的建议对于某些查询是好的,但是仍然有一个查询需要统计一年中的所有数据。 【参考方案1】:

您还可以做其他几件事来提高性能。

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

【讨论】:

我已经根据查询非常仔细地添加了索引,是的,我在最新的1或2分区中缓存了一些数据,但是我提到的查询涉及很多数据,其中大部分不经常使用,所以无法全部缓存。 @EricWang ,如果这些是您的问题所暗示的统计分析查询,那么在应用程序级别安排这些任务呢?一旦运行并准备好数据,通知用户。考虑到数据负载相关,它不必快速运行。 感谢提示,我正在考虑缓存统计信息,但它是由用户从 GUI 触发的。【参考方案2】:

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

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

【讨论】:

【参考方案3】:

在日期字段上应用了哪种类型的分区?是范围类型吗?如果您使用了 WRONG 分区类型(如哈希),那么它将查找几乎所有分区并导致分区没有用处。

【讨论】:

以上是关于Mysql - 超过 10m 数据的查询表的主要内容,如果未能解决你的问题,请参考以下文章

如何在 postgresql 中改进此查询?它已经花费了超过 48 小时

MySQL 查询的 JSON 输出在超过 1026 字节时不显示数据

MySQL查询性能优化

mysql 表记录超过十万条后,查询速度特别慢?

如何优化 mysql 查询,因为 Full ProcessList 显示发送数据超过 24 小时

这个查询有啥问题?从超过 220,000 条记录的 mysql 表中加载数据需要 0.5 到 0.6 秒