我正在建立一个预测拨号,其中速度是至关重要的。为了拨打这个号码,我从表中提取客户信息,并为pbx构建呼叫文件以对其执行操作。
目前我对每个区号都有一个表,我们一次拨打一个区号,但我们正在切换到一个模型,在这种模型中,我们根据跨越多个邮政编码的地区进行拨号。某些区号存在于多个邮政编码中。每个表每月都会添加新号码,并通过与数百万个号码的请勿呼叫列表进行比较来清除这些号码。
所以我的问题是,我应该如何最有效地组织这些数据?
一个大的表似乎适得其反,因为我们讨论的是数百万条被擦除的数据。
我目前的想法是维护用于导入和清理的地区代码表,然后将清理后的记录复制到地区表中,这是通过在地区代码表中搜索该地区的邮政编码而创建的。
我目前通过一个auto_incremented INT主键、一个惟一的电话号码和一个跟踪已经被呼叫或在do-not-call列表中的号码的状态来索引这些表。在构建呼叫文件时,我将记录标记为已排队,然后根据呼叫完成后的执行情况对其进行标记,因此对于每个呼叫,都会进行一次搜索和两次更新。
搜索在区域代码表中查找特定的状态。根据记录ID进行更新。
问题的核心是:是按邮政编码组织和按状态搜索更快,还是按区域代码组织和按状态和邮政编码搜索更快?或者更好的办法是在我们每次建立一个地区代码表的时候创建一个新的表?
如果这看起来像是一个愚蠢的问题,请原谅,我一直在自学SQL,因为我一直在构建这个SQL,数据库设计和性能的细微差别有点超出了我的技能范围。
表的总大小为200万行,而且还在不断增长。
发布于 2012-05-01 01:54:06
问题的核心是:是按邮政编码组织和按状态搜索更快,还是按区域代码组织和按状态和邮政编码搜索更快?或者更好的办法是在我们每次建立一个地区代码表的时候创建一个新的表?
回答:除非您真的知道自己在做什么,否则不要执行这些操作。相反,创建一个表来保存该实体的所有行,并使用列值来区分不同的邮政编码和地区。可能会创建zipcodes和territory表,并添加引用它们的外键。
基于属性值创建单独的表不是一个典型的解决方案,而且会带来许多额外的困难(例如,如果按邮政编码组织表,如何按地区搜索所有邮政编码?)
更常见的解决方案是使用索引,这也是数据库擅长的解决方案。使用多个索引,数据库可以提供对表的快速访问,以便在多个不同的列上进行搜索。
所以我推荐的基本策略是:
如果选择和插入还不够好,请考虑添加更多的索引,改进现有索引的使用(读取聚集索引和覆盖索引),或者选择性插入( selective denormalization
explain denormalization的速度
同样重要的是要注意,两百万行对于MySQL来说并不是一个很大的数量(当然,这取决于负载)。归根结底,优化是一个非常棘手的主题,它的答案取决于您的具体情况。
发布于 2012-05-02 22:09:17
如果你想要速度,那么标准化数据并不是你想要的。当数据增长时,速度性能会降低。
这种情况下的性能将与硬盘的速度联系在一起,ssd可能会大大提高性能,但您会遇到空间问题,而且成本会更高
折衷方法是使用旋转磁盘而不对数据进行标准化。为用于执行搜索的字段编制索引。
其他策略(更聪明)可以对数据使用整数代码,这些代码可以在数据集上重复,并使用memcache中的邮政编码、城市等的实际值(邮政编码、国家名称、城市是不可变的数据),但这种方法会给问题增加新的依赖性。
我有一个有2.5亿行的表格,这个信息用国家和城市、邮政编码和ISP来标记。我有ssd来存储主数据,地理数据存储到memcached中,当我需要做一些搜索时,我有一个逻辑层来做查找和转换到数据库中的代码。
发布于 2012-04-28 12:59:42
TaoNonnanes,不需要每次都为area code table创建territory表。
用area code table的外键只创建了一个地区表,只为地区和地区代码表建立了索引,并尝试规范化整个数据库,至少到3NF。我不知道你的整个数据库规范化是什么。
https://stackoverflow.com/questions/10319311
复制相似问题