PHP 优化:从数据库获取数据

3

我有一些PHP代码,当按下下一个箭头时,它基本上只会获取数据库中的下一个图像。然而,在我的网站上,有时可能会有超过600个用户在线同时点击下一个。有没有办法优化这个PHP代码以使其执行更快?

谢谢!

$nxtImage = mysql_query ("SELECT * FROM images WHERE active=1 and id>$id and section=$section ORDER BY id ASC LIMIT 1") or die (mysql_error());
$nxtrow = mysql_fetch_array($nxtImage);
$nxtnum = mysql_num_rows($nxtImage);
$nid = $nxtrow['id'];
$npicTitle = $nxtrow['img_title'];
$nimgLink = preg_replace("![^a-z0-9]+!i", "-", $npicTitle);
$nimgLink = strtolower($nimgLink); 

如果id是某种类似于主键的索引,那么它已经被排序了,因此您不需要告诉它要排序任何内容。移除这个ORDER BY id ASC可能已经增加了此查询的性能。 - Havenard
使用类似Memcached的东西来缓存查询结果怎么样? - edwardmp
尽管mysql函数具有较小的速度优势,但如果声明了类似于$id = $_GET['id']这样的变量,您应该切换到mysqli - Chris Hanson
你的表结构是什么?即 DESC images; - Ja͢ck
4个回答

6
第一件事是将查询更改为:SELECT `id`、`img_title` FROM images ...,以确保仅获取所需内容。接下来要做的是在id、img_title、section、active上建立覆盖索引,这样就不必读取数据页。

除此之外,增加更多硬件,:D


“SELECT *…”虽然常常更快 - dualed
4
“@dualed,更快对于谁?开发者吗?因为如果是这样的话,我同意这个观点。但这并不会让服务器更快。首先,‘SELECT *’必须运行一个恢复所有列的算法,其次,返回比所需数据更全面的数据集将永远不会更有效率。最后,当不使用‘SELECT *’时,你可以建立覆盖索引,这才是真正开始看到性能提升的地方。” - Mike Perrenoud
更快指的是“在SQL引擎上执行需要更长时间”。不确定在4个字段上建立一个覆盖索引是否是一件好事,但它可能是整个表格,从我的角度来看,在表的所有列上放置索引是非常有争议的。无论如何,如果该索引包含表的所有列,则应使用覆盖索引。 - dualed

3
你可以在服务器端一开始就获取所有的图片,然后在Javascript中将其传递给客户端(例如使用JSON)。
然后,每当有人点击箭头时,你只需在Javascript中加载正确的图像(例如使用下一个更大的数组索引)。
这样做可以消除许多(可能是数量级的)数据库查询,从而提高服务器性能。

1
一旦您知道用户经常会点击“下一页”,您可以实现标签导航,其中JavaScript已经简要说明了下10、20张图像的参数,并使用动态内容执行导航,而不会经常打扰PHP和MySQL。
此外,MySQL提供了调优参数,您可以增加key_buffer_sizetable_cache的值,以告诉服务器在内存中保留更多信息,以便进行更快速的搜索和即时响应。
我通常将其调整为使用服务器上未使用的大部分内存,因为未使用的内存是浪费资源。

0
你可以在你的表中添加一个名为nextID的列。我知道,这会破坏数据库规范化,但在极端情况下,你可能需要这些技巧来以牺牲一个字段为代价提高性能。请注意,这个新字段可以使用数据库触发器来维护。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接