如何加快在 2500 万行上还包含 JOIN 的 SQL UPDATE
Posted
技术标签:
【中文标题】如何加快在 2500 万行上还包含 JOIN 的 SQL UPDATE【英文标题】:How do I speed up a SQL UPDATE that also contains a JOIN on 25 million rows 【发布时间】:2011-09-06 23:24:33 【问题描述】:我想加速的查询(或替换为另一个进程):
UPDATE en_pages, keywords
SET en_pages.keyword = keywords.keyword
WHERE en_pages.keyword_id = keywords.id
表 en_pages 具有正确的结构,但其中只有非唯一的 page_ids 和 keyword_ids。我正在尝试将实际的关键字(字符串)添加到与关键字 ID 匹配的此表中。表 en_pages 中有 2500 万行需要更新。
我正在添加关键字,以便可以实时查询这张表并返回关键字(连接显然对于“实时”来说太慢了)。
我们将此查询(以及其他一些查询)应用于我们更大数据集的子单元。我们经常这样做是为了为不同用户组的数据的特定子单元创建自定义界面(抱歉,如果这令人困惑)。
如果你给它一个小时的运行时间,这一切都很好,但我正在努力加快速度。
有没有更好的方法可以更快地使用 php 和/或 mysql?
【问题讨论】:
为什么要这么频繁地更新整个表? 什么是表引擎,你的硬件是什么,你的 MySQL 实例配置是什么等? 【参考方案1】:我实际上不认为你可以加快这个过程。
您仍然可以通过集群新服务器来为您的数据库添加强大的功能。
【讨论】:
【参考方案2】:也许我错了或误解了这个问题,但是... 你不能使用 TRIGGERS 吗? 比如...当在“en_pages”上检测到新的 INSERT 时,在同一行之后执行 UPDATE? (我不知道该表中 INSERTS 的频率如何) 这只是一个想法。 插入后“en_pages.keyword”和“en_pages.keyword_id”多久更改一次?!?!?
【讨论】:
【参考方案3】:我不了解 mySQL,但如果您在循环中一次处理有限数量的记录批次(例如 1000 个),通常这种事情在 SQL Server 中运行得更快。
您也可以考虑使用 where 子句(我不知道 mySQL 使用什么来表示“不等于”,所以我使用了 SQL Server 版本):
WHERE en_pages.keyword <> keywords.keyword
这样,您只更新在您要更新的字段中存在差异的记录,而不是所有记录。
【讨论】:
以上是关于如何加快在 2500 万行上还包含 JOIN 的 SQL UPDATE的主要内容,如果未能解决你的问题,请参考以下文章
如何正确索引具有 2500 万行的 SQL Server 表
具有 10+ 百万行的 MySQL 表 - 如何使用索引加快搜索速度?