开发者社区> 问答> 正文

MySql两张百万级表关联的count效率求解? 400 报错

MySql两张百万级表关联的count效率求解? 400 报错

人口表A。400多万

一堆多的区域表B。400多万。

一个人对应多个区域。

B表字段:personid(外键,人口表主键)。code(全国区域编码)

前台需要分页情况下,我需要查出某个区域下的总人数如

select count(distinct B.perosnid) from B

left join A on A.id = B.personid

where B.code like '32%'(比如查江苏省)


请问这效率有办法提升吗,耗时目前需要20多s


展开
收起
爱吃鱼的程序员 2020-06-01 10:36:42 1843 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    select count(1) from B b inner join A a on a.id = b.personid where b.code like '32%'

    这样试试呢

    ######select count(1) from B b inner join A a on a.id = b.personid where b.code in(select code from xxx ); 这样 先把江苏的code查出来,用in试试######看看!######效果一般。。。还是十几秒######为啥要关联A表? ######回复 @huan : 走了索引,然而还是很慢。。。感觉有点无解######回复 @程序员Joe : 两个表的关联查询很简单,看看有没有走索引。除非改动表结构,否则再优化的空间很小。######我可能会加a表字段的一些查询条件,姓名年龄什么的######使用like语句就没有使用索引了。######回复 @says : 关于mysql索引,尽量减少like,但不是绝对不可用。 xxx% 是可以用到索引的,但 %xxx 是失效的。除了like,以下操作符也可用到索引:<,<=,=,>,>=,BETWEEN,IN。<>,not in ,!=则不启用索引######不是吧!######b.code有建索引吗?###### select count(1) from B b inner join A a on a.id = b. personid where left(b.code,2) = '32'######效果不明显######

    select count(distinct B.perosnid) from B

    left join (select id from A) AA on AA.id = B.personid

    where B.code like '32%'(比如查江苏省)

    楼主你试试。这样应该快很多。

    还有一种方式,如果表数据特别多。建议用union  按一个字段把表分区一样,然后用union


    ######木有卵用啊。。。感觉已经不是sql语句能优化的了的了######

    SELECT COUNT(1) FROM B WHERE CODE like '32%'  

    --动态以下部分

    AND PERSOINID IN (SELECT ID FROM A WHERE XXX)

    动态一下试试吧 由于A->B是一对多 那么B其实就是所有的数据 只是由于查询需要A的参数 所以要关联到A 但是如果没有A的参数 其实直接查B就可以了 对不?

    特殊情况特殊处理一下吧

    ######表分区呢######百万级的数据就分区了,我感觉有点扯啊######如果你要查询江苏全省的记录数,先把江苏区域编码整理出来用in在B表查询出 PERSOINID导入内存表,然后内存表全表和A表关联,看看性能是不是会好点。######

    1.建议把code 分成多个字段,并加上索引. 别用like,

    2.如果不join A表快的话,每页都单独取A的记录.

    2020-06-01 10:36:44
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
搭建电商项目架构连接MySQL 立即下载
搭建4层电商项目架构,实战连接MySQL 立即下载
PolarDB MySQL引擎重磅功能及产品能力盛大发布 立即下载

相关镜像