php - 运行查询超时
问题描述
我必须插入大约 75000 个要从另一个表计算中检索的数据。我已经尝试了以下代码。
$start = new DateTime('2018-09-01');
$end = new DateTime('2018-12-31');
$interval = DateInterval::createFromDateString('1 month');
$period = new DatePeriod($start, $interval, $end);
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
foreach ($period as $dt) {
$inputyear = $dt->format("Y");
$inputmonth = $dt->format("m");
Sql = " insert into tbl1()select from ... "
//HERE I JOIN 3 tables
$result = $conn->query($sql);
}
$conn->close();
它给了我超时错误。我也尝试将 wamp 超时时间增加到 300,但它没有用。如何优化上面的代码?
解决方案
您应该避免在循环中使用查询。我建议使用一个查询来一次获取所有数据并在 PHP 端解析。
我还建议检查索引。不使用索引时,多个连接非常繁重。见https://dev.mysql.com/doc/refman/8.0/en/explain.html
如果您需要在运行时访问这些数据,请考虑对表结构进行非规范化的能力。
推荐阅读
- excel - xFiledlg As FileDialog 不工作有解决方法吗?
- jquery - 当我在popperjs上单击外部时如何关闭弹出窗口?
- c# - Blazor 服务器端组件中的@attribute [AllowAnonymous] 无效
- json - JSONpath通过过滤另一个值来获取一个值
- javascript - 页面重新加载时使用节点 js 动态更改数据库中的内容
- node.js - 在 nodejs 中的 AWS Lambda 函数之间共享模型的最佳实践是什么?
- kubernetes - Kubernetes HPA 和缩减
- c++ - 如何将带有 SPL 的 STM32F3 代码移植到 STM32F7
- java - Java正则表达式过滤以模式开头并在第一次出现后结束的字符串
- java - 了解 Java 的可变参数