Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL性能同时访问表_Php_Mysql - Fatal编程技术网

Php MySQL性能同时访问表

Php MySQL性能同时访问表,php,mysql,Php,Mysql,下面的代码是我真实代码的一个模型。当调用myFunction时,我的性能受到了很大的影响。myTable不超过几百行,但调用myFunction会增加约10秒的执行时间。在已经访问表的循环中尝试访问表中的一行是否存在固有的错误 <select> <?php $stmt = SQLout ("SELECT ID,Title FROM myTable WHERE LEFT(Title,2) = ? ORDER BY Title DESC",

下面的代码是我真实代码的一个模型。当调用myFunction时,我的性能受到了很大的影响。myTable不超过几百行,但调用myFunction会增加约10秒的执行时间。在已经访问表的循环中尝试访问表中的一行是否存在固有的错误

<select>
<?php
  $stmt = SQLout ("SELECT ID,Title FROM myTable WHERE LEFT(Title,2) = ? ORDER BY Title DESC",
                   array ('s', $co), array (&$id, &$co_title));
  while ($stmt->fetch()) {
    if (myFunction($id))  // skip this function call and save 10 seconds
      echo '<option value="' . $co_title . '">' . $co_title . '</option>';
  }
  $stmt->close();


function myFunction ($id) {
  $stmt = SQLout ("SELECT Info FROM myTable WHERE ID = ?",
                   array ('i', $id), array (&$info));
  if ($stmt->fetch()) {
    $stmt->close();
    if ($info == $something)
      return true;
  }
  return false;
}
?>

你所做的有时被称为“N+1查询”问题。运行第一个(外部)查询1次,它返回N行。然后运行N个下级查询,第一个查询返回的每行一个查询。因此N+1查询。这会造成很多开销

如果您可以在SQL中应用“something”条件,这将有更好的性能:

$stmt = SQLout ("SELECT ID,Title FROM myTable 
    WHERE LEFT(Title,2) = ? AND Info = ... ORDER BY Title DESC",
    array ('s', $co), array (&$id, &$co_title));
一般来说,在依赖于有多少行与外部查询匹配的循环中运行查询不是一个好主意。如果外部查询匹配1000000行怎么办?这意味着循环中的一百万个查询将针对这个PHP请求命中您的数据库

即使今天外部查询只匹配3行,您以这种方式构建代码的事实意味着六个月后,在一些不可预测的时间,即使您的代码没有更改,也会有一些搜索导致巨大的开销。查询的数量是由数据驱动的,而不是由代码驱动的

有时需要执行您正在执行的操作,例如,“something”条件很复杂,不能用SQL表达式表示。但在所有其他情况下,您都应该尝试避免这种N+1查询模式。

因此,如果表中有“几百行”,则可能会调用myFunction几百次,具体取决于第一次查询中返回的行数

检查第一个查询返回的行数,确保它满足您的期望

之后,确保在myTable.ID上有索引


之后,我将开始研究系统/服务器级别的问题。在速度较慢的系统上,例如笔记本电脑硬盘,每秒可能只能查询10个查询。

尝试以下方法:

  $stmt = SQLout ("SELECT ID,Title, Info FROM myTable WHERE LEFT(Title,2) = ? ORDER BY Title DESC",
                   array ('s', $co), array (&$id, &$co_title, &$info));
  while ($stmt->fetch()) {
    if (myFunction($info))  // skip this function call and save 10 seconds
      echo '<option value="' . $co_title . '">' . $co_title . '</option>';
  }
  $stmt->close();

function myFunction ($info) {
  if ($info == $something)
    return true;
  }
  return false;
}
$stmt=SQLout(“从左边的myTable中选择ID、标题、信息(标题,2)=?按标题说明排序”,
数组('s',$co),数组(&$id,&$co_title,&$info));
而($stmt->fetch()){
if(myFunction($info))//跳过此函数调用并节省10秒
回声“.$co_标题”;
}
$stmt->close();
函数myFunction($info){
如果($info==$something)
返回true;
}
返回false;
}

您确实意识到您正在查询
myTable
n+1次,其中n是行数,对吗?当您在循环中看到select时,您知道有什么地方做错了这就是我的问题:为什么myFunction拥有自己的局部变量和指针,不能独立于主例程访问myTable?这是有意义的。我已经解决了类似于这里的建议的问题,但这解释了为什么会发生这种情况。谢谢
  $stmt = SQLout ("SELECT ID,Title, Info FROM myTable WHERE LEFT(Title,2) = ? ORDER BY Title DESC",
                   array ('s', $co), array (&$id, &$co_title, &$info));
  while ($stmt->fetch()) {
    if (myFunction($info))  // skip this function call and save 10 seconds
      echo '<option value="' . $co_title . '">' . $co_title . '</option>';
  }
  $stmt->close();

function myFunction ($info) {
  if ($info == $something)
    return true;
  }
  return false;
}