【问题标题】:Optimal query - any way to avoid hundreds of queries in loop?最佳查询 - 有什么方法可以避免循环中的数百个查询?
【发布时间】:2023-03-22 03:42:01
【问题描述】:

我想每天保存一场比赛的前 100 个结果。

我有两个表:Users、Stats。

Users db 有两列:userID(mediumint(8) unsigned AUTO_INCREMENT) 和 userName(varchar(500))。

Stats db 有三列:time(date)、userID(mediumint(8) unsigned AUTO_INCREMENT)、result(tinyint(3 ) 未签名)。

现在,每次我(每天)执行查询时,我都会得到包含 100 个用户名结果的数组。所以这就是我需要做的:

对于数组中的每个结果:

  1. 从用户表中获取用户 ID - 或者如果用户中不存在用户 表而不是创建条目并获取 ID;
  2. 将当前日期、用户 ID 和结果插入到 Stats 表中。

在 php 和 mysql 中执行此操作的最佳方法是什么。有没有办法避免在“for”循环中有 200 个查询。

感谢你们的时间。

【问题讨论】:

  • 一天200个查询真的不算多……
  • 统计数据的“结果”列中有什么内容?

标签: php mysql optimization


【解决方案1】:
  1. 每天 200 次查询不算什么。您可以将所有内容保持原样,不会有任何问题。

  2. 为什么你有一个包含用户名的数组,而你应该有用户 ID?

  3. Mysql INSERT 查询支持多个VALUES 语句。所以,你可以组装一个像

    这样的字符串

    VALUES (time,userid,result),(time,userid,result),(time,userid,result)

并立即运行它。

另外请注意,userID 应该是 int,而不是 medium int,并且在 stats 表中它不应该是自动递增的。

【讨论】:

  • 感谢您的帮助,不幸的是,我必须处理用户名而不是用户 ID。
  • 没问题。只需重写您的代码。从那时起,就不再使用用户名来识别用户,而只使用用户 ID。只是因为用户可以重命名...
  • 好吧,我没有访问该代码的权限 :) 我只得到了 100 个用户名和职位的列表。否则会更容易。再次感谢您的帮助。
【解决方案2】:

使用一对prepared statements。您仍然会运行每个 100 次,但查询本身已经被解析(甚至被数据库服务器缓存),它只有 100 组不同的参数要运行,这是非常有效的。

【讨论】:

  • 解析后的查询被缓存。结果不是。
猜你喜欢
  • 1970-01-01
  • 2014-02-07
  • 1970-01-01
  • 1970-01-01
  • 2011-08-22
  • 1970-01-01
  • 1970-01-01
  • 2015-07-26
  • 2013-12-05
相关资源
最近更新 更多