以前总说笛卡尔积会引起数据膨胀,都没当回事,当你遇见的时候,才知道它有多可怕,还好服务器没有被我跑挂掉;
mysql的查询语句如下:
select
a.id,b.cid
from a
inner join b on a.user_name=b.user_name and b.registerdate='2021-01-24'
where a.registerdate='2021-01-24'
写了一个存储过程,按照用户的注册日期去一天一天的追加历史数据,a表和b表的的关联字段,注册日期字段,都加了索引,sql的explain堪称完美;
这一天的数据量就12万左右,按照以往的经验,最多两秒就出结果了,但是存储过程循环到这一天的时候卡了五分钟也没有查询出来,发现情况不对,当然是立马kill掉,去count了一下数据有10多亿,我的天怎么想都不可能,一去看那天的数据,发现了猫腻,原来那天,user_name字段几乎全是空字符串,上网一百度才知道,原来空字符串join会引起传说中的笛卡尔积,还好看着追历史数据,不是服务器跑挂了都不知道。