`
yjingy
  • 浏览: 2013 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

MySQL常见的几个误解

阅读更多

以下内容出于“高性能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数据字典导出工具是一款高效实用的软件,专为数据库管理员和开发...只需几个简单的步骤,就能将复杂的数据库信息整理得井井有条,大大减轻了工作负担。因此,如果你经常处理MySQL数据库,这款工具绝对值得你拥有。

    关于MySQL的wait-timeout连接超时问题报错解决方案.docx

    要解决连接超时问题,需要从以下几个方面入手: 1. 调整 wait_timeout 参数的值,使其合理化。 2. 在 Hibernate 框架中,使用 Connection.isValid() 方法来测试连接的有效性。 3. 使用 Connector/J 连接属性 '...

    PHP集成环境XAMPP的安装与配置

    这个软件包原来的名字是 LAMPP,但是为了避免误解,最新的几个版本就改名为 XAMPP 了。它可以在Windows、Linux、Solaris、Mac OS X 等多种操作系统下安装使用,支持多语言:英文、简体中文、繁体中文、韩文、俄文、...

    表结构导出为Word

    这个工具适用于已经安装了Office Word 2010或2016的系统,特别是针对MySQL和MS SQL Server这两种广泛应用的数据库管理系统。 1. **MySQL数据库**:MySQL是一种开源、免费的关系型数据库管理系统,广泛应用于互联网...

    php-5.5.16-Win32-VC11-x64

    这里的“Win32”可能是一个误解,通常在Windows平台上,"Win32"指的是32位系统,但这里与"VC11-x64"结合,它实际上指的是该版本是为64位(x64)系统设计的。"VC11"则表示这个PHP构建是使用Visual C++ 11编译器完成的...

    图书管理系统详细设计说明书.pdf

    一个系统设计说明书通常会涵盖以下几个重要知识点: 1. 系统概述:包括图书管理系统的定义、目标、功能及使用范围。 2. 技术选型:涉及系统采用的技术栈,比如: - 数据库管理系统:文件中提到的“MySQL”指明了...

    布扣数据字典生成器 支持多种数据库的数据字典生成

    该工具的使用流程通常包括以下几个步骤: 1. 连接数据库:用户需要提供数据库连接信息,如服务器地址、端口号、数据库名、用户名和密码,以便工具能够连接到相应的数据库。 2. 选择要分析的对象:用户可以选择要生成...

    中文转全拼中文转简拼工具.rar

    在Mysql和Oracle这两种广泛使用的数据库管理系统中,有时我们需要处理中文字符,特别是在字段命名或数据分析时。标题提到的"中文转全拼中文转简拼工具.rar"是一款针对这种情况设计的实用软件,它能够帮助用户将中文...

    基于Android和Java Web的学生公寓智能报修系统设计.zip

    此部分可能包括以下几个方面: 1. 用户界面:设计简洁易用的界面,使学生能快速报告维修问题,如图片上传、故障描述等。 2. 数据交互:实现客户端与服务器的数据同步,确保报修信息的实时传递。 3. 通知功能:当维修...

    sql prompt5.0

    在编写SQL语句时,只需输入几个关键字,软件就能自动提供可能的完成选项,包括表名、列名、函数、存储过程等,这大大减少了手动键入的时间,使得编写复杂查询变得轻松快捷。此外,它还能根据上下文提供准确的提示,...

    大金额转换到中文格式从壹到兆的几种方案

    在IT行业中,尤其是在财务软件开发或者数据处理领域,将大金额数字转换成中文传统格式是一项常见的需求。中文的数字表达方式具有独特的规则,从壹到兆的每一个单位都有其特定的对应,使得数字读写更加直观且符合中国...

    2021-2022计算机二级等级考试试题及答案No.3231.docx

    根据提供的文档内容,我们可以总结和扩展出以下几个关键知识点: ### 1. MySQL中存储过程与函数的调用 - **存储过程**: 在MySQL中,存储过程可以通过`CALL`语句来调用。例如,如果有一个名为`sp`的存储过程,那么...

    2021-2022计算机二级等级考试试题及答案No.12863.docx

    根据提供的文档内容,我们可以总结和解析出以下几个关键知识点: ### 1. 存储设备的认识 - **硬盘**:文档中的第一题指出“硬盘装在机箱内面,属于内存储器。”这是不正确的。硬盘虽然位于计算机内部,但它实际上是...

    2021-2022计算机二级等级考试试题及答案No.14107.docx

    这里澄清了一个常见的误解,即加密前的数据被称为明文,加密后的数据被称为密文,而将明文转换为密文的过程称为加密,而非解密。 ### 5. 内存和外存的区别 - **知识点**: 题目指出了一种错误的说法:“和内存储器...

    java 小项目(电脑销售管理系统)

    然而,由于标签指定为“Java”,我们可以假设这是一个误解,实际上可能是用Java来实现的类似系统。在这种情况下,开发环境可能会是Eclipse、IntelliJ IDEA或NetBeans等Java集成开发环境(IDE),搭配使用Maven或...

    简单操作的数据库转文档工具

    为了充分利用DBCHM v1.7.3.8,用户需要掌握以下几个关键步骤: 1. **安装与启动**:下载并安装DBCHM软件,运行后设置语言和界面偏好。 2. **连接数据库**:输入数据库的相关连接信息,如服务器地址、用户名、密码...

    jsp入门学习-如何成为jsp程序员

    JSP作为一项连接技术,它成功地将其他多种技术整合在一起,因此要想成为一名成功的JSP程序员,就需要先掌握以下几个核心技能。 #### 二、必备基础知识概述 1. **Java基础知识**:理解Java的基本语法和面向对象编程...

    Sqlite3中存储类型和数据类型结合文档解析1

    与其他常见的SQL数据库引擎相比,SQLite3的数据类型和存储机制有着独特的特点。在SQLite3中,数据类型的定义并不像MySQL或SQL Server那样严格,而是采用了一套动态类型系统。 首先,SQLite3只有五种基本的存储类型...

    jdbc-programs-in-java:Java中的JDBC程序

    在Java中,JDBC程序主要涉及以下几个关键步骤: 1. **加载驱动**:首先,我们需要加载对应数据库的JDBC驱动。这通常通过`Class.forName()`方法完成,例如,对于MySQL,我们会加载"com.mysql.jdbc.Driver"。 2. **...

    2021-2022计算机二级等级考试试题及答案No.5482.docx

    13. **Internet的性质**:题目指出了一个常见的误解,即认为Internet是一个局域网。实际上,Internet是一个全球性的网络系统,因此正确答案为“错误”。 ### HTML标题标签 14. **HTML标题标签的使用**:在HTML中,...

Global site tag (gtag.js) - Google Analytics