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


Optimize a large MySQL query (caching or something similar?)

我不习惯处理这么大的对象(hehe)。我有一个查询,通过我所有的子域从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表中不可用的名称搜索网站。URL是,但是URL可能是"smsalem",但用户可能会搜索类似"Service Master"或甚至只是"Service"之类的内容。

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

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

这个"工作",但我担心每次有人使用这个页面(我们有一个专用服务器),201mb是非常高的,我想知道是否有一种方法来优化这一点,或者如果这些数字足够低,不用担心(我们可能在未来一两年内看到5k+网站)

尝试在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:是的,对于任何文本搜索,你最好尝试Sphinx/Solr/ElasticSearch/等,因为MySQL不是最快的处理它的东西。