以下内容出于“高性能MySQL”中的第6章。
一、 MySQL如何执行关联查询:
1. 很多文章中介绍说MySQL执行关联查询时是先执行from中的内容,因此会先将表根据on中的条件进行关联,之后再通过where中的条件对结果集进行过滤。
如:select tb1.col1, tb2.col2 from tb1 inner join tb2 on tb1.col3 = tb2.col3 where tb1.col1 in (5, 6);
按照这种说法是先执行“tb1 inner join tb2 on tb1.col3 = tb2.col3”,之后再执行“tb1.col1 in (5, 6)”。在这种执行顺序下,能过滤更多数据的条件应该放到on中来处理。
2. 今天读到MySQL对任何关联查询都执行“嵌套循环关联”操作,即:先在一张表中循环取出单条数据,然后再嵌套循环到下一张表中寻找匹配的行,依次下去知道找到所有表中匹配的行为止。然后根据匹配的行返回查询中需要的各个列,MySQL会尝试在最后一张关联表中找到所有匹配的行,如果无法找到更多的行则会返回到上一层次关联表。
按照这种说法,具体的执行顺序伪码为:
outer_iter = iterator over tb1 where col1 in (5, 6)
outer_row = outer_iter.next
while outer_row
inner_iter = iterator over tb2 where col3 = outer_row.col3
inner_row = inner_iter.next
while inner_row
output [outer_row.col1, inner_row.col2]
inner_row = inner_iter.next
end
outer_row = outer_iter.next
end
按照这种“嵌套循环关联”的执行顺序,MySQL会优先使用where条件来过滤第一张表,之后再以结果集和关联条件过滤下一张表。在这种情况下能过滤更多数据的条件应该放到where条件中。
二、 关联子查询:
如下SQL: select * from film where film_id in (select film_id from film_actor where actor_id = 1);
1. 一般认为MySQL会先执行子查询返回所有包含actor_id为1的film_id,也就是说是这样执行的:
result: select film_id from film_actor where actor_id = 1;
select * from film where film_id in (result);
2. 在实际中,MySQL会将相关的外层表压入到子查询中,也就是说会将查询改写成:
select * from film where exists ( select * from film_actor where actor_id = 1 and film_actor.film_id = film.film_id);
这样的结果是,在执行时会先选择对film表进行全表扫描,然后根据返回的file_id逐个执行子查询。
可以考虑将这个查询修改为:select film.* from film inner join film_actor on film_actor.film_id = film.film_id where actor_id = 1;
相关推荐
MySQL数据字典导出工具是一款高效实用的软件,专为数据库管理员和开发...只需几个简单的步骤,就能将复杂的数据库信息整理得井井有条,大大减轻了工作负担。因此,如果你经常处理MySQL数据库,这款工具绝对值得你拥有。
要解决连接超时问题,需要从以下几个方面入手: 1. 调整 wait_timeout 参数的值,使其合理化。 2. 在 Hibernate 框架中,使用 Connection.isValid() 方法来测试连接的有效性。 3. 使用 Connector/J 连接属性 '...
这个软件包原来的名字是 LAMPP,但是为了避免误解,最新的几个版本就改名为 XAMPP 了。它可以在Windows、Linux、Solaris、Mac OS X 等多种操作系统下安装使用,支持多语言:英文、简体中文、繁体中文、韩文、俄文、...
这个工具适用于已经安装了Office Word 2010或2016的系统,特别是针对MySQL和MS SQL Server这两种广泛应用的数据库管理系统。 1. **MySQL数据库**:MySQL是一种开源、免费的关系型数据库管理系统,广泛应用于互联网...
这里的“Win32”可能是一个误解,通常在Windows平台上,"Win32"指的是32位系统,但这里与"VC11-x64"结合,它实际上指的是该版本是为64位(x64)系统设计的。"VC11"则表示这个PHP构建是使用Visual C++ 11编译器完成的...
一个系统设计说明书通常会涵盖以下几个重要知识点: 1. 系统概述:包括图书管理系统的定义、目标、功能及使用范围。 2. 技术选型:涉及系统采用的技术栈,比如: - 数据库管理系统:文件中提到的“MySQL”指明了...
该工具的使用流程通常包括以下几个步骤: 1. 连接数据库:用户需要提供数据库连接信息,如服务器地址、端口号、数据库名、用户名和密码,以便工具能够连接到相应的数据库。 2. 选择要分析的对象:用户可以选择要生成...
在Mysql和Oracle这两种广泛使用的数据库管理系统中,有时我们需要处理中文字符,特别是在字段命名或数据分析时。标题提到的"中文转全拼中文转简拼工具.rar"是一款针对这种情况设计的实用软件,它能够帮助用户将中文...
此部分可能包括以下几个方面: 1. 用户界面:设计简洁易用的界面,使学生能快速报告维修问题,如图片上传、故障描述等。 2. 数据交互:实现客户端与服务器的数据同步,确保报修信息的实时传递。 3. 通知功能:当维修...
在编写SQL语句时,只需输入几个关键字,软件就能自动提供可能的完成选项,包括表名、列名、函数、存储过程等,这大大减少了手动键入的时间,使得编写复杂查询变得轻松快捷。此外,它还能根据上下文提供准确的提示,...
在IT行业中,尤其是在财务软件开发或者数据处理领域,将大金额数字转换成中文传统格式是一项常见的需求。中文的数字表达方式具有独特的规则,从壹到兆的每一个单位都有其特定的对应,使得数字读写更加直观且符合中国...
根据提供的文档内容,我们可以总结和扩展出以下几个关键知识点: ### 1. MySQL中存储过程与函数的调用 - **存储过程**: 在MySQL中,存储过程可以通过`CALL`语句来调用。例如,如果有一个名为`sp`的存储过程,那么...
根据提供的文档内容,我们可以总结和解析出以下几个关键知识点: ### 1. 存储设备的认识 - **硬盘**:文档中的第一题指出“硬盘装在机箱内面,属于内存储器。”这是不正确的。硬盘虽然位于计算机内部,但它实际上是...
这里澄清了一个常见的误解,即加密前的数据被称为明文,加密后的数据被称为密文,而将明文转换为密文的过程称为加密,而非解密。 ### 5. 内存和外存的区别 - **知识点**: 题目指出了一种错误的说法:“和内存储器...
然而,由于标签指定为“Java”,我们可以假设这是一个误解,实际上可能是用Java来实现的类似系统。在这种情况下,开发环境可能会是Eclipse、IntelliJ IDEA或NetBeans等Java集成开发环境(IDE),搭配使用Maven或...
为了充分利用DBCHM v1.7.3.8,用户需要掌握以下几个关键步骤: 1. **安装与启动**:下载并安装DBCHM软件,运行后设置语言和界面偏好。 2. **连接数据库**:输入数据库的相关连接信息,如服务器地址、用户名、密码...
JSP作为一项连接技术,它成功地将其他多种技术整合在一起,因此要想成为一名成功的JSP程序员,就需要先掌握以下几个核心技能。 #### 二、必备基础知识概述 1. **Java基础知识**:理解Java的基本语法和面向对象编程...
与其他常见的SQL数据库引擎相比,SQLite3的数据类型和存储机制有着独特的特点。在SQLite3中,数据类型的定义并不像MySQL或SQL Server那样严格,而是采用了一套动态类型系统。 首先,SQLite3只有五种基本的存储类型...
在Java中,JDBC程序主要涉及以下几个关键步骤: 1. **加载驱动**:首先,我们需要加载对应数据库的JDBC驱动。这通常通过`Class.forName()`方法完成,例如,对于MySQL,我们会加载"com.mysql.jdbc.Driver"。 2. **...
13. **Internet的性质**:题目指出了一个常见的误解,即认为Internet是一个局域网。实际上,Internet是一个全球性的网络系统,因此正确答案为“错误”。 ### HTML标题标签 14. **HTML标题标签的使用**:在HTML中,...