SQL样例: select * from table_a where id in ( select id from table_b where name = '' )
场景说明:
MySQL 5.6以下的子查询都会全表扫描table_a 然后每条记录去和子查询 table_b 来做join操作
理想的情况是 :
先查询出子查询里面的内容再和外面的查询进行in操作
案例测试:
5.5版本
子查询:
explain SELECT * FROM `mytest`.`table_rm001` as t1 where id in (
select id from `mytest`.`table_rm001` as t2 where t2.`bigint` = 499999
)
select_type
DEPENDENT SUBQUERY |
First SELECT in subquery, dependent on outer query |
type
-
This type replaces
ref
for someIN
subqueries of the following form:value
IN (SELECTprimary_key
FROMsingle_table
WHEREsome_expr
)unique_subquery
is just an index lookup function that replaces the subquery completely for better efficiency.
上面的子查询t2里面查询的是ID,ID又是主键,是聚簇索引,所以才走primary 。
其实一般我们想的是t1能够走主键索引,这样效率比较高。
下面我们换个字段来看看
子查询二:
explain select * from `test_xiaogu`.`table_rm001` as t1,
(select id from `test_xiaogu`.`table_rm001` as t2 where t2.`bigint` = 499999 ) as t3
where t1.id = t3.id
修改成join
explain select * from `mytest`.`table_rm001` as t1,
(select id from `mytest`.`table_rm001` as t2 where t2.`bigint` = 499999 ) as t3
where t1.id = t3.id
id |
The SELECT identifier |
table
<derived
: The row refers to the derived table result for the row with an N
>id
value of N
. A derived table may result, for example, from a subquery in the FROM
clause
5.6 版本
select version()
子查询:
explain SELECT * FROM `test_xiaogu`.`table_rm001` as t1 where id in (
select id from `test_xiaogu`.`table_rm001` as t2 where t2.`bigint` = 499999
)
5.6 改成join
explain select * from `test_xiaogu`.`table_rm001` as t1,
(select id from `test_xiaogu`.`table_rm001` as t2 where t2.`bigint` = 499999 ) as t3
where t1.id = t3.id
相关推荐
第4课 查询优化技术理论与MySQL实践(二)------子查询的优化(二) 从理论看,子查询包括的内容和范围,建立清晰的概念 从实践看,MySQL的子查询优化技术的内容和范围,明确掌握子查询优化手段 预计时间2小时,每...
### MySQL 子查询与连表查询的效率比较及优化 #### 一、子查询与连表查询概述 在SQL查询语言中,子查询与连表查询是两种非常重要的查询技术,广泛应用于各种复杂的业务场景中。为了更好地理解这两种查询方式的特点...
在本篇文章中,我们将深入探讨MySQL子查询的用法,包括单行子查询、多行子查询、关联子查询以及它们在实际应用中的示例。 1. 单行子查询 单行子查询返回单个值,常用于WHERE子句中与外部查询的字段进行比较。例如,...
2. 减少子查询,尽可能用JOIN替换,因为子查询通常效率较低。 3. 避免在SELECT语句中使用*,明确指定需要的列,减少数据传输量。 三、数据库设计优化 1. 正确设计数据库模式,减少冗余数据,防止数据不一致。 2. ...
在实际应用中,可能会遇到死锁问题,特别是在涉及子查询的更新语句中。如描述中所示,如果一个事务在更新时对子查询中的表进行锁定,可能导致其他事务尝试获取已被锁定的资源,从而引发死锁。MySQL在检测到死锁时会...
MySQL数据库中的相关子查询是一种高级查询技术,它在处理复杂的数据检索时非常有用。相关子查询的特点在于,其内部查询的执行与外部查询是紧密关联的,子查询的执行依赖于外部查询的某个属性值。这与嵌套子查询形成...
"二、mysql优化技术-定位慢查询"这一主题聚焦于如何识别和解决性能瓶颈,提升数据库的响应速度。这篇博文可能详细介绍了如何诊断和解决MySQL中的慢查询问题,而`sql.txt`文件很可能包含了一些示例SQL语句或者慢查询...
优化子查询可以通过使用JOIN操作、临时表或者将子查询结果缓存到变量中来提高效率。如果子查询结果不会改变,可以考虑使用存储过程或视图来预先计算并存储结果。 5. **子查询与联接**: 在某些情况下,子查询可以...
通过对SQL语句进行分析,避免全表扫描,合理使用JOIN操作,以及优化子查询,可以显著减少查询时间。例如,使用EXPLAIN命令预览查询执行计划,可以帮助我们理解数据库如何执行SQL语句,并找出潜在的性能瓶颈。 其次...
4. **优化统计信息**:确保定期运行ANALYZE TABLE更新表的统计信息,这有助于MySQL优化器做出更好的决策。 5. **使用物化视图**:如果某些子查询经常被用到,可以考虑创建物化视图,预先计算好结果,提高查询速度。...
MySQL 提供了多种查询优化技术,包括使用 UNION 优化、使用子查询优化、使用 JOIN 优化等。 6.3 MySQL 查询优化工具 MySQL 提供了多种查询优化工具,包括 EXPLAIN、SHOW PROFILE 等。这些工具可以帮助数据库管理员...
以下是一些深入浅出的MySQL优化策略: 1. 选择合适的字段属性: 在设计数据库表时,应尽可能减小字段宽度,以减少存储空间和查询时间。例如,邮政编码字段只需设定为CHAR(6)即可,无需使用VARCHAR或更大的类型。...
- opt_sum_query():优化子查询。 - make_join_statistics():收集联接操作的统计数据。 - choose_plan():选择最优的执行计划。 在优化过程中,优化器会考虑多种操作符和条件,如常数传播(Constant Propagation)...
#### 一、什么是MySQL优化? MySQL优化是指通过合理安排资源和调整系统参数,使得MySQL运行得更快、更节省资源的过程。优化的目的在于减少系统瓶颈,降低资源消耗,提升系统的响应速度。 #### 二、优化的主要方面 ...
- **查询优化**: 优化SQL语句,避免全表扫描和子查询,使用JOIN代替子查询,合理使用LIMIT和ORDER BY。 - **存储引擎选择**: 根据数据访问模式选择合适的存储引擎,如InnoDB支持事务处理,MyISAM适合读取密集型...
12. 优化子查询:在可能的情况下,尽量将子查询转换为JOIN操作,因为JOIN往往比子查询在性能上更优。 13. 插入数据时使用SELECT INTO:可以用来创建新表,并将数据一次性插入新表中,这是一个高效的数据复制和迁移...
MySQL 优化方法主要涵盖...总之,MySQL优化涉及多个层面,包括合理选择存储引擎、优化字段类型、建立合适索引以及编写高效的SQL语句。每个环节都对数据库性能有着直接影响,需要根据实际业务需求进行综合考虑和调整。