from A
right join B on B.id = A.b_id
group by A.b_id
where A.status = 1
order by count(*) desc
最好把 A表的b_id 加上索引
表统计信息是数据库基于成本的优化器最重要的参考信息;统计信息不准确,优化器可能给出不够优化的执行计划或者是错误的执行计划。对统计信息的计算分为非持久化统计信息(实时计算)与持久化统计信息。非持久化统计信息
统计信息没有保存在磁盘上,而是频繁的实时计算统计信息;
每次对表的访问都会重新计算其统计信息;
假设针对一张大表的频繁查询,那么每次都要重新计算统计信息,很耗费资源。
持久化统计信息
把一张表在某一时刻的统计信息值保存在磁盘上;
避免每次查询时重新计算;
如果表更新不是很频繁,或者没有达到 MySQL 必须重新计算统计信息的临界值,可直接从磁盘上获取;
即使 MySQL 服务重启,也可以快速的获取统计信息值;
统计信息的持久化可以针对全局设置也可以针对单表设置。
接下来,详细说 MySQL 统计信息如何计算,何时计算,效果评估等问题。在 MySQL Server 层来控制是否自动计算统计信息的分布,并且来决策是持久化还是非持久化。
创建表,数据
create table a(id int,
项目号 varchar(2),
总金额 int,
上家单位 varchar(4))
insert into a values (1,'01',100,'AAAA')
insert into a values (2,'02',200,'BBBB')
insert into a values (3,'03',250,'CCCC')
create table b
(id int,
项目号 varchar(2),
到款 int,
到款时间 date)
insert into b values (1,'03',50,'2018-07-23')
insert into b values (2,'03',100,'2018-07-24')
insert into b values (3,'01',80,'2018-07-25')
执行:
SELECTa.项目号,
a.总金额,
sum(
CASE
WHEN a.项目号 = b.项目号 THEN
到款
ELSE
0
END
) 到款总额
FROM
a
LEFT JOIN b ON a.项目号 = b.项目号
GROUP BY
a.项目号,
a.总金额
结果:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)