4

对于一个简单的 Web 应用程序,主要要求是尽可能快地处理大约 30(10m * 3 个表)百万条记录。我以前没有处理过这么多的数据,所以想从有经验的人那里得到一些建议/建议。

该数据库将保存企业的详细信息。大约 25 个属性将描述一个业务;姓名、地址等。表结构如下。

CREATE TABLE IF NOT EXISTS `businesses` (
    `id` bigint(20) NOT NULL AUTO_INCREMENT,
    `type` int(2) NOT NULL,
    `organisation` varchar(40) NOT NULL,
    `title` varchar(12) NOT NULL,
    `given_name` varchar(40) NOT NULL,
    `other_name` varchar(40) NOT NULL,
    `family_name` varchar(40) NOT NULL,
    `suffix` varchar(5) NOT NULL,
    `reg_date` date NOT NULL,
    `main_trade_name` varchar(150) NOT NULL,
    `son_address_l1` varchar(50) NOT NULL,
    `son_address_l2` varchar(50) NOT NULL,
    `son_address_suburb` int(3) NOT NULL,
    `son_address_state` int(2) NOT NULL,
    `son_address_postcode` varchar(10) NOT NULL,
    `son_address_country` int(3) NOT NULL,
    `bus_address_l1` varchar(50) NOT NULL,
    `bus_address_l2` varchar(50) NOT NULL,
    `bus_address_suburb` int(3) NOT NULL,
    `bus_address_state` int(2) NOT NULL,
    `bus_address_postcode` varchar(10) NOT NULL,
    `bus_address_country` int(3) NOT NULL,
    `email` varchar(165) DEFAULT NULL,
    `phone` varchar(12) NOT NULL,
    `website` varchar(80) NOT NULL,
    `employee_size` int(4) NOT NULL,
    PRIMARY KEY (`id`),
    KEY `type` (`type`),
    KEY `phone` (`phone`),
    KEY `reg_date` (`reg_date`),
    KEY `son_address_state` (`son_address_state`),
    KEY `bus_address_state` (`bus_address_state`),
    KEY `son_address_country` (`son_address_country`),
    KEY `bus_address_country` (`bus_address_country`),
    FULLTEXT KEY `title` (`title`),
    FULLTEXT KEY `son_address_l1` (`son_address_l1`),
    FULLTEXT KEY `son_address_l2` (`son_address_l2`),
    FULLTEXT KEY `bus_address_l1` (`bus_address_l1`),
    FULLTEXT KEY `bus_address_l2` (`bus_address_l2`)
) ENGINE=MyISAM;

还会有 2 个像这样的其他表格,原因是每个业务详细信息将在 3 个来源中显示(用于比较目的)。只有一张表会写入。

关于应用程序的使用,

  1. 很少写入,大量读取。
  2. 10*300万的数据不会超时插入,会先插入。
  3. 应用程序不会有很多请求,每秒 <10 个请求。
  4. 初始数据加载后,用户将更新这些详细信息。将一个表的数据与其他 2 个表的数据进行比较并更新第一个表中的数据。
  5. 会有很多搜索,主要是通过姓名、地址、电话和州。单次搜索将遍历所有 3 个表。搜索需要快速。
  6. 计划使用 PHP 构建它

我的问题是,

  1. 在一个表中处理 3 个源而不是 3 个表是否值得?
  2. MySQL能提供一个好的解决方案吗?
  3. MongoDB 是否能够使用更少的硬件资源来处理相同的场景?
  4. 设置示例数据库进行测试的最佳方法是什么?我购买了一个 Amazon RDS(大)并插入了 10000 条记录并将它们翻倍,直到获得 1000 万条记录。
  5. 关于这个主题的任何好读物?

谢谢你。

4

1 回答 1

5

我无法回答您的直接问题,但我有处理大型数据集的经验。

我要解决的第一件事是大多数用例(在您的案例搜索中)操作将是什么,然后考虑基于此的数据存储/分区。

接下来是测量,测量,再测量。一些数据库系统将与一种操作一起工作,而另一些则与其他操作一起工作。随着数据量的增加和操作复杂性的增加,运行良好的事物可能会开始退化。这就是您测量的原因 - 如果没有充分证据证明您使用的数据库系统如何在这些负载下工作,请不要尝试设计它。

然后迭代地工作以添加更多操作。

不要试图设计一个最适合所有人的方案。随着您的设计和研究得到提炼,您将看到可能需要或可用优化的地方。您可能还会发现,正如我们过去所做的那样,不同类型的缓存和索引可能会在不同的时间出现。

祝你好运 - 听起来像是一个有趣的项目。

于 2012-04-13T02:44:47.363 回答