打卡第七天,标题的内容在下面分享,这里先分享一个最近的坚持了挺久的一件事,那就是在极客时间上看林晓斌老师的MySQL实战45讲,虽然现在还没有看完,但是挺有收获的,特别是当时工作时,有个同事就在因为索引查询太慢的事情很惆怅,因为查询的那个字段数据太长了,导致查询太慢。然后当天我刚好就看到了一个索引的技巧,就是只对某个字段的固定长度加索引(查了下是在极客时间第11节的内容,有兴趣的同学可以去看看)。后来确实也是如此优化,刚好就解决了查询慢的事情。当时就觉得好巧那天就看到了个技巧。赞!
就是一个邮箱字段,然后需要查询的时候直接对前六位进行加索引,如:
mysql> alter table t_user add index index(email(6));
对于数据库的优化方面,我想林老师讲的比我详细得多得多,这里就不敢班门弄斧啦。这里就进入主题哈,说一个业务中查表缓存优化的点。
我们业务中有时需要在for循环中对某个字段进行重新查表赋值,比如查询用户数据时,本身用户表没有保存用户的头像图片信息,我们就需要到图片表中再查一次,for循环可能就是列表页查询多个用户时,需要每个用户去查询自己的图片地址,再对对象进行赋值回显。这样如果一页数据有50条用户数据,那么在for循环中就要遍历查询50次图片表,进行赋值了。这样是很可怕的。当然有同学说,可以直接在第一次查询用户数据的时候就关联图片表,不就可以直接查询出来了么。是这么个道理,但是!如果不止是图片表呢,还有其他信息,一张表查询中关联太多个表数据,肯定会造成数据查询越来越慢的现象。
这里是建议直接就查用户表,再取用户表中的用户Id数据idList,在根据这些idList去用户表中进行in查询,查询出来的数据就是这里的图片信息了。然后随手就生成一个Map<Long, String> id2ImgUrlMap的对象(id与图片url的映射Map),最后在进行for循环遍历的时候就可以直接通过id2ImgUrlMap.get(id)直接取到数据啦,顺利完成!
这种思想也可以称作是用空间换时间的套路吧,哈哈哈!如果对你有用的话,记得点个赞哦!