处理大型数据集(数千万行)的工作技巧

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;

这将会有另外两个类似的表格,原因是每个业务细节都将在3个来源中呈现(用于比较)。只有一个表将具有写入功能。

关于应用程序使用:

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

我的问题是:

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

谢谢。


这个结构是确定的还是你可以修改/改进它? - mamadrood
可以进行修改。 - Sahan H.
1个回答

5
我无法直接回答你的问题,但我有处理大型数据集的经验。 首先,我会确定大多数情况下的使用场景(在你的情况下是搜索操作),然后考虑基于该场景的数据存储/分区。 接下来,请多次测量。一些数据库系统可能适用于一种操作,而其他数据库则适用于其他操作。随着数据量和操作复杂性的增加,一些有效的方法可能开始退化。这就是为什么要评估 - 不要尝试在没有好的证据支持的情况下进行设计,弄清楚你使用的数据库系统在这种负载下如何工作。 然后通过迭代添加更多操作。 不要试图设计一个适合所有情况的最佳设计。当你的设计和研究被梳理出来时,你会发现需要或可用的优化空间。正如我们之前所做的那样,你还可能发现需要在不同的时间使用不同类型的缓存和索引。 祝你好运 - 听起来是一个有趣的项目。

1
谢谢回复,我想我需要更多地处理一些样本数据集。 - Sahan H.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接