如何配置/设计每 15 分钟插入 30,000 次的表?
Posted
技术标签:
【中文标题】如何配置/设计每 15 分钟插入 30,000 次的表?【英文标题】:how to configure/design a table with 30,000 insertion in every 15 minutes? 【发布时间】:2013-11-28 16:32:59 【问题描述】:我正在尝试设计一个每 15 分钟将面临 30,000 次插入的数据库表。所以这个表将面临数百万的插入。
示例表如下-
CREATE TABLE `cdr` (`id` bigint(20) NOT NULL AUTO_INCREMENT,
`dataPacketDownLink` bigint(20) DEFAULT NULL,
`dataPacketUpLink` bigint(20) DEFAULT NULL,
`dataPlanEndTime` datetime DEFAULT NULL,
`dataPlanStartTime` datetime DEFAULT NULL,
`dataVolumeDownLink` bigint(20) DEFAULT NULL,
`dataVolumeUpLink` bigint(20) DEFAULT NULL,
`dataplan` varchar(255) DEFAULT NULL,
`dataplanType` varchar(255) DEFAULT NULL,
`createdOn` datetime DEFAULT NULL,
`deviceName` varchar(500) DEFAULT NULL,
`duration` int(11) NOT NULL,
`effectiveDuration` int(11) NOT NULL,
`hour` int(11) DEFAULT NULL,
`eventDate` datetime DEFAULT NULL,
`msisdn` bigint(20) DEFAULT NULL,
`quarter` int(11) DEFAULT NULL,
`validDays` int(11) DEFAULT NULL,
`dataLeft` bigint(20) DEFAULT NULL,
`completedOn` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `msisdn_index` (`msisdn`),
KEY `eventdate_index` (`eventDate`)
) ENGINE=MyISAM AUTO_INCREMENT=55925171 DEFAULT CHARSET=latin1;
如果使用比较 >= 在日期列的情况下(导致数百万条记录),我如何检索记录。 所以请帮我设计这样的表,这样我就可以在不影响插入操作的情况下使用优化的选择语句(很多索引在数百万条记录后创建插入问题)。 谢谢。
【问题讨论】:
我真的会尽量避免使用 MyISAM 引擎。如果在其中一个大型插入过程中发生了某些事情,则该表没有日志,并且最终可能会出现不可恢复的混乱。 【参考方案1】:简短回答:
决定如何保存历史记录。
使用 InnoDB 引擎。
使用分区轻松快速地管理块中的数据。
实现当前窗口分区 - 有一个表用于当前集,1 个或多个表用于存档并将分区移动到旧表。
为了获得最快的写入性能 - 删除所有索引和约束。在加载所有数据后投射它们。如果对数据插入没有压力 - 离开它们,但要知道会受到什么惩罚。
确保您的服务器可以处理如此多的连接/数据量。为未来 2-3 年做好规划,因为硬件升级需要大量时间。
进行负载测试,包括重载 - 了解您的极限。
并继续研究。
【讨论】:
hii stoleg, >使用分区来管理数据并删除所有索引和约束。分区也需要唯一键约束,在这种情况下我能做什么?而且我还必须从这个表中读取数据,这需要索引。那么我该如何设计呢?我已经阅读了有关 stakeoverflow 的其他页面,人们拥有包含 4 亿条记录的表格,并且他们正在管理它。但我没有资格在那里发表评论,所以我可以问他们:( 是的,您甚至可以管理十亿条记录。告诉更多关于表的使用,你预期的查询类型。您可以考虑使用临时表来更快地插入,但这些记录出现在查询表中会有些延迟。或者创建一个单独的报告表,其中包含聚合或最近/经常需要的信息,以加快限制查询的行数,代价是额外的磁盘空间和时间。 这样的查询 - 从 cdr c 中选择 c.msisdn,sum(c.dataVolumeDownLink+c.dataVolumeUpLink) 作为数据总和,其中 c.eventDate>='date_var' group by c.msisdn order by datasum desc;主要是在 eventdate 上通过比较进行查询。所以告诉我我应该做什么分期或报告表,或者用这个稍微改变一下。 为了加快聚合查询,您可以创建一个计算这些聚合的表。然后,您可以通过直接的select
查询得到总和,而无需 sum()
和 group by
。
嗯,这张新桌子听起来不错,再帮我一个忙,请给我一个例子或样品,我怎么做的。感谢您的帮助。以上是关于如何配置/设计每 15 分钟插入 30,000 次的表?的主要内容,如果未能解决你的问题,请参考以下文章
spring quartz 每30分钟执行一次cronExpression表达式怎么写
Android:如何每 15 分钟使用 AlarmManager 重复一次服务,但只在上午 8:00 到晚上 18:00 运行?