0

PHP と codeigniter を学習するために、テスト Web サイトの作成を開始しました...ブログのようなものです。それはポイントではありません。ブログのすべての投稿を表示するために codeigniter ページネーションを使用しています。しかし... データベース テーブル (投稿) のエントリ数が 14,000 を超えると、処理速度が低下し始めます.. そして、次のような回答は必要ありません。それについて考えないでください」...これらすべてのものを高速化する方法の実際の解決策が必要です。

コントローラーは次のとおりです。

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

1 に答える 1

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/

于 2013-09-22T13:25:38.777 に答える