作者小编,最近在工作中,是主要负责报表开发,报表开发,是把大量存在数据库得数据,提炼出来,而用得是mysql数据库。Spring Cloud 框架,JPA 和mybaties 。首先,多表关联写完sql,自己捏造完数据,发现并没有多大问题,然后开始导入大批量数据,发现页面数据展现不出来了。赶紧后台看一下。这个sql执行时间也太长了把
大家可以看到,单表条数为200多万条,还关联了6张表,其中有一张还是大表,有1000多万数据
大家第一反应是需要加索引。
**
**
第一点:你先执行完sql之后,因为我用得时Navicat ,我会去看一下,剖析这个界面
因为大量时间花在了sending data 中,sending data包括“收集 + 发送 数据”。
这里的关键是为什么要收集数据,原因在于:mysql使用“索引”完成查询结束后,mysql得到了一堆的行id,如果有的列并不在索引中,mysql需要重新到“数据行”上将需要返回的数据读取出来返回个客户端。
猜测可能是索引没有添加正确
用explain跑一下sql,看索引执行情况
这里注意一点
这里有三列需要注意得
索引类型 type:参考https://www.cdsy.xyz/computer/soft/database/mysql/230514/cd43584.html
索引key:参考https://www.cdsy.xyz/computer/soft/database/mysql/230514/cd43585.html
一般我们都是建组合索引,已经足够满足了,所以,我也是做组合索引这步操作,
因为我网上看得也挺多得,但是都不是完全解决我得问题
我的是这样操作的:以主表为例,不写select * 需要什么字段,就写什么字段,然后大表的字段展示什么,都上索引,但不是什么都丢到索引,因为索引的缺点在参考里面,我就步多说了,还得注意一个点,join关联得字段,需要上索引,还要与对面表的结构要一样,就是说你这边的建表如,参考https://www.cdsy.xyz/computer/soft/database/mysql/230514/cd43586.html
我这里就是踩过坑,俩表都建了索引,join之后都没走索引,为什么,建表的时候,排序规则不一样。太尴尬了。。。一个是UTF-8bin 一个是ci
把其中一个修改一下,即可。如果不了解bin跟ci的,去百度一下,这里提前说一下,是对大小写敏感还是不敏感。然后修改即可,还要就是写的建了索引之后,sql执行没走索引,多半是你写的sql有问题。sql想要走索引参考这个https://www.cdsy.xyz/computer/soft/database/mysql/230513/cd43578.html
如上所述,我这里是自己的心得。祝大家少bug