我需要在MySql表上一次一次在UPDATE查询下面运行〜500次。我想知道这两个中哪一个会有更好的性能?
UPDATE 'latency_table' SET 'is_active' = null WHERE rule_id = 1;
UPDATE 'latency_table' SET 'is_active' = null where rule_id in (1...500);
在#1中,我访问表约500次,但在#2中,我访问表一次,但仍访问行500次。 #2是更高效的解决方案吗?
答案 0 :(得分:2)
在第一个解决方案中,您通过网络从客户端到数据库来回移动-发出更新语句,结果返回给客户端,发出另一个语句,依此类推。
在第二种解决方案中,您将所有内容发送到数据库一次,让它完成其工作,然后才得到响应。那肯定是更好的方法。
答案 1 :(得分:2)
发送给DBMS的每条语句都必须进行解析。因此,您将SQL发送给DBMS,DBMS会说:“啊,更新。哪个表?latency_table。哪些行?行ID 1.让我们考虑如何快速到达那里……我有索引吗?是的,所以对于一行,使用它是有意义的。要更新哪些列以及使用哪些值?列is_active和null。好吧,让我们这样做。”
对于单个语句,您执行大约500次。对于第二次只是一次。
然后您从 somewhere 中触发该语句。因此,必须在某处与DBMS交谈:“嘿,我有一个要给您的声明”。 -“谢谢,我已经检查过了。看起来还可以。” -“好的,请执行它。” -“完成。您的更新影响了500行。”无论使用哪种应用程序,都会发生这种情况,即使这是某些数据库工具(如phpmyadmin)也是如此。这称为往返。您发送的每条陈述都会发生这种小谈话。
最后,使用单个语句您不会给DBMS任何优化的机会。假设您要更新500行或600行。这几乎是所有行。如果发送单个更新,则DBMS将搜索该记录。如果有索引,它将通过二进制搜索快速找到它(查看#300行。较小?查看150行。较大?查看225行...)否则,它必须读取整个表。对于每一个陈述。 500次如果仅发送一条500行的语句,DBMS肯定会注意到,遍历每个规则ID的索引很麻烦,而宁愿只按顺序读取一次表并完成。
也许DBMS甚至可以并行执行您的语句。四个CPU核心?这样,每个CPU内核可能会同时处理大约150条记录。
因此:在一个更新语句中执行此操作的原因很多。毕竟,这就是SQL的全部意义。不必担心DBMS如何解决该问题。告诉它要做什么(更新这500行)而不是要怎么做(一个一行)。它甚至可能决定执行500行,就好像您已经发送了500条单条语句,并且由于只解析一次并且往返次数少得多而仍然要快得多。
答案 2 :(得分:0)
所有事物都取决于您的硬件,您必须运行500次命令,然后才能执行此命令,否则是否会在计算机中造成高负载,但是如果您希望尽快运行命令,第二条命令可能会对您有所帮助,但是我如果您想管理机器资源,则有自己的建议,您必须在运行命令时进行监视,并且可以编写Shell脚本来管理资源和脚本的“睡眠”时间。