Php 多次从一个相当大的表中提取数据的速度很慢

Php 多次从一个相当大的表中提取数据的速度很慢,php,mysql,database,foreach,Php,Mysql,Database,Foreach,我目前在我的网站上提供了一个免费的考试功能,每个用户都可以参加其中一个考试,看看他们的高分或者其他什么 我有一个foreach,通过每次测试和检查,看看每个学生的最高分数是多少。保存已保存测试的表正在向15000行数据推进 以下是我的大致情况: foreach(testList as $test){ SELECT saved_grade FROM system_saved WHERE account_id = {{account_id}} AND test_id = {{t

我目前在我的网站上提供了一个免费的考试功能,每个用户都可以参加其中一个考试,看看他们的高分或者其他什么

我有一个foreach,通过每次测试和检查,看看每个学生的最高分数是多少。保存已保存测试的表正在向15000行数据推进

以下是我的大致情况:

foreach(testList as $test){

   SELECT saved_grade FROM system_saved 
   WHERE account_id = {{account_id}}
   AND test_id = {{test_id}}
   Order By saved_grade DESC
   LIMIT 0, 1

}
它要求每次测试都必须扫描整个表格,以便每次都能找到最高分数

  • 是否有更好的方法为用户获得最高分数
  • 索引表格会有帮助吗(我真的不明白这一点+ 每天都有新数据输入,我不确定索引是否正确 相关的)
  • 有没有其他方法可以帮助您加快速度?(It) 当前加载大约需要20秒)

    • 您不需要单独选择每个测试。假设account_id对于进行测试的每个人都是唯一的,并且保存的_等级不是字符串,那么您应该能够做到这一点

      SELECT MAX(saved_grade) 
      FROM system_saved 
      WHERE account_id = {{account_id}}
      AND test_id = {{test_id}}
      

      不要兜圈子;使用一个查询。这将检索每个学生的最佳成绩,按学生排序,然后按测试排序

      SELECT account_id, test_id, MAX(saved_grade) as `best_grade`
      FROM system_saved
      GROUP BY account_id DESC, test_id DESC
      
      要在该学生的任何测试中获得最佳分数,请使用以下选项:

      SELECT account_id, MAX(saved_grade) as `best_grade`
      FROM system_saved
      GROUP BY account_id DESC
      
      编辑:如果您想知道他们获得最高分数的考试,您可以这样做:

      SELECT account_id, test_id, saved_grade
      FROM system_saved WHERE (account_id, saved_grade) IN (
          SELECT account_id, MAX(saved_grade) as `best_grade`
          FROM system_saved
          GROUP BY account_id DESC)
      
      您可能应该使用max():


      您正在寻找的解决方案是分组方式和聚集功能:

      SELECT account_id, test_id, max( saved_grade ) as highest_grade
      FROM system_saved 
      GROUP BY account_id, test_id
      

      还可以为
      (帐户id、测试id、已保存等级)
      创建索引,以获得比未编制索引的数据更好的性能。

      索引的目的是让您请求的数据能够更快速、更高效地被选择,因此几乎可以肯定这一点很重要-每当向表中添加新数据时,所有相关索引都会被更新,所以它将保持最新不要忘记他们可能会想知道他们在哪一次考试中得分最高!
      SELECT account_id, test_id, max( saved_grade ) as highest_grade
      FROM system_saved 
      GROUP BY account_id, test_id