MySQL计算一个表中的选定行以更新另一个表中的值

时间:2015-01-23 21:43:45

标签: mysql

我创建了一个表("文本"表),用于存储扫描文档中的ocr文本。该表现在有100,000多条记录。它为文档中的每个页面存储单独的记录。我最初设置了这个表,所以它存储了文件'标题和它对每个记录的位置,这显然是糟糕的设计,因为信息被重复许多记录。我随后创建了一个单独的表,现在只为每个文档存储一条记录("文档"表)。原始表仍包含文档中每个页面的记录,但现在唯一的列是文档表中的ocr文本和文档记录的id。

文件表有一列" total_pages"。我正在尝试使用以下查询更新此值:

UPDATE documents SET total_pages=(SELECT Count(*) from texts where texts.docs_id=documents.id)

这似乎需要永远执行,我不得不在几次崩溃。文件表中有超过8000条记录。

我通过将查询限制为仅一个文档来测试查询

UPDATE documents SET total_pages=(SELECT Count(*) from texts where texts.docs_id=documents.id and documents.id=1)

这最终仅使用一条记录,但执行需要很长时间。我猜我的完整查询需要一些优化!非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

这是您的查询:

UPDATE documents
    SET total_pages = (SELECT Count(*)
                       from texts
                       where texts.docs_id = documents.id)

对于性能,您需要texts(docs_id)上的索引。这可能会解决您的性能问题。实际上,它可能使得不必将此值存储在主表中。

如果您决定存储计数,请确保将值保持最新。这通常需要一个触发器来处理插入和日期(如果doc_id更改,可能需要更新)。