SELECTsum(money) FROM trade WHERE DATE_FORMAT(created, '%Y-%m-%d') = (SELECT DATE_FORMAT(NOW(), '%Y-%m-%d')); SELECTsum(money) FROM trade WHERE DATE_FORMAT(created, '%Y-%m') = (SELECT DATE_FORMAT(NOW(), '%Y-%m')); SELECTsum(money) FROM trade WHERE DATE_FORMAT(created, '%Y') = (SELECT DATE_FORMAT(NOW(), '%Y'));
SELECTsum(money) FROM trade WHERE TO_DAYS(created) = TO_DAYS(NOW());
1.2. 优化思路
created 字段明显存在逻辑的运算,所以查询条件不会走索引,所以更改如下。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
SELECTsum(money) FROM trade WHERE created >=DATE(DATE_FORMAT(NOW(), '%Y%m%d')) AND created < DATE_ADD(DATE(DATE_FORMAT(NOW(), '%Y%m%d')), INTERVAL1DAY) # ANDDATE(DATE_FORMAT(NOW(), '%Y%m%d')) = DATE_FORMAT(NOW(), '%Y%m%d');
SELECTsum(money) FROM trade WHERE created >= DATE_ADD(curdate(), interval-day(curdate()) +1day) AND created < last_day(curdate());
SELECTsum(money) FROM trade WHERE created >= DATE_SUB(CURDATE(), INTERVAL dayofyear(now()) -1DAY) AND created < concat(YEAR(now()),'-12-31');
SELECT ifnull(sum(o.pay) /0.945, 0) FROM `zx-order`.orders_detail o LEFTJOIN `zx-order`.goods g ON g.id = o.goods_id LEFTJOIN `zx-user`.company c ON c.id = g.company_id LEFTJOIN `zx-user`.user u ON u.id = c.admin_id WHERE (o.state =10 OR o.state =3) AND DATE_FORMAT(o.pay_time, '%Y%m%d') = DATE_FORMAT(now(), '%Y%m%d') AND u.au_name ='XXX' GROUPBY u.au_name;
SELECT ifnull(sum(o.pay) /0.945, 0) FROM `zx-order`.orders_detail o LEFTJOIN `zx-order`.goods g ON g.id = o.goods_id LEFTJOIN `zx-user`.company c ON c.id = g.company_id LEFTJOIN `zx-user`.user u ON u.id = c.admin_id WHERE (o.state =10 OR o.state =3) AND DATE_FORMAT(o.pay_time, '%Y%m%d') = DATE_FORMAT(now(), '%Y%m%d') AND u.id =201233 GROUPBY u.id;
思路:优先使用主键来查询,而不是索引,避免回表。
2.3.1. AliYun 数据库治理服务给了一个优化方案。
将 AND DATE_FORMAT(o.pay_time, '%Y%m%d') = DATE_FORMAT(now(), '%Y%m%d') 替换,把之前日期 = 更改为 < 和 > 的组合,并取中间值。速度一下子减少到只需要 66 ms 左右就可以查询到结果。
1 2 3 4 5 6 7 8 9 10 11 12
SELECT IFNULL(SUM(`o`.`pay`) /0.945, 0) FROM `zx-order`.`orders_detail` `o` LEFTJOIN `zx-order`.`goods` `g` ON `g`.`id` = `o`.`goods_id` LEFTJOIN `zx-user`.`company` `c` ON `c`.`id` = `g`.`company_id` LEFTJOIN `zx-user`.`user` `u` ON `u`.`id` = `c`.`admin_id` WHERE (`o`.`state` =10 OR `o`.`state` =3) AND `o`.`pay_time` >=DATE(DATE_FORMAT(NOW(), '%Y%m%d')) AND `o`.`pay_time` < DATE_ADD(DATE(DATE_FORMAT(NOW(), '%Y%m%d')), INTERVAL1DAY) ANDDATE(DATE_FORMAT(NOW(), '%Y%m%d')) = DATE_FORMAT(NOW(), '%Y%m%d') AND `u`.`au_name` ='XXX' GROUPBY `u`.`au_name`