18年程序员面试,23年程序员面试。
假如搜索的表很大,进行分页的时候limit100万会加载很慢,那么你是怎么解决的呢?
好的面试官这个问题在生产环境也是比较常见的。limit m.n其实是去扫描m加n条数据,然后过滤掉前面的m条数据。当m越大的时候需要扫描的数据也就越多,性能也会越来越慢。针对这种情况有以下几种方案是可以进行一定的优化的。
·第一种如果ID是趋势递增的,那么每次查询都可以返回这一次查询的最大ID,然后下次查询的时候加上大于上次最大ID的条件,这样会通过主界索引去扫描并且扫描的数量会少很多很多,因为只需要去扫描where条件的数据就可以了。
另外我准备了一份加瓦程序员求职突击手册,里面包含了简单模板热门面试题以及弹性技巧。如果有需要大家可以在评论区留言领取。
·第二种那么先limit出来主键ID,然后用主表跟查询出来的ID进行nnerjidn内连接,这样也能一定程度上面去提速。因为减少了回表,查询ID只需要去走聚集索引就可以了。
·第三种如果mysql级别优化不了了,也可以对分页的数据进行缓存,比如Redis缓存,数据进行变动的时候,那么只要去做好缓存依赖即可。
·第四种从业务的角度去进行优化,因为越往后一般用户行为会触及不到,比如去逛TB,那么不会去看后面几百页的数据。所以业务层面如果可以做一定的让步的话,那么就可以不用去做后面几百页的数据分页了。