【问题标题】:how to configure/design a table with 30,000 insertion in every 15 minutes?如何配置/设计每 15 分钟插入 30,000 次的表?
【发布时间】: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 引擎。如果在其中一个大型插入过程中发生了某些事情,则该表没有日志,并且最终可能会出现不可恢复的混乱。

标签: mysql database-design bulkinsert query-performance


【解决方案1】:

简短回答:

  1. 决定如何保存历史记录。

  2. 使用 InnoDB 引擎。

  3. 使用分区轻松快速地管理块中的数据。

  4. 实现当前窗口分区 - 有一个表用于当前集,1 个或多个表用于存档并将分区移动到旧表。

  5. 为了获得最快的写入性能 - 删除所有索引和约束。在加载所有数据后投射它们。如果对数据插入没有压力 - 离开它们,但要知道会受到什么惩罚。

  6. 确保您的服务器可以处理如此多的连接/数据量。为未来 2-3 年做好规划,因为硬件升级需要大量时间。

  7. 进行负载测试,包括重载 - 了解您的极限。

并继续研究。

【讨论】:

  • 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
  • 嗯,这张新桌子听起来不错,再帮我一个忙,请给我一个例子或样品,我怎么做的。感谢您的帮助。
猜你喜欢
  • 2021-06-19
  • 1970-01-01
  • 1970-01-01
  • 2014-06-23
  • 2023-02-10
  • 2017-03-14
  • 2019-02-21
  • 1970-01-01
  • 2023-03-19
相关资源
最近更新 更多