在php中自动化mysql'limit'

时间:2013-05-07 22:05:10

标签: php mysql performance query-optimization

我正在使用一个非常大的数据库,我还不太习惯。我需要循环1,400个结果(更多是定期添加)并根据每个结果运行函数IF标准。

这是我的代码的骨头:

$blogs = $wpdb->get_results( 
    "SELECT blog_id,path FROM {$wpdb->blogs} 
    WHERE blog_id != {$wpdb->blogid} 
    AND site_id = '{$wpdb->siteid}' 
    AND spam = '0' 
    AND deleted = '0' 
    AND archived = '0' 
    order by blog_id", ARRAY_A
);

然后我运行foreach来获取一些数据(特别是博客名称)

foreach( $blogs as $blog ) : 
    switch_to_blog( $blog[ 'blog_id' ] );
    if(strpos(strtolower($blog_details->blogname), strtolower($_GET['squery'])) !== false){
    //Show the site's title and link to the site
}

endforeach;

基本上,在第一部分中,我抓住了所有1400个结果,这没有多少购买给我所有活动博客的ID(这是关于该数据库表中的所有内容)。

在第二部分中,我运行一个wordpress函数来获取博客的名称,并仅在用户查询的博客名称中将其显示在列表中。 (我逃避输入,不用担心)。

有人说使用类似的东西:

...
AND archived = '0'
LIMIT {$offset},20
order by blog_id", ARRAY_A
...

这可能有用,但它只返回20个结果。如果我需要在结果#17和#1,111上运行结束函数,那么只有#17会显示?

所以我的终极问题是:

有没有办法让“20~limit”部分循环遍历所有数据库条目?不限制它的内存使用量约为200MB。如果我可以一次将它限制为20,但是所有这些都自动循环,它(应该??)大大减少了我的内存使用量,对吗?

现在的最终结果是:

  • 获得1400个结果,运行该功能,在列表中显示X博客名称。

我喜欢什么(除非在PHP-MySQL中有更好的方法来减少内存开支):

  • 获得20个结果,运行该功能,在列表中显示X博客名称。得到20
  • 更多结果(21-40),运行该功能,在列表中显示X博客名称。
  • 获得20个结果(41-60),运行该功能,在
  • 中显示X博客名称
  • 列表。等...

没有来自用户的更多输入。只是让它们自动循环。

2 个答案:

答案 0 :(得分:0)

我不太明白你想做什么,但如果你想做一些事情,比如向用户展示博客列表,但每个请求限制20个条目。您可以使用来自客户端的AJAX请求,例如:

客户端加载包含空列表的页面 - > XHR - >加载前20个条目

客户滚动列表 - > XHR - >再加载20个条目

<强> UPD:

首先,您必须知道最大单个条目大小,例如如果它是1MB - 每次最多可以加载200个条目(内存限制为200MB)。 Flushing数据到客户端并不是必需的,但如果您的页面会生成很长一段时间,它会将数据发送到客户端。

这样的事情:

$i=0;
while(!$end){
  $q = query('
  ...
  AND archived = '0'
  LIMIT {$i*200},{$i*200+200}
  order by blog_id", ARRAY_A
  ...
  ');
  echo fetch_my_query($q); //fetch and echo data
  $i++;
  if(mysql_num_rows($q) != 200)$end = True; //Got all entries in DB
  flush();
}

答案 1 :(得分:0)

您是否可以简单地更改查询并在其中添加额外的WHERE限制?

例如,如果我理解您的代码:

$blogs = $wpdb->get_results( 
    "SELECT blog_id,path FROM {$wpdb->blogs} 
    WHERE blog_id != {$wpdb->blogid} 
    AND site_id = '{$wpdb->siteid}' 
    AND spam = '0' 
    AND deleted = '0' 
    AND archived = '0' 
    AND `field containing the blog name` LIKE '%".$_GET['squery']."%'
    LIMIT 20  #you can add the offset if you paginate the results
    order by blog_id", ARRAY_A
);

您可能需要联系另一个表来获取blogname。

不知道您的数据库结构我只能尝试查询:

$blogs = $wpdb->get_results( 
    "SELECT b.blog_id,b.path
    FROM {$wpdb->blogs} `b`
       LEFT JOIN table_with_blog_name db ON db.id = b.blog_id
    WHERE b.blog_id != {$wpdb->blogid} 
       AND b.site_id = '{$wpdb->siteid}' 
       AND b.spam = '0' 
       AND b.deleted = '0' 
       AND b.archived = '0' 
       AND db.field_with_blog_name LIKE '%".$_GET['squery']."%'
    LIMIT 20  #you can add the offset if you paginate the results
    ORDER BY b.blog_id", ARRAY_A
);

不要忘记清理$_GET['squery']第一个