我们正在两个数据库表之间进行更新查询,而且速度非常慢。如:执行查询需要 30天。
一个表lab.list 包含大约940,000 条记录,另一个表mind.list 大约3,700,000(370 万)条当满足两个BETWEEN 条件时更新设置一个字段。这是查询:
UPDATE lab.list L , mind.list M SET L.locId = M.locId WHERE L.longip BETWEEN M.startIpNum AND M.endIpNum AND L.date BETWEEN "20100301" AND "20100401" AND L.locId = 0
就像现在一样,查询执行时大约每 8 秒更新 1 次。
我们还在同一个数据库中使用 mind.list 表进行了尝试,但这对于查询时间无关紧要。
UPDATE lab.list L, lab.mind M SET L.locId = M.locId WHERE longip BETWEEN M.startIpNum AND M.endIpNum AND date BETWEEN "20100301" AND "20100401" AND L.locId = 0;
有没有办法加快这个查询?基本上恕我直言,它应该创建两个数据库子集:mind.list.longip BETWEEN M.startIpNum AND M.endIpNum lab.list.date BETWEEN "20100301" AND "20100401"
然后更新这些子集的值。在某个地方,我认为我犯了一个错误,但在哪里?也许有更快的查询可能?
我们尝试了 log_slow_queries,但这表明它确实检查了数百万行,可能一直上升到 3331 gigarows。
技术资料:
- 服务器版本:5.5.22-0ubuntu1-log (Ubuntu)
- lab.list 在 locId、longip、date 上有索引
- lab.mind 在 locId、startIpNum 和 M.endIpNum 上有索引
- 硬件:2x xeon 3.4 GHz、4GB RAM、128 GB SSD(所以这应该不是问题!)