内容来自 https://www.cnblogs.com/zhengyun_ustc/p/slowquery1.html
——联表查询的基础知识——
引子:为什么第一个查询using temporary,第二个查询不用临时表呢?
下面两个查询,它们只差了一个order by,效果却迥然不同。
第一个查询:
EXPLAIN extended
SELECT ads.id
FROM ads, city
WHERE
city.city_id = 8005
AND ads.status = 'online'
AND city.ads_id=ads.id
ORDER BY ads.id desc
执行计划为:
id select_type table type possible_keys key key_len ref rows filtered Extra
------ ----------- ------ ------ -------------- ------- ------- -------------------- ------ -------- -------------------------------
1 SIMPLE city ref ads_id,city_id city_id 4 const 2838 100.00 Using temporary; Using filesort
1 SIMPLE ads eq_ref PRIMARY PRIMARY 4 city.ads_id 1 100.00 Using where
第二个查询:
EXPLAIN extended
SELECT ads.id
FROM ads,city
WHERE
city.city_id =8005
AND ads.status = 'online'
AND city.ads_id=ads.id
ORDER BY city.ads_id desc
------ ----------- ------ ------ -------------- ------- ------- -------------------- ------ -------- ---------------------------
1 SIMPLE city ref ads_id,city_id city_id 4 const 2838 100.00 Using where; Using filesort
1 SIMPLE ads eq_ref PRIMARY PRIMARY 4 city.ads_id 1 100.00 Using where
1)指定了联接条件时,满足查询条件的记录行数少的表为[驱动表];
2)未指定联接条件时,行数少的表为[驱动表](Important!)。
永远用小结果集驱动大结果集(Important!)!
——实例讲解——
explainSELECT mb.id, ……FROMmb LEFT JOIN mbei ON mb.id=mbei.mb_id INNER JOINu ON mb.uid=u.uidWHERE 1=1ORDER BY mbei.apply_time DESClimit 0,10
------ ----------- ------ ------ -------------- -------------- ------- ------------------- ------- --------------------------------------------
1 SIMPLE mb index userid userid 4 (NULL) 6060455 Using index; Using temporary; Using filesort
1 SIMPLE mbei eq_ref mb_id mb_id 4 mb.id 1
1 SIMPLE u eq_ref PRIMARY PRIMARY 4 mb.uid 1 Using index
explainSELECT mb.id……FROM mb JOIN mbei ON mb.id=mbei.mb_id INNER JOINu ON mb.uid=u.uidWHERE 1=1ORDER BY mbei.apply_time DESClimit 0,10
------ ----------- ------ ------ -------------- ------- ------- ---------------------------- ------ --------------
1 SIMPLE mbei ALL mb_id (NULL) (NULL) (NULL) 13383 Using filesort
1 SIMPLE mb eq_ref PRIMARY,userid PRIMARY 4 mbei.mb_id 1
1 SIMPLE u eq_ref PRIMARY PRIMARY 4 mb.uid 1 Using index
优化第一步之分支1:根据驱动表的字段排序,好吗?
explainSELECT mb.id……FROM mb LEFT JOIN mbei ON mb.id=mbei.mb_id INNER JOINu ON mb.uid=u.uidWHERE 1=1ORDER BY mb.id DESClimit 0,10
------ ----------- ------ ------ -------------- -------------- ------- ------------------- ------ -----------
1 SIMPLE mb index userid PRIMARY 4 (NULL) 10
1 SIMPLE mbei eq_ref mb_id mb_id 4 mb.id 1 Using index
1 SIMPLE u eq_ref PRIMARY PRIMARY 4 mb.uid 1 Using index
优化第二步:去除所有JOIN,让MySQL自行决定!
explainFROM mb,mbei,uSELECT mb.id……
WHERE
mb.id=mbei.mb_id
and mb.uid=u.user_id
order by mbei.apply_time desc
limit 0,10
------ ----------- ------ ------ -------------- ------- ------- ---------------------------- ------ --------------
1 SIMPLE mbei ALL mb_id (NULL) (NULL) (NULL) 13388 Using filesort
1 SIMPLE mb eq_ref PRIMARY,userid PRIMARY 4 mbei.mb_id 1
1 SIMPLE u eq_ref PRIMARY PRIMARY 4 mb.uid 1 Using index
最后的总结:
不要过于相信你的运气!不要相信你的开发环境里SQL的执行速度!请拿起 explain 武器,如果你看到以下现象,请优化:
- 出现了Using temporary;
- rows过多,或者几乎是全表的记录数;
- key 是 (NULL);
- possible_keys 出现过多(待选)索引。
记住,explain 是一种美德!
相关推荐
在“基于案例学习SQL优化”的课程中,我们主要探讨如何提升数据库性能,特别是针对SQL查询的优化技巧。DBA(数据库管理员)作为关键角色,需要掌握这些技能来确保系统的高效运行。以下是根据课程标题和描述提炼出的...
第2章 风驰电掣——有效缩短SQL优化过程 24 2.1 SQL调优时间都去哪儿了 25 2.1.1 不善于批处理频频忙交互 25 2.1.2 无法抓住主要矛盾瞎折腾 25 2.1.3 未能明确需求目标白费劲 26 2.1.4 没有分析操作难度乱调优...
根据提供的文件信息,本文将对《基于Oracle的SQL优化》这一主题进行深入解析,包括但不限于SQL优化的重要性、Oracle数据库的特点以及具体的SQL优化方法等。 ### SQL优化的重要性 SQL(Structured Query Language)...
本主题"基于案例学SQL优化"将深入探讨如何通过实际案例来理解和实践SQL优化的策略和技术。 首先,我们要明确SQL优化的重要性。当数据库规模增大,查询复杂度增加时,未优化的SQL语句可能导致响应时间过长,影响用户...
本书籍集合了丰富的SQL优化知识,旨在帮助读者深入理解并掌握MySQL SQL优化技巧。 首先,我们要明白SQL优化的基本原则:减少查询次数、减小数据量、合理设计索引以及优化查询语句结构。这四个原则贯穿于整个SQL优化...
1. **SQL基础**:包括SELECT语句的基本构造、JOIN操作、子查询以及聚合函数等,这些都是SQL优化的基础。 2. **索引优化**:索引是提升查询速度的关键,了解何时创建何种类型的索引(如B树索引、位图索引、函数索引...
在SQL Server数据库管理系统中,SQL优化是提升系统性能的关键环节。SQL优化涉及到多个层面,包括查询设计、索引策略、存储过程优化、执行计划分析以及资源管理等。本篇文章将深入探讨这些方面,帮助读者理解如何针对...
在IT行业中,SQL优化是一项至关重要的技能,尤其是在大型企业或数据密集型应用中。Oracle SQL优化是数据库管理员和开发人员日常工作中不可或缺的部分,因为它直接影响到系统的性能和响应时间。以下是对"sql优化经验...
在MySQL中,优化LEFT JOIN 的关键是确保表的读取顺序和依赖性,表B应依赖于表A及所有A依赖的表。WHERE和HAVING子句通常与JOIN条件一起优化,但如果WHERE条件排除了LEFT JOIN生成的NULL行,可以转换为等值JOIN,从而...
本文将深入探讨数据库面试中的常见问题,特别是关于SQL优化和针对大规模数据库的优化策略。首先,我们来看看"数据库面试题索引sql优化.pdf"可能涵盖的内容。 1. **SQL基础与语法**:面试通常会涉及到SQL的基本概念...
MySQL的SQL优化是数据库管理中的重要环节,尤其对于有经验的开发者来说,了解并掌握这一技能可以显著提升数据库性能,减少资源消耗。SQL优化主要涉及查询效率、索引使用、查询语句结构优化等多个方面。 首先,理解...
SQL优化是提高数据库性能的关键环节,它涉及到查询效率、资源消耗以及数据处理速度等多个方面。在这个主题中,我们将深入探讨SQL优化的一些核心概念和实践策略。 首先,理解索引对SQL查询的影响至关重要。索引是...
在Oracle环境中,SQL优化对于提升系统性能、减少资源消耗至关重要。本篇文章将深入探讨Oracle中的SQL优化技术,包括理解执行计划、索引优化、连接优化、子查询优化、缓存策略以及SQL调优工具的使用。 1. **理解执行...
在SQL优化实践中,确保数据库高效运行是至关重要的。本文主要关注如何找到需要优化的SQL语句,遵循正确的优化原则,并通过实例分析展示优化方法。以下是一些关键知识点: 首先,定位需要优化的SQL语句是优化的第一...
在SQL优化初级学习中,掌握基本概念和技术是至关重要的。SQL(Structured Query Language)是用于管理关系数据库的标准语言,而优化则是提升SQL查询性能的关键环节。以下是一些关于SQL优化的基础知识: 1. **理解...
在SQL优化领域,提高数据库性能是一项至关重要的任务。"sql优化脚本"通常是指一系列用于改进查询效率、减少资源消耗和提升系统响应时间的代码片段。以下是对这些知识点的详细阐述: 1. **查询优化**:SQL查询优化是...
SQL优化小工具是一款非常实用的辅助程序,专为数据库管理员和开发人员设计,旨在帮助他们更有效地管理和优化SQL查询。这个工具的主要功能是将复杂的、难以阅读的SQL语句整理成清晰、规范的格式,提高代码的可读性...
文章首先介绍了基本的 SQL 语句,包括 LEFT JOIN 和 INNER JOIN 的区别、LIKE 和 NOT LIKE 的模糊查询、DECODE 函数的使用、CASE WHEN THEN 语句的应用、字符串拼接的方法、日期函数 TO_DATE 和 TO_CHAR 的使用、...
在Oracle数据库中,SQL优化是一个至关重要的环节,它能够显著提高数据库查询的效率和性能。本文将详细介绍Oracle SQL中的“提示”(HINT)技术,这是Oracle SQL优化中使用的一项辅助手段,通过为查询提供额外的优化...