mysql临时表关联查询_MySQL如何执行关联查询
MySQL中‘关联(join)’ 一词包含的意义比一般意义上理解的要更广泛。总的来说,MySQL认为任何一个查询都是一次‘关联’ --并不仅仅是一个查询需要到两个表的匹配才叫关联,索引在MySQL中,每一个查询,每一个片段(包括子查询,设置基于表单的select)都可能是关联。
所以,理解MySQL如何执行关联查询至关重要。我们先来看一个union 查询的例子。对于union查询,MySQL先将一系列的单个查询结果放到一个临时表中,然后再重新读出临时表数据来完成union查询。在MySQL的概念中,每个查询都是一次关联,所以读取结果的临时表也是一次关联。
当前MySQL关联执行的策略很简单:MySQL对任何关联都执行嵌套关联的操作,即MySQL在一个表中循环读出单条数据,然后在嵌套循环到下一个表中寻找匹配的行,依次下去,直到找到所有表中匹配的结果未知。然后根据各个表匹配的行,返回查询中需要的各个列。MySQL会尝试在最后一个关联表中找到所有匹配的行,如果最后一个关联表无法找到更多的行以后,MySQL会返回到上一层关联表,看是否能够找到更多的匹配记录,以此类推迭代执
按照这样的方式查找第一个表记录,在嵌套查询下一个关联表,然后回溯到上一个表,在MySQL中是通过嵌套循环的方式实现--正如其名“嵌套循环关联”。请看下面例子中的简单查询:
SELECT tbl1.col1,tbl2.col2 FROM tbl1 INNER JOIN tbl2 USING (col3) WHERE tbl1.col1 in (3,4);
假设MySQL按照查询中的表顺序进行关联操作,我们则可以用下面的伪代码表示MySQL将如何完成这个查询。
outer_iter = iterator_over tbl1 where col1 in(3,4)
outer_row = outer_iter.next
while outer_row
inner_iter = iterator over tbl2 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
out_row = outer_iter.next
end
上面的执行计划对于单表查询和多表关联查询都适用,如果是一个单表查询,那么只需要完成上面的外层的基本操作。对于外连接和上面的执行过程任然适用。例如我们将上面的查询修改如下:
SELECT tbl1.col1 ,tbl2.col2 FROM tbl1 left outer join tbl2 using (col3) WHERE tbl1.col1 in (3,4)
对应的伪代码:
outer_iter = iterator over tbl1 where col1 in(3,4)
outer row = outer_iter.next
while outer_row
inner_iter = iterator over tbl2 where col3 = outer_row.col3
inner_row = inner_iter.next
if inner row
while inner_row
out_put [outer_row.col1,inner_row.col2]
inner_row = inner_iter.next
end
else
out_put[outer_row.col1,NULL]
end
outer_row = outer_iter.next
end
另一种可视化查询执行计划的方法是根据优化器执行的路径绘制出对应的“泳道图”。
从本质上说,MySQL对所有的类型的查询都以同样的方式运行。例如,MySQL在from子句中遇到的子查询时,先执行子查询,并将其结果放到一个临时表中(MySQL的临时表时没有任何索引的,在编写复杂的子查询和关联查询的时候需要注意这一点,这一点对UION查询也一样),然后将这个临时表作为一个普通的表对的(正如其名“派生表”)。MySQL在执行union操作时也使用类似的临时表,在遇到右外连接的时候,MySQL会将素有的查询类型都转换成类似的执行计划。
不过,不是所有的查询都可以转换成上面的形式。例如,全外连接就无法通过嵌套循环和回溯的方式完成,这时当发现关联表中没有找到任何匹配行的时候,则可能是因为关联恰好是从一个没有任何匹配的表开始。这大概也是MySQL并不支持全外连接的原因。还有些场景,虽然可以转换成嵌套循环的方式,但是效率却非常差。
mysql临时表关联查询_MySQL如何执行关联查询相关推荐
- mysql关联表分页查询_MySQL一对多分页查询-主表关联表条件查询问题
文章目录 1 摘要 2 情景复现 2.1 数据模型 2.2 核心代码 2.3 测试数据 2.4 拓展一点 1 摘要 分页查询是后台项目中最常见的一种操作,在一对多(one to many)的关系表中, ...
- sql查询 关联帖子_MySQL的大分页查询该如何优化?
点击蓝色"程序猿DD"关注我哟 加个"星标",不忘签到哦 转自公众号:yangyidba 一 背景 大部分开发和DBA同行都对分页查询非常非常了解,看帖子翻页需 ...
- mysql 临时表 主键_MySQL临时表
MySQL 临时表 MySQL 临时表在我们需要保存一些临时数据时是非常有用的.临时表只在当前连接可见,当关闭连接时,Mysql会自动删除表并释放所有空间. 临时表在MySQL 3.23版本中添加,如 ...
- mysql结果作为另一次查询_MySql中一次查询结果用作二次查询条件
Sql的截取关联查询 最近在写sql时,碰到了如下情况, 需求是通过一个账户的id去查询关联的该账户下的所有简历,其中地址字段要通过另一个表进行关联查询.地址字段存的是地址表中对应的编号. 例如210 ...
- mysql范围查找性能_MYSQL(四)查询性能优化
优化数据访问 1.是否向数据库请求了不需要的数据 解决方式: A. 查询后加limit B. Select后写需要的列而不是* 2. 是否扫描了额外的数据 数据库的访问方式速度由慢到快:全表扫描,索引 ...
- mysql如何链表查询_mysql怎样两表查询?
mysql两表查询的方法:1.使用"select 字段列表 from 表1,表2 [where 条件]"进行查询:2.使用"SELECT 字段列表 FROM 表1 关键字 ...
- mysql怎样两表查询_mysql怎样两表查询?
mysql两表查询的方法:1.使用"select 字段列表 from 表1,表2 [where 条件]"进行查询:2.使用"SELECT 字段列表 FROM 表1 关键字 ...
- MySQL数据库应用 多表查询_mysql数据库-多表查询
今日任务 完成对MYSQL数据库的多表查询及建表的操作 教学目标 掌握MYSQL中多表的创建及多表的查询 掌握MYSQL中的表关系分析并能正确建表 昨天内容回顾: 数据库的创建 : create ...
- mysql 新建子查询_Mysql创建SQL子查询ALIAS
通常这些被称为视图.例如: CREATE VIEW vMyLongQuery AS SELECT a, b, c FROM (LONG QUERY) X WHERE ... 然后可以像这样引用: SE ...
- mysql多线程查询_MySQL 利用多线程提升查询性能的一种思路
转载自:http://dinglin.iteye.com/blog/1432443 背景 报表统计类的查询是一类耗时的查询.使用场景是QPS并不大,单每个查询由于需要访问较多数据,对大量数据做处理,执 ...
最新文章
- 数据结构题:根据所给权值设计相应的哈夫曼树,并设计哈夫曼编码
- 连接数据库报“You have an error in your SQL syntax”异常的解决
- ml是什么_ML,ML,谁是所有人的冠军?
- C++之实现优先队列
- Linux的errno
- matlab bwdist
- H5 WebSocket java服务端push
- Chrome 45 减少了内存占用
- 财务内部收益率用计算机怎么算,​财务内部收益率怎么算
- PDF Expert教程之批注功能详解
- golang--channal与select
- Win10移除右键无用的菜单选项--注册表的自定义管理
- 火影忍者中的天才七忍者
- 2022-2028全球与中国流量变现平台市场现状及未来发展趋势
- hadoop命令无法创建目录
- AI模型也需要资产管理,星环科技推出AI运营平台MLOps星环科技星环科技
- こっそり==そっくり==たっぷり==5分钟--完全掌握6个日语N2常考副词。---路得老师学日语...
- Flutter实现一个酷炫带动画的列表型多选日历组件
- vue3.2使用vue-wechat-title及路由导航守卫实现浏览器动态标题、替换浏览器的vue小图标
- CES Asia直击:像飞机的水下机器人你见过吗