2013-09-22 35 views
0

爲了學習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; 
} 
+0

和您的架構? – Jianhong

+0

那麼我應該在哪裏放這些索引? – user2779986

+0

與14k記錄在一張表中的所有內容?真的嗎? 以下是一些嚴重的解決方案。 索引,可能的歸一化/ denormallization。 :)看看這些方面,我相信你不會失望 –

回答

2

首先,改變你的getPostsCount功能,這

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

你這樣做,現在是在浪費時間的方式/ memory/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/

+0

ok,等等。我會編輯我的問題...因爲如果認真的我不會是什麼JOIN以及它是如何工作的 – user2779986

+0

現在,只需進行我在帖子中提到的更改並讓我知道現在是否更快。 – ahmad

+0

新的getPostsCount函數有點快...而且我不明白第二件事......我更新了我的文章 – user2779986

相關問題