有两个 mysql 优化的问题求指导

2020-10-09 15:09:17 +08:00
 enjoychen0318
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

问题:

  1. t1 和 t2 的数据量都是 100w,有时候因为 where 条件的不同,导致 join 的时候驱动表会变化,当 t2 作为驱动表的时候 t1 排序就使用不到索引了。在不强制选择驱动表的情况下,有啥优化方案么?

  2. 现在我们公司后台管理有个列表页查询关联的表有点多,筛选条件也比较多,count 和查询都有点慢,但是关联的表应该是不能少。这个时候该怎么优化?做缓存可行么,比如说将筛选条件作为 key 缓存起来。但数据更新快,感觉缓存失效的情况太多,这种方法不太可行

有大佬能帮帮忙么

2410 次点击
所在节点    MySQL
3 条回复
PonysDad
2020-10-09 20:18:02 +08:00
把查询计划贴上来看看
enjoychen0318
2020-10-10 10:30:36 +08:00
@PonysDad
有 t2 的 where 时,mysql 优化器认为 t2 是小表,选择 t2 做驱动表的时候会 Using temporary; Using filesort
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 出来看下呢 如果不是强一致缓存倒是一个方法,更新快不是问题 可以在包个内存缓存定时同步不过就麻烦了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/713333

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX