Mysql 如何使用Perl根据id使用不同的值更新每个DB记录?
我有一个散列,其中包含所有计算用户的考试成绩(在我的例子中,系统的用户是学生),其中Mysql 如何使用Perl根据id使用不同的值更新每个DB记录?,mysql,perl,dbi,Mysql,Perl,Dbi,我有一个散列,其中包含所有计算用户的考试成绩(在我的例子中,系统的用户是学生),其中user\u id是散列的键,成绩是相应的值。此散列包含50000多个元素。我想用这些计算出的分数更新数据库 我的第一次尝试 但是,如果我是对的,这将导致执行50000多个查询,这意味着访问数据库的次数将超过50000次(如果我假设的是错误的,请在下面的语句中更正我) 所以我写了第二次尝试 以下是我的问题: 这是本案的正确解决方案吗 很长的SQL语句会影响查询性能吗 Perl DBI和/或MySQL中的查询长
user\u id
是散列的键,成绩是相应的值。此散列包含50000多个元素。我想用这些计算出的分数更新数据库
我的第一次尝试
但是,如果我是对的,这将导致执行50000多个查询,这意味着访问数据库的次数将超过50000次(如果我假设的是错误的,请在下面的语句中更正我)
所以我写了第二次尝试
以下是我的问题:
你试过这两种方法吗 你的第一次尝试是正确的。这就是数据库的用途。您的第二个版本可能会慢得多。这取决于SQL引擎的优化方式,但无论您如何制定SQL,您的数据库仍需要进行50000次更新。您的第二次尝试迫使它做更多的工作来决定这些更新是什么 通过使用事务,您可以加快流程,并避免某些记录被更新而其他记录未被更新的可能性 在开始更新数据库之前,请调用
$dbh->begin_work
当它们全部完成时,你需要
$dbh->commit
这将创建一个表更改列表,最后在调用commit
方法时进行这些更改
无论如何,您都应该使用一个测试数据库,因此我建议您设置一个包含可管理数据量的数据库,它将相当快地给出您的结果。然后,您可以尝试这两种选择,以及您想到的任何其他选择,并确定它们的行为方式这可能会更快:
CREATE TEMPORARY TABLE `Updates` (
`user_id` ... NOT NULL,
`grade` ... NOT NULL
);
INSERT INTO `Updates` VALUES
( ..., ... ),
( ..., ... ),
...;
ALTER TABLE `Updates` ADD UNIQUE `user_id`;
UPDATE `User`
JOIN `Updates`
ON `User`.`user_id` = `Updates`.`user_id`
SET `User`.`grade` = `Updates`.`grade`;
很容易从一个问题中了解情况,并回答在相同情况下如何处理问题。这种方法忽略了堆栈溢出规则,回头看,这里似乎没有一个明确的问题。你的数字1和4是离题的,因为它们是基于观点的。2不可避免地是一个“是”,但可能不是你的意思。剩下3个,虽然限制取决于驱动程序,但MySQL似乎没有文档记录,可以放心地说,像您这样的3MB查询“太长”。
$dbh->begin_work
$dbh->commit
CREATE TEMPORARY TABLE `Updates` (
`user_id` ... NOT NULL,
`grade` ... NOT NULL
);
INSERT INTO `Updates` VALUES
( ..., ... ),
( ..., ... ),
...;
ALTER TABLE `Updates` ADD UNIQUE `user_id`;
UPDATE `User`
JOIN `Updates`
ON `User`.`user_id` = `Updates`.`user_id`
SET `User`.`grade` = `Updates`.`grade`;