- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我创建了一个脚本来监控多个传感器值,从 MySQL 数据库中读取它们,对它们进行一些计算,然后显示数据/绘制图表。该脚本按设计工作,但执行速度非常慢(平均 60 多秒)。
数据库表由大约 50 万条记录组成,每 5 分钟添加 20 条记录。所以要么是我的代码效率很低,要么是大表是原因。但是,我看不出如何改进代码分配,因此欢迎提供任何帮助。我没有包含图形类代码,因为删除图形对脚本执行时间没有任何影响。
下面我粘贴了代码以供审查。提前感谢您提供任何提示!
索引.php
<html>
</head>
<style>
form
{
float:left;
}
p {
font-family: Verdana;
font-size: 12;
border: 0;
}
<?php
require_once('template.css');
?>
</style>
</head>
<body>
<?php
//Connect to MySQL DB
require_once('config.inc.php');
require_once('functions.inc.php');
$mysqli = new MySQLi("$dbhost", "$dbuser", "$dbpass", "$db");
require_once ('F:\wamp\www\winlog\phpgraphlib\phpgraphlib.php');
//interval selection forms
echo "<table><tr><td><p><b>Energieverbruik Volta in KW.</b><br>Kies Interval: </p>";
echo "<form name=\"interval\" action=\"\" method=\"post\"><input type=\"hidden\" name=\"interval\" value=\"300\"><input type=\"submit\" value=\"5 Min\"></form>";
echo "<form name=\"interval\" action=\"\" method=\"post\"><input type=\"hidden\" name=\"interval\" value=\"3600\"><input type=\"submit\" value=\"1 Uur\"></form>";
echo "<form name=\"interval\" action=\"\" method=\"post\"><input type=\"hidden\" name=\"interval\" value=\"86400\"><input type=\"submit\" value=\"24 Uur\"></form>";
echo "<form name=\"interval\" action=\"\" method=\"post\"><input type=\"hidden\" name=\"interval\" value=\"604800\"><input type=\"submit\" value=\"1 Week\"></form>";
echo "<form name=\"interval\" action=\"\" method=\"post\"><input type=\"hidden\" name=\"interval\" value=\"2419200\"><input type=\"submit\" value=\"1 Maand\"></form>";
echo "</td></tr></table>";
// $needles[] = "9679"; //Meeting Totaal
// $needles[] = "9680"; //Voeding A-FEED
// $needles[] = "9839"; //Voeding B-FEED
// $needles[] = "9840"; //Koeling
// $needles[] = "9841"; //INPUT UPS1
// $needles[] = "9843"; //VOEDING SDB ALG
// $needles[] = "9844"; //VERDEELKAST V01.UDB
$sensors = GetSensorIDs("1");
//Set interval from form of standard if not set
if(!isset($_POST['interval'])){
$interval = 86400;
$max = 1200;
}
else{
$interval = $_POST['interval'];
}
if($interval == 3600){
$max = 50;
}
if($interval == 86400){
$max = 1200;
}
if($interval == 604800){
$max = 7500;
}
if($interval == 300){
$max = 5;
}
//get timestamps for selected interval
$timestamps = GetTimestamps($interval);
echo "<table class=CSSTableGenerator>";
echo "<tr>";
echo "<td>Datum:</td>";
foreach($timestamps as $timestamp){
echo "<td><center>" . date("d/m/Y", $timestamp) . "<br>" . date("H:i", $timestamp) . "</center></td>";
}
echo "</tr>";
foreach($sensors as $sensor){
echo "<tr>";
$data = GetDataForSensor($sensor, $timestamps, "1");
$i = 0;
$old = 0;
foreach($data as $datapoint){
echo "<td align=\"right\">";
if($interval >= 86400){
$graph_timestamp = date("d/m",$datapoint['timestamp']);
}
else{
$graph_timestamp = date("d/m h:i",$datapoint['timestamp']);
}
if(!isset($old)){
$old = 0;
}
$new = $datapoint['value'];
$usage = $old - $new;
if($i != 0){
if($interval == 604800){
echo "<font color=\"gray\">" . round($old, 2) . "</font><br>";
}
echo round($usage, 2);
${"graphline".$sensor}[$graph_timestamp] = intval(round($usage, 2));
}
else{
echo GetSensorName($sensor);
}
$old = $new;
echo "</td>";
++$i;
}
echo "</tr>";
}
//PUE
echo "<tr>";
$i = 0;
foreach($timestamps as $timestamp){
if(!isset($total_old)){
$total_old = 0;
}
if(!isset($a_old)){
$a_old = 0;
}
if(!isset($b_old)){
$b_old = 0;
}
$PUEvars = GetDataForTimeStamp($timestamp, "1");
$PUE = ($PUEvars['9679'] - $total_old) / (($PUEvars['9680'] - $a_old) + ($PUEvars['9839'] - $b_old));
echo "<td><br><br>";
if($i != 0){
echo "<b>" . round($PUE, 3) . "</b>";
//pass data to array for graph
if($interval >= 86400){
$date = date("d/m",$timestamp);
}
else{
$date = date("d/m H:i",$timestamp);
}
$graph2_data[$date] = round($PUE, 2);
}
else{
echo "<b>PUE</b>";
}
echo "</td>";
$total_old = $PUEvars['9679'];
$a_old = $PUEvars['9680'];
$b_old = $PUEvars['9839'];
++$i;
}
echo "</tr>";
echo "</table>";
echo "Legende:<br>Meting Totaal: <font color=\"red\">ROOD</font><br>INPUT UPS1: <font color=\"green\">GROEN</font><br>A-FEED: <font color=\"blue\">BLAUW</font><br>B-FEED: <font color=\"purple\">PAARS</font><br>KOELING: <font color=\"aqua\">AQUA</font><br>";
//graphcolors black, silver, gray, white, maroon, red, purple, fuscia, green, lime, olive, navy, blue, aqua, teal
$graph = new PHPGraphLib(900,300,"img.png");
$graph->addData($graphline9679, $graphline9680, $graphline9839, $graphline9840, $graphline9841);
$graph->setTitle('Power in KWh');
$graph->setBars(false);
$graph->setLine(true);
$graph->setLineColor('red', 'blue', 'purple', 'aqua', 'teal');
$graph->setDataPoints(false);
$graph->setDataPointColor('maroon');
// $graph->setDataValues(true);
// $graph->setDataValueColor('maroon');
// $graph->setGoalLine(1.3);
$graph->setRange($max,0);
$graph->setGoalLineColor('red');
$graph->createGraph();
$unimg = time();
echo "<img src=\"img.png?$unimg\">";
$graph2 = new PHPGraphLib(900,300,"img2.png");
$graph2->addData($graph2_data);
$graph2->setTitle('PUE');
$graph2->setBars(false);
$graph2->setLine(true);
$graph2->setDataPoints(true);
$graph2->setDataPointColor('maroon');
$graph2->setDataValues(true);
$graph2->setDataValueColor('maroon');
$graph2->setGoalLine(1.3);
$graph2->setRange(2,1);
$graph2->setGoalLineColor('red');
$graph2->createGraph();
$unimg = time();
echo "<img src=\"img2.png?$unimg\">";
?>
</body>
</html>
函数.inc.php
<?php
function GetSensorName($sensor_id){
global $mysqli;
if($stmt1 = $mysqli->prepare("SELECT sensor_name FROM winlog_sensors WHERE sensor_id = ? ")){
$stmt1->bind_param("i", $sensor_id);
mysqli_stmt_execute($stmt1);
mysqli_stmt_store_result($stmt1);
mysqli_stmt_bind_result($stmt1, $sensor_name);
while (mysqli_stmt_fetch($stmt1)) {
$sensor_name = $sensor_name;
}
}
return $sensor_name;
}
function GetSensorIDs($category){
global $mysqli;
$sensors = array();
if($stmt1 = $mysqli->prepare("SELECT sensor_id FROM winlog_sensors WHERE category_id = ? ")){
$stmt1->bind_param("i", $category);
mysqli_stmt_execute($stmt1);
mysqli_stmt_store_result($stmt1);
mysqli_stmt_bind_result($stmt1, $sensor_id);
while (mysqli_stmt_fetch($stmt1)) {
$sensors[] = $sensor_id;
}
}
return $sensors;
}
function GetTimestamps($interval){
global $mysqli;
$timestamps = array();
if($interval == 604800){
if(date("w") == 5 AND date("H") >= 12){
$latest = intval(strtotime("today 12:00"));
}
else{
$latest = intval(strtotime("last friday 12:00"));
}
}
else{
$latest = intval(GetLatestTimestamp());
}
$timestamps[] = $latest;
$i = 0;
$n = 1;
while($i < 24 AND $n < 50){
$deduct = intval($interval) * $n;
$q_timestamp = $latest - $deduct;
//Get calculated timestamp from DC
if($stmt1 = $mysqli->prepare("SELECT DISTINCT timestamp FROM winlog_data WHERE timestamp = ? LIMIT 1")){
$stmt1->bind_param("i", $q_timestamp);
mysqli_stmt_execute($stmt1);
mysqli_stmt_store_result($stmt1);
mysqli_stmt_bind_result($stmt1, $db_timestamp);
$exists = 0;
while (mysqli_stmt_fetch($stmt1)) {
$timestamps[] = intval($db_timestamp);
$exists = 1;
++$i;
}
//if it does not exist, take the previous one
if($exists == 0){
if($stmt1 = $mysqli->prepare("SELECT DISTINCT timestamp FROM winlog_data WHERE timestamp < ? ORDER BY timestamp DESC LIMIT 1")){
$stmt1->bind_param("i", $q_timestamp);
mysqli_stmt_execute($stmt1);
mysqli_stmt_store_result($stmt1);
mysqli_stmt_bind_result($stmt1, $db_timestamp);
$exists = 0;
while (mysqli_stmt_fetch($stmt1)) {
$timestamps[] = intval($db_timestamp);
++$i;
}
}
}
}
++$n;
}
return $timestamps;
}
function GetLatestTimestamp(){
global $mysqli;
$timestamps = array();
if($stmt1 = $mysqli->prepare("SELECT DISTINCT timestamp FROM winlog_data ORDER BY timestamp DESC LIMIT 1")){
mysqli_stmt_execute($stmt1);
mysqli_stmt_store_result($stmt1);
mysqli_stmt_bind_result($stmt1, $timestamp);
while (mysqli_stmt_fetch($stmt1)) {
$timestamp = $timestamp;
}
}
return $timestamp;
}
function GetPreviousTimestamp($timestamp){
global $mysqli;
$timestamps = array();
if($stmt1 = $mysqli->prepare("SELECT DISTINCT timestamp FROM winlog_data WHERE timestamp < ? ORDER BY timestamp DESC LIMIT 1")){
$stmt1->bind_param("i", $timestamp);
mysqli_stmt_execute($stmt1);
mysqli_stmt_store_result($stmt1);
mysqli_stmt_bind_result($stmt1, $prev_timestamp);
while (mysqli_stmt_fetch($stmt1)) {
$prev_timestamp = $prev_timestamp;
}
}
return $prev_timestamp;
}
function GetDataForTimeStamp($timestamp, $category){
global $mysqli;
$data = array();
$exists = 0;
$start_ts = $timestamp;
$stop_ts = $timestamp +1;
if($stmt2 = $mysqli->prepare("SELECT wd.value, wd.sensor_id FROM winlog_data wd, winlog_sensors ws WHERE ws.sensor_id = wd.sensor_id AND wd.timestamp >= ? AND wd.timestamp <= ? AND ws.category_id = ? ")){
$stmt2->bind_param("iii", $start_ts, $stop_ts, $category);
mysqli_stmt_execute($stmt2);
mysqli_stmt_store_result($stmt2);
mysqli_stmt_bind_result($stmt2, $value, $sensor_id);
while (mysqli_stmt_fetch($stmt2)) {
$data[$sensor_id] = $value;
$exists = 1;
$data['timestamp'] = $timestamp;
}
}
return $data;
}
function GetDataForSensor($sensor_id, $timestamps, $category){
global $mysqli;
$data = array();
$i = 0;
$highest = 0;
foreach($timestamps as $q_timestamp){
if(!isset($lowest)){
$lowest = $q_timestamp;
}
if($q_timestamp > $highest){
$highest = $q_timestamp;
}
if($q_timestamp < $lowest){
$lowest = $q_timestamp;
}
}
if($stmt2 = $mysqli->prepare("SELECT DISTINCT wd.value, wd.timestamp FROM winlog_data wd, winlog_sensors ws WHERE wd.sensor_id = ? AND wd.timestamp >= ? AND wd.timestamp <= ? AND ws.category_id = ? ORDER BY wd.timestamp DESC")){
$stmt2->bind_param("iiii", $sensor_id, $lowest, $highest, $category);
mysqli_stmt_execute($stmt2);
mysqli_stmt_store_result($stmt2);
mysqli_stmt_bind_result($stmt2, $value, $timestamp);
while (mysqli_stmt_fetch($stmt2)) {
foreach($timestamps as $q_timestamp){
if($q_timestamp == $timestamp){
$data[$i]['value'] = $value;
$data[$i]['timestamp'] = $q_timestamp;
}
}
++$i;
}
}
return $data;
}
?>
最佳答案
使用Indexes
索引用于快速查找具有特定列值的行。如果没有索引,MySQL 必须从第一行开始,然后通读整个表以找到相关行。 table 越大,成本就越高。如果表有相关列的索引,MySQL 可以快速确定要在数据文件中间查找的位置,而无需查看所有数据。这比按顺序读取每一行要快得多。
如何在 SQL 中创建索引:
下面是实际 SQL 在我们之前的示例中为 Employee_Name 列创建索引时的样子:
CREATE INDEX name_index
ON Employee (Employee_Name)
如何在 SQL 中创建多列索引:
我们还可以在 Employee 表中的两列上创建索引,如以下 SQL 所示:
CREATE INDEX name_index
ON Employee (Employee_Name, Employee_Age)
关于php - PHP/MySQL 脚本执行缓慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34809338/
目前我正在构建相当大的网络系统,我需要强大的 SQL 数据库解决方案。我选择 Mysql 而不是 Postgres,因为一些任务需要只读(MyISAM 引擎)而其他任务需要大量写入(InnoDB)。
我在 mysql 中使用如下命令。当它显示表格数据时,它被格式化为一个非常干净的表格,间距均匀且 |作为列分隔符。 SELECT * FROM TABLE_NAME; 当我从 CLI 运行命令时,如下
我知道这个问题之前已经被问过好几次了,我已经解决了很多问题,但到目前为止没有任何效果。 MySQL 试图将自身安装到的目录 (usr/local/mysql) 肯定有问题。关于我的错误的奇怪之处在于我
以下是我的 SQL 数据结构,我正在尝试如下两个查询: Select Wrk_ID, Wrk_LastName, Skill_Desc from Worker, Skill where
我们有一个本地 mysql 服务器(不在公共(public)域上),并希望将该服务器复制到我们拥有的 google 云 sql 实例。我的问题是:1.这可能吗?2.我们的本地服务器只能在本地网络上访问
我有一个表(test_table),其中一些字段值(例如字段 A、B 和 C)是从外部应用程序插入的,还有一个字段(字段 D),我想从现有表(store_table)插入其值,但在插入前者(A、B 和
我想创建一个 AWS RDS 实例,然后使用 terraform 管理数据库用户。因此,首先,我创建了一个 RDS 实例,然后使用创建的 RDS 实例初始化 mysql 提供程序,以进一步将其用于用户
当用户在我的网站上注册时,他们会在我的一个数据库中创建自己的表格。该表存储用户发布的所有帖子。我还想做的是也为他们生成自己的 MySql 用户——该用户仅有权从他们的表中读取、写入和删除。 创建它应该
我有一个关于 ColdFusion 和 Mysql 的问题。我有两个表:PRODUCT 和 PRODUCT_CAT。我想列出包含一些标记为:IS_EXTRANET=1 的特殊产品的类别。所以我写了这个
我想获取 recipes_id 列的值,以获取包含 ingredient_id 的 2,17 和 26 条目的值。 假设 ingredient_id 2 丢失则不获取记录。 我已经尝试过 IN 运算符
在 Ubuntu 中,我通常安装两者,但 MySQL 的客户端和服务器之间有什么区别。 作为奖励,当一个新语句提到它需要 MySQL 5.x 时,它是指客户端、服务器还是两者兼而有之。例如这个链接ht
我重新访问了我的数据库并注意到我有一些 INT 类型的主键。 这还不够独特,所以我想我会有一个指导。 我来自微软 sql 背景,在 ssms 中你可以 选择类型为“uniqeidentifier”并自
我的系统上有 MySQL,我正在尝试确定它是 Oracle MySQL 还是 MySQL。 Oracle MySQL 有区别吗: http://www.oracle.com/us/products/m
我是在生产 MySQL 中运行的应用程序的新维护者。之前的维护者已经离开,留下的文档很少,而且联系不上了。 我面临的问题是执行以下请求大约需要 10 秒: SELECT COUNT(*) FROM `
我有两个位于不同机器上的 MySQL 数据库。我想自动将数据从一台服务器传输到另一台服务器。比方说,我希望每天早上 4:00 进行数据传输。 可以吗?是否有任何 MySQL 内置功能可以让我们做到这一
有什么方法可以使用 jdbc 查询位于 mysql 根目录之外的目录中的 mysql 表,还是必须将它们移动到 mysql 根目录内的数据库文件夹中?我在 Google 上搜索时没有找到任何东西。 最
我在 mysql 数据库中有两个表。成员和 ClassNumbers。两个表都有一个付费年份字段,都有一个代码字段。我想用代码数字表中的值更新成员表中的付费年份,其中成员中的代码与 ClassNumb
情况:我有 2 台服务器,其中一台当前托管一个实时 WordPress 站点,我希望能够将该站点转移到另一台服务器,以防第一台服务器出现故障。传输源文件很容易;传输数据库是我需要弄清楚如何做的。两台服
Phpmyadmin 有一个功能是“复制数据库到”..有没有mysql查询来写这个函数?类似于将 db A 复制到新的 db B。 最佳答案 首先创建复制数据库: CREATE DATABASE du
我有一个使用 mySQL 作为后端的库存软件。我已经在我的计算机上对其进行了测试,并且运行良好。 当我在计算机上安装我的软件时,我必须执行以下步骤: 安装 mySQL 服务器 将用户名指定为“root
我是一名优秀的程序员,十分优秀!