我有一个代码可以对这样的交易中的现金总额进行汇总,
public function get_total_cash($date_from, $date_to){
$filtered_order = array('Ordered', 'Validated','Awaiting Packing','Packing Process','Ready to Ship','Shipped','Completed');
$op_status = array('settlement','capture');
$this->db->select('CAST(SUM(op_total) AS int) as total');
$this->db->from("(dashboard_sales)");
$this->db->where('order_date >=', date('Y-m-d 00:00:00',strtotime($date_from)));
$this->db->where('order_date <=', date('Y-m-d 23:59:59',strtotime($date_to)));
$this->db->where_in('order_status',$filtered_order);
$this->db->where_in('op_status',$op_status);
$query = $this->db->get();
return $query->result()[0]->total;
}
但是问题是我网站上的交易不堪重负,提取代码时它变得很长。我的数据库中的交易记录超过25,000个数据。
在我的情况下,如何使求和过程更加优化?
答案 0 :(得分:0)
在没有数据库结构的详细知识的情况下,我建议将此codeigniter查询写入SQL查询中。
使用EXPLAIN关键字通过您更熟悉的工具phpmyadmin,mysqlworkbench查看查询的执行计划。 因为这是一个相当简单的查询,所以我假设您缺少where条件中字段的索引。
答案 1 :(得分:0)
在您使用的列上建立非聚集索引,如下所示:
CREATE INDEX MyIndex
ON dashboard_sales(op_total, order_date)
在创建索引之前和之后检查查询计划,您会发现有所不同。您可以选择是否包含op_total列,测试索引并在计划中查看。
添加索引会减少聚集索引中的扫描次数,使用EXPLAIN可以在操作员上看到扫描次数。
答案 2 :(得分:0)
在查询中按主键进行分组,并在表中添加索引,从而使事务处理更快。
答案 3 :(得分:0)
这可能有帮助:
ALTER TABLE dashboard_sales
ADD INDEX(order_status, op_status, order_date);
如果您需要进一步的帮助,请提供SHOW CREATE TABLE dashboard_sales
,表格大小和EXPLAIN SELECT ...