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
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
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的记录.
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。