2012-04-25 67 views
1

我正在建立一个速度至关重要的预测拨号程序。要拨打号码,我从表中提取客户信息并为pbx构建呼叫文件以执行操作。组织和优化大型表格

目前,我有每个地区代码表,我们在一个时间拨一个区号,但我们切换到一个模型,其中我们拨打此基础上跨越多个邮政编码地区。一些区号存在于多个邮政编码中。每张表格都有每月新增的数字,并通过与数百万个数字的拒收表格进行比较来清除。

所以我的问题是,我应该如何最有效地组织这些数据?

一个大表,似乎适得其反,因为我们正在谈论数百万擦除数据的记录。

我目前的推理线是维护用于导入和清理的区域码表,然后将清理过的记录复制到区域表格中,这是通过在区域代码表中搜索该区域中的邮政编码创建的。

我目前通过auto_incremented INT主键,唯一的电话号码和跟踪已经被呼叫的号码或处于拒收电话簿列表中的状态来索引这些表。在建立呼叫文件时,我将记录标记为排队,然后根据呼叫完成后的方式标记它,因此每次呼叫都会有一个搜索和两个更新。

搜索在地区代码表中查找特定状态。更新基于记录标识进行。

问题的肉是这样的:难道是更快的邮政编码来组织和状态查询,或让他们按区号主办,状态和邮政编码搜索?或者每次我们建立一个由地区代码表构建的地区时,最好是创建一个新表格?

原谅我,如果这似乎是一个愚蠢的问题,我一直在自学SQL,因为我一直在建设这个和数据库设计和性能的细微差别都有点超出了我的技能。

的表的总大小是200万行和生长。

+1

200万行,为清晰起见编辑 – TaoJoannes 2012-04-27 17:03:21

+0

对于2百万行,加入将会很慢,例如,当通过区号查找区域代码时,区域代码比较少(我假设您将通过不称呼标志进行过滤,也许可能按顺序排列)。 – 2012-05-01 23:44:29

+0

一张大桌子可能是您的特定场景的好主意。在我自己的测试中,具有快速固态硬盘的优质服务器/台式机应该会给你带来好的结果。 – 2012-05-01 23:45:43

回答

2

问题的症结在于:通过邮政编码进行组织并按状态进行搜索,或按地区代码组织并按状态和邮政编码进行搜索会更快吗?或者每次我们建立一个由地区代码表构建的地区时,最好是创建一个新表格?

答:除非你真的知道你在做什么,否则不要做任何这些。而是创建一个表来保存此实体的所有行,并使用列值区分各个邮政编码和区域。可能创建zipcodesterritory表,并添加引用它们的外键。

创建单独的表基于属性值不是一个典型的解决方案,并会提出很多额外的困难(例如,如果你想组织成邮编表,你怎么通过境内所有邮政编码搜索?)

更常见的解决方案和数据库擅长的解决方案是使用索引。使用多个索引,数据库可以快速访问表,以便在多个不同的列上进行搜索。

所以基本策略,我会建议:

  1. 创建一个逻辑数据模型
  2. 实现物理数据模型
  3. 分析性能
    • explain <query>是非常方便的
    • ,如果它是不够好,查看添加更多索引,改进现有索引的使用(阅读聚集索引和覆盖索引)或选择性非规范化
    • 选择和插入之间的平衡是什么?索引可以减缓插入

同样重要的是,两个万行不是为MySQL数额巨大(尽管当然,这取决于负载)。底线是优化是一个非常棘手的问题,其答案取决于您的具体情况。

+0

这个用法是我想创建单独的广告系列表的原因。 我们对每个基于地区的广告系列使用不同的出站号码,并且不希望两次拨打同一号码的任何人。因此,我认为从大量清理数字中提取基于广告系列的表格是追踪此问题的最佳方式,因此我们可以告诉我们代表每个广告系列调用了哪些数字。原来的桌子就是一个数字农场。我们为它添加新的数字,并为DNC号码进行擦洗。我诚实地想不出一种有效的方式来跟踪我们为谁调用了哪些数据。 – TaoJoannes 2012-05-01 16:55:02

+0

@TaoJoannes“运动”是什么意思? – 2012-05-02 12:57:29

+0

@TaoJoannes我不认为你的情况有任何异常。这就是为什么我建议你创建并实现逻辑数据模型,然后进行性能测试,然后在必要时进行优化。否则,我认为你可能会陷入一个非常困难的地方。 – 2012-05-02 13:03:26

0

TaoNonnanes,没有必要每次创建territory表格area code table

只是做只有一个领土表的area code table外键,很快让境内和地区代码表中的索引,并试图规范整个数据库至少到3NF。我不知道你的整个数据库规范化是什么。

1

如果你想要速度,规范化的数据是不是你想要的。数据增长时速度性能会降低。

在这种情况下,性能将会领带硬盘的速度,SSD可以提升性能提升不少,但你将有空间的问题,并

权衡可以使用旋转磁盘更贵而不是规范化数据。索引您用于执行搜索的字段。

其他策略(更聪明)可以使用整数代码数据,可以在数据集上重复使用,并使用memcache中的邮政编码,城市等的实际值(邮政编码,国家名称,城市数据不可变),但是这种方法增加了新问题的依赖性。

我有一张2.5亿行的表,这个信息标有国家和城市,邮政编码和ISP。我有ssd的主要数据存储和地理数据存储到memcached中,当我需要做一些搜索时,我有一个逻辑层做查找,并在数据库中的代码翻译。