LooseScan执行semi-join子查询的一种策略。

我们将通过示例来演示这种松散(LooseScan)策略。
假设,我们正在查找拥有卫星的国家。我们可以通过以下查询获得它们(为了简单起见,我们忽略了多个国家财团拥有的卫星):

select * from Country
where
Country.code in (select country_code from Satellite);

  

假设,在Satellite.country_code上有一个索引。如果我们使用该索引,我们将按卫星所属国家的顺序得到卫星:

LooseScan策略其实并不真的需要排序,真正需要的是分组。在上面的图中,卫星是根据国家分组的。例如,澳大利亚(AUS)所有的卫星在一起。这就很便于从一组中找出一个卫星,将其对应的国家进行连接,获得一个国家列表,且没有重复的国家记录:

上面的查询使用LooseScan之后,执行计划类似如下:

MariaDB [world]> explain select * from Country where Country.code in (select country_code from Satellite);
+----+-------------+-----------+--------+---------------+--------------+---------+------------------------------+------+-------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-----------+--------+---------------+--------------+---------+------------------------------+------+-------------------------------------+
| 1 | PRIMARY | Satellite | index | country_code | country_code | 9 | NULL | 932 | Using where; Using index; LooseScan |
| 1 | PRIMARY | Country | eq_ref | PRIMARY | PRIMARY | 3 | world.Satellite.country_code | 1 | Using index condition |
+----+-------------+-----------+--------+---------------+--------------+---------+------------------------------+------+-------------------------------------+

  

·LooseScan避免了产生重复的记录,通过将子查询表放在首位并使用其索引去从多个重复记录中选择一条记录。
因此,要想使用LooseScan,子查询应该看起来像下面的例子:

expr IN (SELECT tbl.keypart1 FROM tbl ...)

or

expr IN (SELECT tbl.keypart2 FROM tbl WHERE tbl.keypart1=const AND ...)

·LooseScan支持相关子查询
·是否开启LooseScan是由系统变量optimizer_switch中的loosescan=on|off设置的。

https://mariadb.com/kb/en/library/loosescan-strategy/

最新文章

  1. DataGridView列的宽度、行的高度自动调整
  2. Linux计划任务crontab运行脚本不正确的问题
  3. codeforces 557B. Pasha and Tea 解题报告
  4. html页面识别当前系统和语言
  5. 在iOS开发中使用FMDB
  6. (Android学习系列)二,窗口(Activity)的生命周期
  7. 力控ADO组件数据源设置
  8. Linux笔记(七) - 网络命令
  9. 学习面向对象编程OOP 第二天
  10. JDBC 基础
  11. confluence搭建详情
  12. Sqlserver 锁(转)
  13. 如何设置默认以管理员权限运行cmd
  14. springboot打包去除资源文件,启动时指定配置文件位置,使用log4j2替换默认logback
  15. Android手机上Audio DSP频率低 memory小的应对措施
  16. 设计模式-结构型模式,python桥接模式
  17. oracle 存储过程、游标参考实例
  18. 使用Logstash创建ES映射模版并进行数据默认的动态映射规则
  19. django rest framework实现分页功能
  20. PICT工具一键生成正交试验用例

热门文章

  1. 【TTS】传输表空间AIX asm -> linux asm
  2. Linux IO 概念(1)
  3. 进程间通信之数据传输--FIFO
  4. Eclipse安装JDK11方式
  5. BUUCTF复现记录1
  6. js中的attribute详解
  7. AS项目报错 Error:java.util.concurrent.ExecutionException: com.android.tools.aapt2.Aapt2Exception: AAPT2 error: check logs for details
  8. 第一次使用Git(常用的dos命令整理)
  9. Kotlin函数使用综述与显式返回类型分析
  10. 项目Alpha冲刺(10/10)