[英]MySQL and performance
我相当频繁地在MySQPL表上进行50,000+次更新。 我这样尝试过:
UPDATE data SET p=p+(13) where c=2 and g=12
UPDATE data SET p=p+(17) where c=3 and g=41
UPDATE data SET p=p+(-12) where c=6 and g=19
UPDATE data SET p=p+(-4) where c=8 and g=12
...
您可能会想到,这需要一段时间。 我大约在45秒内进行测量。 因此,我尝试创建一个临时表,以便可以在更少的查询中完成相同的工作。 看起来像这样:
CRATE TEMPORARY TABLE changes(
id INT AUTO_INCREMENT,
g INT,
c INT,
delta_p INT,
PRIMARY KEY (id)
)
INSERT INTO changes(g,c,delta_p) VALUES (12,2,13),(41,3,17),(19,6,-12),(12,8,-4)...
UPDATE p INNER JOIN changes AS c ON p.c=c.c AND p.g=c.g SET p.p=p.p+c.delta_p
DROP TABLE changes
一开始我喜欢这种解决方案是因为我假设减少查询几乎总是会更快。 我认为将50,000个查询减少到4个会有所作为。 但是,我观察到的是它慢了大约10倍。 我在500秒时测量了第二种方法。
我真的很想知道如何加快速度,但是我的问题是:为什么第二种方法这么慢? 谁能给我一些为什么我看到这种行为的见解?
您需要在changes
表上建立索引:
create index changes_c_g on changes(c, g);
这将大大加快join
速度。 覆盖指数将提供更多帮助:
create index changes_c_g_deltap on changes(c, g, delta_p);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.