【发布时间】: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