当数千个条目时如何加快数据库查询[关闭]

Posted

技术标签:

【中文标题】当数千个条目时如何加快数据库查询[关闭]【英文标题】:How to fast up databases queries, when thousands of entries [closed] 【发布时间】:2013-09-22 13:09:40 【问题描述】:

为了学习 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;

【问题讨论】:

那么我应该把这些索引放在哪里?? 一张表包含 14k 条记录?严重地 ?这里有一些严肃的解决方案。索引,可能的规范化/非规范化。 :)看看这些方面,我相信你不会失望 到处放索引只会让事情变得更糟,尝试在最关键的属性上添加一两个 【参考方案1】:

首先,将您的 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/

【讨论】:

好的,等等。我将编辑我的问题...因为如果认真我不知道什么是 JOIN 以及它是如何工作的... 现在,只需进行我在帖子中提到的更改,如果现在更快,请告诉我。 使用新的 getPostsCount 函数会快一点...我不明白第二件事...我更新了我的帖子 如果您将类别存储在逗号分隔的字段中,那么您做错了,它应该放在单独的表格中以使事情变得更容易。或者,如我的回答中所述,您可以使用 ->where_in 方法传递完整的爆炸 id 数组,返回结果,因此您的视图中只有 1 个 foreach(不在视图和模型中)。 ok tnx 很多...你帮助我的小项目有很多数据:D

以上是关于当数千个条目时如何加快数据库查询[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

加快Sql查询

删除不同表中的条目 MySQL 查询

如何优化显示数千条数据的长查询

查询数千个结果时,android中的Ormlite DAO变得非常慢

php+mysql 如何优化千万级数据模糊查询加快

什么是合适的数据库解决方案,可以保存键、值并使用数千个键查询以返回数千个值?