MySQL分区还是像AWS DynamoDB这样的NoSQL?

MySQL分区还是像AWS DynamoDB这样的NoSQL?,mysql,amazon-web-services,nosql,amazon-dynamodb,database-partitioning,Mysql,Amazon Web Services,Nosql,Amazon Dynamodb,Database Partitioning,业务逻辑: 我的应用程序每隔几个小时就会抓取大量(数百个甚至数千个)网页,并将该网页上的所有链接(即所有锚定标签)存储在MySQL数据库表中,比如links。这个表格一天比一天大(到目前为止已经有大约2000万条记录) 技术: 我在链接表中的[网页id,链接]上有一个唯一的索引组合。另外,我在同一个表中有一列crawl\u count。 现在,每当我抓取一个网页时,我已经知道webpage\u id(webpages表的外键),并且我在该网页中获得链接(即link数组),我只需执行插入或更新查询

业务逻辑:

我的应用程序每隔几个小时就会抓取大量(数百个甚至数千个)网页,并将该网页上的所有链接(即所有锚定标签)存储在MySQL数据库表中,比如
links
。这个表格一天比一天大(到目前为止已经有大约2000万条记录)

技术:

我在
链接
表中的[
网页id
链接
]上有一个唯一的索引组合。另外,我在同一个表中有一列
crawl\u count
。 现在,每当我抓取一个网页时,我已经知道
webpage\u id
webpages
表的外键),并且我在该网页中获得链接(即
link
数组),我只需执行插入或更新查询,而不必担心表中已经存在什么

INSERT INTO ........ ON DUPLICATE KEY UPDATE crawl_count=crawl_count+1
问题:

桌子每天都在变大&我想优化桌子的性能。我考虑的选择是

  • 分区:按域对表进行分区。所有网页都属于特定的域。例如:网页属于该域
  • 像DynamoDB一样的NoSQL。我在MySQL DB中有其他应用程序表,除非绝对需要,否则我不想迁移到DynamoDB。此外,我还考虑了应用程序逻辑的变化(例如:将
    webpages
    表的结构更改为
并将此表迁移到DynamoDB,这样我就没有
链接
表了。但是,DynamoDB中的每个记录都有一个限制(400kb)。如果超过这个限制怎么办


我已经阅读了使用这两种方法的优缺点。就我的理解而言,DynamoDB似乎不适合我的情况。但是我仍然想发布这个问题,以便我能对这个场景做出一个好的决定。

按域分区
--不。不会有任何性能提升。无论如何,你会发现这一点e域名占据了榜首,无数域名只出现过一次。(我是根据经验说的。)

“数组”的唯一概念是一个单独的表。在您的情况下,它将有
webpage\u id
link
作为两列
主键(这是“唯一的”)

规范化。这是为了避免每个域和每个链接都有大量副本。这节省了一些空间

我假设你有两类链接——一类是你扫描过的页面的链接,另一类是等待扫描的页面的链接。这两类链接的大小可能相似。我不明白“爬网计数”的目的,但它增加了成本

我可以进一步建议是否可以看到查询——包括插入和选择。此外,表有多大(GB)以及innodb\u buffer\u pool\u size的值是多少?
?将这些放在一起,我们可以讨论可能出现的问题,如果缓慢的话

此外,慢语也会有所帮助

您正在处理非ascii URL吗?URL太长而无法索引?您是否将URL拆分为域+路径?是否删除“#…”?和“?…”

{webpage: "http://example.com/new-brands", links: [link1, link2, link3]}