优化大型MySQL查询(缓存或类似的东西?)

时间:2013-05-02 22:29:02

标签: php mysql query-optimization

我不习惯使用这些大对象(呵呵)。我有一个查询从mysql查询运行我的所有子域:

$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;

我这样做是因为我需要用户能够通过它在$wpdb->blogs表中找不到的NAME来搜索网站。 URL是,但网址可能是smsalem“但用户会搜索类似”服务大师“的内容,甚至只是”服务“。

我将内存限制提高到256mb(太高了?或者我可以更高?)因为我的内存耗尽错误。

现在它完成得很好,我回应了内存使用情况并获得了 201043248 ,201mb。我的初始$blogs数组中有大约1,400个项目。

这“有效”,但我担心只要有人使用该页面(我们有一个专用服务器),201mb就会非常高,我想知道是否有办法优化这一点或者这些数字是否足够低不用担心(我们可能会在未来一两年内关注5k +网站)

1 个答案:

答案 0 :(得分:0)

尝试在SQL语句中使用LIMIT,这样您就可以通过较小的块来获取数据。

类似的东西:

$result = $wpdb->get_row("SELECT COUNT(id) AS rowCount FROM {$wpdb->blogs}");
$rowCount = $result->rowCount;

for($offset=0; $offset<$rowCount; $offset+=50)
{
    $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
                        LIMIT {$offset},50", ARRAY_A);

    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;
}

通过这样做,你肯定会增加sql查询的数量,但无论如何,整体内存使用量将显着降低。 50岁是不到1400,是的。

PS:是的,对于任何TEXT搜索,你最好尝试Sphinx / Solr / ElasticSearch / etc,因为MySQL不是最快的处理它。