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语句会影响查询性能吗

  • Perl DBI和/或MySQL中的查询长度有限制吗

  • 还有更优雅的解决方案吗?我是否缺少内置功能 例如,我可以使用哪个

  • 顺便说一句,如果答案取决于以下信息,以下是我的系统完整性规范:


    你试过这两种方法吗

    你的第一次尝试是正确的。这就是数据库的用途。您的第二个版本可能会慢得多。这取决于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`;