0

我已经使用 PHP-MySQL 构建了一个系统。该系统承受着非常重的负载,每分钟有数千次选择、更新、插入、删除。

我想优化这个系统,让它更快,并减少服务器上的负载。我已经引入了memcache,但是还是需要mysql数据的。

所以我的问题是,在这种情况下哪种方法最好。目前我的查询看起来像这样:

$q = mysql_query($sql);
while(mysql_fetch_array($q)) {...

我读过使用 mysql_fetch_assoc (?)

但是,当我开始优化这个系统时,也许有一种完全不同的方法?

谢谢大家-(为我有限的英语能力道歉)

4

3 回答 3

1

mysql_fetch_assocvsmysql_fetch_array将复制更少的数据,从而使用更少的内存。由于数据是关联的并且index在数组中呈现,因此您将获得一些微小的优化,尽管如果您的数据集很大,这将有所帮助。

  • 如果可以的话,尝试使用natural排序(AKA 避免在查询语句中排序)和LIMIT你的结果集
  • 批量查询:而是在同一张表上运行 100 次插入,尝试做一些小的插入。
  • 如果可以的话,缓存缓存缓存:使用 redis 或 memcached。
  • 如果您生成的页面可以被视为静态页面,请尝试使用 HTTP 标头以避免浏览器一直请求您的站点
  • 等等等等
于 2012-10-01T18:12:53.597 回答
1

我建议您使用 mysql 关键字 LIMIT 来限制结果集。

向 mysql 返回结果集添加分页将使您的应用程序更轻,由于要获取的行更少,ui 将加载更快,并且 mysql 服务器只会在需要时接收选择查询。基本上这是如何使用限制的语法。

SELECT * FROM Person LIMIT X,Y

其中 X 是要检索的总行数,Y 是偏移量。

例子:

SELECT * FROM Person LIMIT 10, 0

此查询将返回表 Person 的前十行,并且:

SELECT * FROM Person LIMIT 10, 10

将显示下一个 10

于 2012-10-01T19:47:24.710 回答
0

我一直在对从 PHP 中的 MySQL 获取信息的各种方法进行一些计时测试。目标是找到将一列数据传输到简单数组中的最快方法。我已经针对 enSEMBL 数据库对其进行了测试,该数据库非常有用。

以下代码对于方法 1 到 8(9 使用 GROUP_CONCAT 和 10 使用 PDO)很常见:

$query = "SELECT DISTINCT `name` FROM species LIMIT 5000";
$result = $mysqli->query($query);
*Method code*
print_r(array_filter($species));

方法一:教科书法

while ($row = $result->fetch_row()) {
         $species[] = $row[0];
      }

方法 2:while 和 reset(注意一些 IDE 在这里检测到错误)

while ($species[] = reset($result->fetch_row())) ;

方法3:foreach和reset

foreach ($result->fetch_all() as $value) $species[] = reset($value);

方法四:while、foreach、reset

while ($species[] = $result->fetch_row()) ;
foreach ($species as $key => $value) $species[$key] = reset($value);

方法五:while 和 index

while ($row = $result->fetch_row()) $species[] = $row[0];

方法六:foreach 和 index

foreach ($result->fetch_all() as $value) $species[] = $value[0];

方法七:递归数组

$species = call_user_func_array('array_merge', $result->fetch_all());

方法8:array_column

$species = array_column($result->fetch_all(), 0);

方法 9:在查询中使用 GROUP_CONCAT。

$species = explode(',', $result->fetch_row()[0]);

方法 10:PDO

$species = $sth->fetchAll(PDO::FETCH_COLUMN, 0);

令人惊讶的是,方法 1(教科书)始终比实际上相同的方法 5 长约 4 倍,但与方法 10 (PDO) 花费的时间大致相同。

方法 2 一直是最慢的方法,长 50 倍,大概是因为系统在某处写警告。

方法 4(两个循环)是第二慢的,耗时 10 倍。

如前所述,方法 1(教科书)和 10(PDO)排在第三位。

方法 9 是第四慢的(长 2 倍,缺点是在没有任何警告的情况下达到 GROUP_CONCAT 限制)。

然而,最快的方法并不一致。从 3、5、6、7 和 8 中选择。

方法 8 (array_column) 通常是最快的方法,但并非总是如此。但是我认为它是最优雅的方法,并且提供了更多的灵活性,因为它可以使用您的查询选择的任何两列返回一个关联数组(但不要弄乱查询中的顺序!)

于 2020-05-14T14:19:04.080 回答