mysql中semi-join的优化策略介绍
来源:互联网 发布:linux tomcat启动java 编辑:程序博客网 时间:2024/05/17 06:03
转自:http://blog.sina.com.cn/s/blog_4673e60301011qvx.html
1. 背景介绍
什么是semi-join?所谓的semi-join是指semi-join子查询。 该子查询具有如下结构:
SELECT ... FROM outer_tables WHERE expr IN (SELECT ... FROM inner_tables ...) AND ...
即在where条件的“IN”中的那个子查询。这种查询的特点是我们只关心outer_table中与semi-join相匹配的记录。
换句话说,最后的结果集是在outer_tables中的,而semi-join的作用只是对outer_tables中的记录进行筛选。这也是我们进行semi-join优化的基础,即我们只需要从semi-join中获取到最少量的足以对outer_tables记录进行筛选的信息就足够了。
Semi-join从一个表中返回的行与另一个表中数据行进行不完全联接查询(查找到匹配的数据行就返回,不再继续查找)。
Anti-semi-join从一个表中返回的行与另一个表中数据行进行不完全联接查询,然后返回不匹配的数据。
还可参考mysql 官网:http://dev.mysql.com/doc/refman/5.6/en/subquery-optimization.html
以如下语句为例:
select * from Country where Country.Code in (select City.country from City where City.Population>1*1000*1000);
当中的semi-join: “select City.country from City where City.Population>1*1000*1000
” 可能返回的结果集如下: China(Beijin), China(Shanghai), France(Paris)...我们可以看到这里有2个China,分别来至2条城市记录Beijin和Shanghai, 但实际上我们只需要1个China就足够对outer_table
2. Mysql支持的Semi-join策略
Mysql支持的semi-join策略主要有5个,它们分别为:
1. DuplicateWeedout: 使用临时表对semi-join产生的结果集去重。
对应的匹配条件为:
2. FirstMatch: 只选用内部表的第1条与外表匹配的记录。
对应的匹配条件为:
3. LooseScan: 把inner-table数据基于索引进行分组,取每组第一条数据进行匹配。
对应的匹配条件为:
4. Materializelookup: 将inner-table去重固化成临时表,遍历outer-table,然后在固化表上去寻找匹配。
对应的匹配条件:
5. MaterializeScan: 将inner-table去重固化成临时表,遍历固化表,然后在outer-table上寻找匹配。
对应的条件:
参考:
1.mysql代码 (sql/sql_select.cc 的setup_semijoin_dups_elimination函数)
2.askmonty的knowledgebase
- mysql中semi-join的优化策略介绍
- mysql中semi-join的优化策略介绍
- mysql中semi-join的优化策略介绍
- MySQL优化案例---半连接(semi join)优化方式 导致的查询性能低下
- 简单介绍join,outer-join,semi-join,anti-join的区别
- 简单介绍join,outer-join,semi-join,anti-join的区别
- 简单介绍join,outer-join,semi-join,anti-join的区别
- 简单介绍join,outer-join,semi-join,anti-join的区别
- mysql的join优化
- 使用exists(Semi-Join)优化distinct语句
- HIVE 中内连接(JOIN ON)与LEFT SEMI JOIN查询结果不一致的分析
- HIVE 中内连接(JOIN ON)与LEFT SEMI JOIN查询结果不一致的分析
- HIVE中join、semi join、outer join举例详解
- HIVE中join、semi join、outer join举例详解
- Hive中join, outer join, semi join区别
- HIVE中join、semi join、outer join举例详解
- HIVE中join、semi join、outer join举例详解
- HIVE中join、semi join、outer join举例详解
- GridView自定义TemplateField————把同一行中的内容分成多行显示///////若行数太多,则分行显示
- MzTreeView
- 2013年1月编程语言排行榜:移动编程语言的巅峰
- Android ListActivity和实例分析
- JS中数组操作总结
- mysql中semi-join的优化策略介绍
- 通讯录联系人姓名排序
- 数组指针和指针数组的区别
- linux 下安装protobuf-c
- repo准备和代码下载
- linux下IPTABLES配置详解
- iOS电话面试题库
- PKU 3233 经典矩阵乘法
- 数据结构 + BFS uva 11234 - Expressions