图片.png
    图片.png
    功能概述:需要筛选出完全满足tag的素材

    第一版:主表left join 关系表 得到的数据是这样的
    id name tag
    1 张三 1
    1 张三 2
    这样的数据肯定做不了筛选的,然后用到了一个函数 group concat 在group by “id”的情况下,也就是id相同的情况,拿到id对应的所以tag 于是得到了这样的数据
    id name tag
    1 张三 1,2
    然后拿到这个临时表之后 用find in set函数,去筛选tag,至此第一版sql写完了,功能完成了,但是有性能问题

    第二版:数据量在5000以上的时候,就开始接口速度变慢了,当时解决办法是不直接select *,而是搜索需要的字段,然后在where 和order by字段上加上索引

    第三版: 由于之前都是测试数据,有个问题尚未发现,在爬虫导入真实数据后,发现接口又变慢了,由于需要查询的一个字段为longtext,一条数据里面的content就很大,和数据库io很慢,于是当时想了一个解决办法就是,不直接存储文字,而是存储二进制,于是新建了一个字段 类型为blob ,爬虫导入和接口新增时,进行压缩,取数据的时候进行解压,于是接口又快些了

    第四版:在数据主表10w,关系表50w的情况下,又出现了性能问题,这次怎么加索引和减少字段都不管用了,
    直接让关系表内连接自己,最后形成一张大的临时表再内连接主表,这样性能问题就解决了图片.pngps
    最后把项目部署在内网还出了一些问题,内网的数据库还没有加索引,然后准备在内网数据库加索引之后,关于整个这个表的所有操作全部失败了,然后打开项目日志发现Waiting for table metadata lock
    百度之后发现是因为在执行ddl操作时,如果有未提交的事务,就会陷入这种状态,后续关于这个表的所有操作都会wait,当时的解决办法是通过show prolesslist 查看所有mysql线程,然后kill掉导致表锁死的线程,如果想后续也解决这个问题可以把超时时间设置长一点,mysql默认好像是一年