【问题标题】:Optimising codeigniter query, Join or Where优化 codeigniter 查询、Join 或 Where
【发布时间】:2015-08-28 09:02:22
【问题描述】:

我对 CI 比较陌生,我读到使用 join 可能会减慢报告速度,在我的数据库中将有超过 10 万条记录。我已经在 CI 中编写了这两个查询,但没有注意到太大的区别。我想知道我是否正确地编写了这些查询,或者是否有更好的方法来获取此类查询,不幸的是我不知道如何将它们发布在一个类似小提琴的示例结构中。

function select_data_specific_customer($from, $to, $customer, $threshold = '') {

        //die($from);
        $currentuserid = $this->session->userdata('userid');
        $this->db->select('timestamp');
        $this->db->select('count');
        $this->db->select('price');
        $this->db->select('totalPrice');
        $this->db->select('reference');
        $this->db->select('customers_r');
        $this->db->select('userID_r');
        $this->db->from('logger');
        $this->db->from('users_customer');
        $this->db->where(array('users_customer.custo_id' => "logger.customers"), NULL, FALSE);      
        //users_customer contains connection between users and customers (  id  userID  custo_id    checked )
        $this->db->where(array('users_customer.userID' => $currentuserid), NULL, FALSE);
        $this->db->where(array('users_customer.checked' => '1'), NULL, FALSE);
        $this->db->where('cast(timestamp as date) BETWEEN "' . date('Y-m-d', strtotime(str_replace('-', '/', $from))) . '" and "' . date('Y-m-d', strtotime(str_replace('-', '/', $to))) . '"');


        $query = $this->db->get();

        if ($query->num_rows() > 0) {
            foreach ($query->result() as $row) {
                $data[] = $row;
            }

            return $data;
        }

        return false;
    }

这是第二个功能

function select_data_specific_customer($from, $to, $customer, $threshold = '') {

        //die($from);
        $currentuserid = $this->session->userdata('userid');
         $this->db->select('timestamp');
        $this->db->select('count');
        $this->db->select('price');
        $this->db->select('totalPrice');
        $this->db->select('reference');
        $this->db->select('customers_r');
        $this->db->select('userID_r');
        $this->db->from('logger');
        $this->db->join("users_customer", "users_customer.custo_id=logger.customers", 'inner');
        $this->db->where(array('users_customer.userID' => $currentuserid), NULL, FALSE);
        $this->db->where(array('users_customer.checked' => '1'), NULL, FALSE);
        $this->db->where('cast(timestamp as date) BETWEEN "' . date('Y-m-d', strtotime(str_replace('-', '/', $from))) . '" and "' . date('Y-m-d', strtotime(str_replace('-', '/', $to))) . '"');


        $query = $this->db->get();

        if ($query->num_rows() > 0) {
            foreach ($query->result() as $row) {
                $data[] = $row;
            }

            return $data;
        }

        return false;
    }

我想知道是否有更优化的方式来编写相同的查询,因为此时这两个函数都需要大约 6 秒的时间来显示。 结果可能会在以后增长到超过 200k,并且显示它的时间可能会增加。

任何帮助将不胜感激。

【问题讨论】:

  • 为什么不做分页?
  • 客户不希望分页,因为这些数据将被加载,然后作为计费发送给客户。所以他想显示完整的数据,然后复制粘贴到电子邮件或 Excel 中以进行进一步操作
  • 我将 for each ... data[] 替换为 return $query->result_array();它直接返回一个数组。显然这也没有改变任何东西:(
  • 请提供 SELECT 的 SQL(在 CI 构建之后),每个表的 EXPLAIN SELECT ...SHOW CREATE TABLE
  • 如何获取CI构建的sql?

标签: php mysql performance codeigniter query-optimization


【解决方案1】:
return $this->db->query("your query here");

您是否尝试过上面的查询,并使用 * 选择

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多