添加抽象层,还是在单个表中工作?

时间:2011-07-19 17:30:12

标签: mysql database-design optimization

我正在编写一个cron脚本,它会定期遍历特定表中的行,解析文本,然后生成基于系统的标记,以便在其他操作中使用。

这个表格是我们网站的生命线,而且非常大 - 我想知道让cron脚本直接使用这个表是否更好,或者将要解析的文本虹吸到另一个表中,我的cron脚本可以安全地工作。

这是我的想法图表:

选项1:

Table 1: "blogs"
Table 2: "blog tags"

** cron script 'scrapes' the blogs table, marks each scraped blog to prevent duplicate scrapes, and then puts tags in the blog tags table

选项2

Table 1: "blogs"
Table 2: "blogs to be parsed"
Table 3: "blog tags"

** when blogs are posted, some of their text and metadata is also inserted into "blogs to be parsed", which is the only table the cron script will have to then deal with.

添加这样的抽象层是否有性能/安全优势?

2 个答案:

答案 0 :(得分:1)

只要您不希望插入的数据具有大量可变性,这可能是一个好主意。为了澄清,如果要解析的数据可以插入到“解析”表中而你可以忘记它,那就太好了;但是,如果您期望对数据进行大量编辑,那么在编辑主表时更新“待解析”表可能会非常麻烦,特别是因为您可能会从cron中锁定该表工作

更有意义的是让你的cron作业对基表进行基于数据的(最近的)复制,然后从那里进行解析。这样,只要查询所有最近的更新(并且可以通过更频繁地运行cron作业来最小化),您的cron作业只会锁定主表,然后将最近的更新复制到辅助表,你的cron作业可以独家访问,而不必担心争用。

答案 1 :(得分:1)

除非您担心脚本会不小心弄乱博客表中的数据,否则我认为额外的表没有任何好处。因为这是一个只读操作,所以你会遇到严重的错误。使用原始表也意味着您正在使用那里定义的索引,所以它应该很快。

您只是阅读行并设置标志。您的博客引擎使用相同的表格进行更多操作。

修改

如果您在更新表时担心标志,请解决该问题。创建一个包含博客外键的表,以及一些更新的表。现在,您不对cron作业中的博客表进行任何写入操作。读取不需要任何锁定。

但是,除非博客表每秒被击中数百次,否则更新速度很快,难以察觉。只要您使用innodb或支持行级锁定的存储引擎,您就可以了。

还要确保在流量较低的午夜进行更新