【发布时间】:2017-01-28 08:28:35
【问题描述】:
我正在尝试管理一些互联网日志。我本质上是在捕捉哪些 IP 与其他 IP 联系并对其进行报告。
问题是有大量的喋喋不休,我不确定我是否可以让我的架构变得更好。
我的表架构:
CREATE TABLE `IpChatter` (
`Id` bigint(20) NOT NULL AUTO_INCREMENT,
`SourceIp` bigint(20) NULL,
`DestinationIp` bigint(20) NULL,
`SourcePort` int(11) NULL,
`DestinationPort` int(11) NULL,
`FKToSomeTableWithExtraMetaDataId` bigint(20) NOT NULL,
CONSTRAINT `PK_IpChatter` PRIMARY KEY (`Id` ASC)
) ENGINE=InnoDB;
CREATE INDEX `IX_IpChatter_FKToSomeTableWithExtraMetaDataId` ON `IpChatter` (`FKToSomeTableWithExtraMetaDataId`) using HASH;
CREATE INDEX `IX_IpChatter_Main_Query_SourceIp` ON `IpChatter` (`SourceIp`);
CREATE INDEX `IX_IpChatter_Main_Query_DestinationIp` ON `IpChatter` (`DestinationIp`);
CREATE INDEX `IX_IpChatter_Main_Query_SourcePort` ON `IpChatter` (`SourcePort`);
CREATE INDEX `IX_IpChatter_Main_Query_DestinationPort` ON `IpChatter` (`DestinationPort`);
ALTER TABLE `IpChatter` ADD CONSTRAINT `FK_IpChatter_FKToSomeTableWithExtraMetaData`
FOREIGN KEY (`FKToSomeTableWithExtraMetaDataId`) REFERENCES `FKToSomeTableWithExtraMetaData` (`Id`)
ON DELETE CASCADE;
现在我有 2mill 行数据并在大约 4 秒内拉回我需要的数据。然而,这是使用相对较轻的测试数据。我想在最终产品中数据的大小会大 30 倍。所以这 4 秒肯定意味着最终产品的 2 分钟。有没有更好的方法可以使这些数据正常化,或者我遇到瓶颈而我无能为力?另外,我选择的索引好吗?
【问题讨论】:
标签: mysql optimization schema normalization