# 背景: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