Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.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 工具提示:根据请求预加载数据或ajax_Php_Mysql_Ajax - Fatal编程技术网

Php 工具提示:根据请求预加载数据或ajax

Php 工具提示:根据请求预加载数据或ajax,php,mysql,ajax,Php,Mysql,Ajax,我有一个家庭列表,每个家庭在滚动时都会显示一个工具提示,其中包含有关单个家庭的其他信息(居住地点信息和该地点的3张图像) 那么,最佳实践(性能)是什么呢?要在开始时预加载所有数据,还是仅在需要时(滚动时)才请求ajax数据 请注意,页面已经包含3个select mysql_查询,工具提示的数据获取需要另外2个查询 查询(考虑到搜索的复杂性): SELECT * FROM news ORDER BY bDate DESC LIMIT 5; SELECT * FROM family ORDER BY

我有一个家庭列表,每个家庭在滚动时都会显示一个工具提示,其中包含有关单个家庭的其他信息(居住地点信息和该地点的3张图像)

那么,最佳实践(性能)是什么呢?要在开始时预加载所有数据,还是仅在需要时(滚动时)才请求ajax数据

请注意,页面已经包含3个select mysql_查询,工具提示的数据获取需要另外2个查询

查询(考虑到搜索的复杂性):

SELECT * FROM news ORDER BY bDate DESC LIMIT 5;
SELECT * FROM family ORDER BY created DESC LIMIT 5;
SELECT bplace.placeID, bplace.sName, bplace.countryID, bcountry.regionID FROM bplace, bcountry WHERE bplace.countryID = bcountry.countryID ORDER BY created DESC LIMIT 5;
while(...){

$allFamilies[] = $row["familyID"];

}

$allFamilies = implode(',',$allFamilies);

SELECT sName FROM bplace WHERE placeID IN ($allfamilies);
SELECT url FROM images WHERE placeID IN ($allfamilies);
SELECT sName FROM bplace WHERE placeID='1';
SELECT url FROM images WHERE placeID='1';
原始3个查询:

SELECT * FROM news ORDER BY bDate DESC LIMIT 5;
SELECT * FROM family ORDER BY created DESC LIMIT 5;
SELECT bplace.placeID, bplace.sName, bplace.countryID, bcountry.regionID FROM bplace, bcountry WHERE bplace.countryID = bcountry.countryID ORDER BY created DESC LIMIT 5;
while(...){

$allFamilies[] = $row["familyID"];

}

$allFamilies = implode(',',$allFamilies);

SELECT sName FROM bplace WHERE placeID IN ($allfamilies);
SELECT url FROM images WHERE placeID IN ($allfamilies);
SELECT sName FROM bplace WHERE placeID='1';
SELECT url FROM images WHERE placeID='1';
工具提示2查询(预加载方式):

SELECT * FROM news ORDER BY bDate DESC LIMIT 5;
SELECT * FROM family ORDER BY created DESC LIMIT 5;
SELECT bplace.placeID, bplace.sName, bplace.countryID, bcountry.regionID FROM bplace, bcountry WHERE bplace.countryID = bcountry.countryID ORDER BY created DESC LIMIT 5;
while(...){

$allFamilies[] = $row["familyID"];

}

$allFamilies = implode(',',$allFamilies);

SELECT sName FROM bplace WHERE placeID IN ($allfamilies);
SELECT url FROM images WHERE placeID IN ($allfamilies);
SELECT sName FROM bplace WHERE placeID='1';
SELECT url FROM images WHERE placeID='1';
工具提示2查询(ajax方式):

SELECT * FROM news ORDER BY bDate DESC LIMIT 5;
SELECT * FROM family ORDER BY created DESC LIMIT 5;
SELECT bplace.placeID, bplace.sName, bplace.countryID, bcountry.regionID FROM bplace, bcountry WHERE bplace.countryID = bcountry.countryID ORDER BY created DESC LIMIT 5;
while(...){

$allFamilies[] = $row["familyID"];

}

$allFamilies = implode(',',$allFamilies);

SELECT sName FROM bplace WHERE placeID IN ($allfamilies);
SELECT url FROM images WHERE placeID IN ($allfamilies);
SELECT sName FROM bplace WHERE placeID='1';
SELECT url FROM images WHERE placeID='1';

我认为这是一个有点常识的偏好。1000行预加载将花费一些时间抓取、循环,然后显示(使页面大小增大几kb)。如果只是抓取了几行,那么抓取这些行而不是等待AJAX加载它们可能是有意义的

另一件需要考虑的事情是,数据是否会改变,是否会经常改变。如果工具提示数据一直在更改,那么不管怎样,AJAX都可能是一条出路。如果它基本上是静态的,那么将其全部捕获可能是有意义的

Ajax可能需要时间,但除非您的服务器容量非常大,并且没有相应地增长,否则这些请求只需要几分之一秒


归根结底,这是个人偏好。什么对你来说更容易?硬编码每个工具提示会更容易,还是使用javascript调用工具提示数据会更容易?选择更简单、更流畅的应用程序。

你只需要想想你的应用程序将增长多大。如果您得到几千行,您的IN查询将真正减慢。ajax查询总是加载得很快,因为它们是直接查找


此外,如果数据可以缓存,直接向CDN提供ajax调用将使其几乎立即加载。如果您不断地拉取数据并需要扩展,ajax方法也可以用于密钥库,因为它是主键查找。

我不确定您的问题是否有一个通用的、明确的答案

为了衡量某种绩效,你必须考虑更多的变量

  • 每页将加载多少工具提示
  • 他们的数据有多大 返回
  • 客户机、服务器和服务器之间的连接如何& 数据库
  • 查询需要多长时间
  • 有多少用户浏览 同时通过这些页面
  • 是否涉及缓存
还有更多


不久前,我在一个项目中遇到了一个非常类似的问题(它也与工具提示有关),我选择了ajax方式,主要是因为我希望尽可能加快初始页面加载(脚本持续时间越短,html大小越小)。如果许多用户同时浏览所有的工具提示,那么ajax方式实际上会消耗更多的“性能”,但在本项目中显然不是这样。

我认为ajax是一个不错的选择,因为它不需要重新加载页面,如果所有家庭数据都很大,预加载可能会很昂贵。这完全取决于您想要的用户体验。您可以进行混合,甚至在最初加载基本数据,然后在初始页面加载后加载所有滚动内容。另外,对于滚动查询,您似乎可以简化为单个查询,如
SELECT bplace.sName,images.url FROM bplace JOIN url ON bplace.placeID=images.placeID WHERE placeID=?