当数千个条目时,如何加快数据库查询

时间:2013-09-22 13:09:40

标签: php mysql sql codeigniter query-performance

为了学习php和codeigniter,我开始创建测试网站...像博客一样。这不是重点。 我正在使用codeigniter分页来显示我所有博客的帖子。但是......当我的数据库表(帖子)有超过14k个条目时,它开始变慢......而且我不需要回答:“如果它是博客而且你永远不会写那么多帖子然后只是'想一想“......我需要真正的解决方案,如何加快所有这些。

这是控制器:

    function all()
{
    // Pagination $config
    $config = $this->m_posts->getPaginationConfig('all', $this->m_posts->getPostsCount());
    $this->pagination->initialize($config);
    $data['posts'] = $this->m_posts->getAllPosts($config['per_page'], $page);
    $data['pagination'] = $this->pagination->create_links();

    $this->template->build('posts/posts', $data);
}

型号:

    function getPaginationConfig($base_url, $total_rows)
{
    $config['base_url']         = base_url() . 'posts/'. $base_url;
    $config['total_rows']       = $total_rows;
    // ----
    $config['per_page']         = 10;
    $config['num_links']        = 5;
    $config['use_page_numbers'] = TRUE;
    $config['uri_segment']      = 3;
    return $config;
}
    function getPostsCount($limit)
{
    $this->db->order_by('id', 'desc');
    $q = $this->db->get('posts');
    return $q->num_rows();
}

function getAllPosts($limit = 0, $start = 0)
{
    $this->db->order_by('id', 'desc');
    $this->db->where('active', 1);
    // Get LATEST posts -> pagination
    $q = $this->db->get('posts', $limit, $start);
    $array = $q->result_array();
    $data = $this->createPostsArray($array);
    return $data;
}
    function createPostsArray($array)
{
    foreach ($array as $key => $row) 
    {
        $array[$key]['usr_info']   = $this->user->getUserData($row['usr_id'], 'nickname');
        $this->load->helper('cat_helper');
        $array[$key]['cat_ids'] = explodeCategories($row['cat_ids']);
        foreach ($array[$key]['cat_ids'] as $numb => $value)
        {
            $array[$key]['categories'][$numb] = $this->getCategoryName($value);
        }
    }

    return $array;
}

1 个答案:

答案 0 :(得分:2)

首先,将getPostsCount函数更改为此

function getPostsCount () {
      return $this->db->count_all('posts');
}

你现在这样做的方式是浪费时间/记忆/ cpu&代码行什么都没有。

第二件事,使用左/内连接来获取其他数据,而不是在foreach语句中抛出一堆查询(这是错误的)。

如果您仍然需要帮助加入,请显示表格结构以获得更多帮助。

我认为这一微小变化将会产生重大影响。

修改

提供更多信息之后,这是您与用户联系的查询(因为不清楚您的类别如何运作,我不包括它)。

function getAllPosts($limit = 0, $start = 0) {
         $q = $this->db->select('p.*, u.nickname')
                        ->from('posts p')
                        ->join('users u', 'p.user_id = u.id', 'left')
                        ->limit($limit, $start)
                        ->get();
         return $q->result_array();
 }

这将返回带有用户昵称的帖子,因为类别不清楚你如何存储它们以及爆炸类别正在做什么,如果你将它们存储在以逗号分隔的字段中,你可以使用使用单一查询获取所有类别 - > where_in('id',array_of_ids);

您需要阅读手册以获取有关如何执行操作的更多帮助: http://ellislab.com/codeigniter/user-guide/