暂无图片
MySQL 联合查询是怎么使用索引,select * from a left join b on ... where b.time between .....,查询条件在b,b上有相应索引,a是主表,数据量大,查询计划显示a全表扫描了,怎么优化?
我来答
分享
暂无图片 匿名用户
MySQL 联合查询是怎么使用索引,select * from a left join b on ... where b.time between .....,查询条件在b,b上有相应索引,a是主表,数据量大,查询计划显示a全表扫描了,怎么优化?

MySQL 联合查询是怎么使用索引,select * from a left join b on … where b.time between …,查询条件在b,b上有相应索引,a是主表,数据量大,查询计划显示a全表扫描了,怎么优化?

我来答
添加附件
收藏
分享
问题补充
4条回答
默认
最新
披头

有如下几点可以考虑:

1、在 a 表上建立索引,并能够与 b 表的查询条件想关联;

2、将 a/b 表位置互换;

3、核实业务逻辑,考虑在 a 表上进行过滤或者限制其返回行数。

暂无图片 评论
暂无图片 有用 0
chengang

如果B表是小表。且b.time有好的过滤性。
且A表在关联字段上有索引的话。mysql优化器会自动把B表做驱动表的。

暂无图片 评论
暂无图片 有用 0
毛毛虫

在MySQL联合查询中,如果查询条件在右表(即被连接的表)上有索引,那么MySQL会尽可能地使用该索引进行查询优化。但是,如果查询计划显示左表(即主表)被全表扫描了,可能是因为MySQL没有使用到右表上的索引,或者使用了全表扫描而不是索引扫描。

以下是一些优化建议:

  1. 确保右表上的查询条件列有索引。可以使用EXPLAIN语句来查看查询计划,确认是否使用了索引。

  2. 尝试将WHERE子句中的条件移到JOIN操作之前,这样MySQL可以更好地利用索引。例如,将WHERE子句中的b.time between …改为b.time BETWEEN … AND …。

  3. 如果右表上的查询条件列不支持范围查询,可以考虑使用其他类型的索引,如前缀索引或全文索引。

  4. 如果右表上的查询条件列非常大,可以考虑将其拆分成多个较小的列,并为每个列创建单独的索引。

  5. 如果以上优化方法都无法解决问题,可以考虑对左表进行分区或使用其他数据库技术来提高查询性能。

暂无图片 评论
暂无图片 有用 0
张sir

把执行计划和表结构贴出来看下,另外可以尝试用STRAIGHT_JOIN指定驱动表试试

暂无图片 评论
暂无图片 有用 0
回答交流
提交
问题信息
请登录之后查看
邀请回答
暂无人订阅该标签,敬请期待~~
暂无图片墨值悬赏