首页 > 其他分享 >统计所有地区的人员人数并排序,优化查询速度

统计所有地区的人员人数并排序,优化查询速度

时间:2024-12-14 16:31:09浏览次数:11  
标签:info ad pio 查询 table 排序 优化 id addr

# 背景:person_info 表存放用户信息中有1千万数据,ID为主键,addr存放省份ID;addr_table表存放省份数据,有34条数据,ID为主键;

# 统计所有地区的人员人数
select ad.name, count(pio.id) as pid from addr_table ad inner join person_info pio on ad.id = pio.addr group by ad.name order by pid;
# 查询时长:5s

# SQL优化:
# 添加索引
alter table person_info add index pi_addr_index(addr);
# 添加索引后,查询时长:2s

# 添加外键
# 语法:ALTER TABLE child_table ADD FOREIGN KEY (column1) REFERENCES parent_table(parent_column)
# CASCADE:当父表中的记录被删除或更新时,子表中相应的记录也会被级联删除或更新。
# SET NULL:当父表中的记录被删除时,子表中相应的外键列将被设置为NULL。
# NO ACTION 或 RESTRICT:当父表中的记录被删除或更新时,如果子表中存在依赖的记录,则操作将被拒绝。
# SET DEFAULT:将外键列设置为默认值。
alter table person_info
add foreign key (addr) references addr_table(id);
# 添加外键时报错,原因:两边的字段的数据类型不一致
# 添加外键需要注意的事项:
# 父表必须存在,父列必须为主键或唯一键
# 数据类型必须一致,子表中的数据都必须满足外键约束

# 修改表字段类型
alter table person_info modify addr int;



# 添加索引后,查询时长变为了2秒,看能否继续优化 
# 为 group by 的字段添加索引可以优化查询速度
# 由于ID为主键自动添加了索引,所以可以将 语句中的 group by ad.name 修改为 group by ad.id
select ad.name, count(pio.id) as pid from addr_table ad inner join person_info pio on ad.id = pio.addr group by ad.id order by pid;
# 优化后查询时长:1s

 

标签:info,ad,pio,查询,table,排序,优化,id,addr
From: https://www.cnblogs.com/Smile-W/p/18606879

相关文章