如何在MySQL中优化总和

时间:2019-06-12 08:43:16

标签: mysql performance codeigniter

我有一个代码可以对这样的交易中的现金总额进行汇总,

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个数据。

在我的情况下,如何使求和过程更加优化?

4 个答案:

答案 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 ...