如何配置/设计每 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 次的表?的主要内容,如果未能解决你的问题,请参考以下文章

每 15-30 分钟在 iOS 上安排一个任务

spring quartz 每30分钟执行一次cronExpression表达式怎么写

crontab中如何实现每隔多少天执行一次脚本

每 5 分钟检查一次循环中的特定进程,持续 30 分钟

如何每 X 分钟运行一次 cronjob?

Android:如何每 15 分钟使用 AlarmManager 重复一次服务,但只在上午 8:00 到晚上 18:00 运行?