关于多表关联查询优化的问题
一个是操作记录表
一个是用户表。
操作记录表中,记录用户的操作,【其中用一个字段UserID来保存操作者(即用户)的ID】
我的查询语句是这样的:
select top 20 a.*, u.Name from 操作表 a JOIN 用户表 u on a.UserID=u.ID order by a.ID desc
(则读取最新的20条操作记录,连同操作者的姓名同是给读出来)
这样是没有问题的。
但是,当操作表数据行多到百万级时,问题来了。
【操作表已对需要查询的列创建了索引】
【用户表由于只有几十人,没有建索引】
执行上面那条语句就变得很慢!(10多20秒!)
如果我只读取操作表:
select top 20 a.* from 操作表 a order by a.ID desc
那很快,毫秒级
那么,一定要把用户姓名读出来啊,我换了另外两种写法,一定很快,毫秒级:
select top 20 a.*, u.Name from 操作表 a LEFT JOIN 用户表 u on a.UserID=u.ID order by a.ID desc
【就是把很慢的JOIN改为LEFT JOIN,就变得很快了】
如果下面这样写,也是快得不要不要的
select top 20 a.*, u.Name from 操作表 a, 用户表 u where a.UserID=u.ID order by a.ID desc
为什么只用JOIN的写法会很慢啊?
只想知道原因。
相关推荐
mysql实现多表关联统计(子查询统计)示例
主要介绍了mysql实现多表关联统计(子查询统计),结合具体案例形式分析了mysql多表关联统计的原理、实现方法及相关操作注意事项,需要的朋友可以参考下
Java 里 Hibernate 的多表关联查询优化
在 Java 开发中,Hibernate 是一个广泛使用的对象关系映射(ORM)框架,它简化了数据库操作,使开发者可以通过操作对象来间接操作数据库。然而,在实际应用中,多表关联查询是常见的需求,若处理不当,会导致查询性能低下,影响系统的响应速度和整体性能。本文的目的就是深入探讨 Hibernate 多表关联查询的优化方法,范围涵盖从基本概念到实际应用,从算法原理到代码实现的各个方面,帮助开发者掌握优化技巧,提高查询效率。
MySQL多表关联优化解析[源码]
本文系统性地解析了MySQL多表关联查询的执行机制,重点介绍了Nested Loop Join(N-LJ)的底层执行过程及其性能瓶颈。文章详细探讨了驱动表选择的重要性,并通过实战案例展示了未加索引情况下的执行计划问题及优化方法。此外,还对比了子查询与关联查询的执行效率,分析了字段级依赖子查询和带UNION的子查询的性能问题,并提供了优化建议。最后,总结了多表关联优化的核心原则,包括主外键字段建索引、控制驱动表数据量、避免SELECT子句中的子查询等,帮助开发者提升SQL查询效率。
MySQL 多表关联一对多查询实现取最新一条数据的方法示例
主要介绍了MySQL 多表关联一对多查询实现取最新一条数据的方法,结合实例形式详细分析了MySQL 多表关联一对多查询实现取最新一条数据相关原理、实现方法与操作注意事项,需要的朋友可以参考下
oracle多表查询
oracle多表查询的基本概念,例子是oracle默认的表


