
create table t1( id int primary key, a int, b int ); create table t2( id int primary key, a int, b int ); select t1.*, t2.* from t1 left join t2 on t1.a = t2.b where XXXX order by t1.id desc limit 1,10 问题:
t1 和 t2 的数据量都是 100w,有时候因为 where 条件的不同,导致 join 的时候驱动表会变化,当 t2 作为驱动表的时候 t1 排序就使用不到索引了。在不强制选择驱动表的情况下,有啥优化方案么?
现在我们公司后台管理有个列表页查询关联的表有点多,筛选条件也比较多,count 和查询都有点慢,但是关联的表应该是不能少。这个时候该怎么优化?做缓存可行么,比如说将筛选条件作为 key 缓存起来。但数据更新快,感觉缓存失效的情况太多,这种方法不太可行
有大佬能帮帮忙么
1 PonysDad 2020-10-09 20:18:02 +08:00 via iPhone 把查询计划贴上来看看 |
2 enjoychen0318 OP @PonysDad 有 t2 的 where 时,mysql 优化器认为 t2 是小表,选择 t2 做驱动表的时候会 Using temporary; Using filesort |
3 XDJI 2020-10-10 18:16:24 +08:00 1.首先你这个 left join t2 on t1.a = t2.b 用 join buffer 了 直接 t1 单次 t2 多次全表扫描了 给 t1.a t2.b 加个索引试下呢 2.得看你的语句 explain 出来看下呢 如果不是强一致缓存倒是一个方法,更新快不是问题 可以在包个内存缓存定时同步不过就麻烦了 |