15.查询优化和子查询 半查询(gold_axe)

一些重写规则

  • 移除没用的括号
  • 常量传递(确定值换成对应常数)
  • 移除明显没用的条件
  • 表达式计算
  • Having移到where
  • 常量表

唯一索引的等值查询,被任务查询的时间少到可忽略,


这里table1就是常量表, 假设 table1.primary_key = 1 这行是 1,a语句就会被优化为SELECT * FROM 1,a INNER JOIN table2 ON a= table2.column2

  • 外连接和内连接效果一样转内连接

子查询

类型按结果分:

  • 标量子查询 : 子查询子返回一个值
  • 子查询:
  • 子查询:
  • 子查询

按与外层关系分:

相关查询

这里,子查询里面的条件的n1t1的表, 子查询用到外面表的列

子查询结果集的布尔表达式
  • IN
  • ANY/SOME



    等价于


  • ALL (同意可换成极值)
  • EXISTS


    如果子查询结果集有记录就是 ture

IN子查询优化

SELECT * FROM s1 WHERE key1 IN (SELECT common_field FROM s2 WHERE key3 = 'a');

物化表

SELECT * FROM s1 WHERE key1
SELECT common_field FROM s2 WHERE key3 = 'a'
这2个查的是 s1 s2 2张表, 不相关的查询
内层查询的结果集太多, 可能内存发不下,而且 in(这里面太多) 效率太低,
所以, 内层查询的结果会被放到临时表里面, 这个过程会去重(瘦身), 这个过程叫物化

  • 一般是 基于内存的 Memory表, hash索引
  • 太大了(超过系统变量设置的大小) 只能用基于磁盘的存储引擎, 索引的B+

semi-join 半连接

SELECT s1.* FROM s1 SEMI JOIN s2 ON s1.key1 = s2.common_field WHERE key3 = 'a';
这个语句不能执行只做示意
半连接:只关心在s2表中是否存在与之匹配的记录是否存在,而不关心具体有多少条记录与之匹配

执行半连接如何消除重复值:

  • Table pullout (子查询中的表上拉):
    比如
    SELECT * FROM s1 WHERE key2 IN (SELECT key2 FROM s2 WHERE key3 = 'a');因为key2在表2里面是唯一的, 可以变成
    SELECT s1.* FROM s1 INNER JOIN s2 ON s1.key2 = s2.key2WHERE s2.key3 = 'a';
  • DuplicateWeedout execution strategy (重复值消除)
    会建立一个临时表, 临时表只有一个列 id, 是主键, 把s1查询出来的结果的id插入这个临时表, 如果插成功的, 就是不重复的, 记入结果集
  • LooseScan execution strategy (松散索引扫描)
    SELECT * FROM s1
    WHERE key3 IN (SELECT key1 FROM s2 WHERE key1 > 'a' AND key1 < 'b');
    可以转换成
    SELECT * FROM s1 INNER JOIN s2 ON s1.key3 = s2.key1 WHERE s2.key1 > 'a' AND s2.key1 < 'b'
    以s2为驱动表, 先走s2的 key1上的索引 找到 s2.key1 > 'a' AND s2.key1 < 'b', 然后 相同的key1 只取第一个 比如

in 子查询 转成 EXISTS

SELECT
    *
FROM
    s1
WHERE
    key1 IN (
        SELECT
            key3
        FROM
            s2
        WHERE
            s1.common_field = s2.common_field
    )
OR key2 > 1000;
SELECT
    *
FROM
    s1
WHERE
    EXISTS (
        SELECT
            1
        FROM
            s2
        WHERE
            s1.common_field = s2.common_field
        AND s2.key3 = s1.key1// 可以用到s2.key3上的索引了
    )
OR key2 > 1000;

如果IN子查询不满足转换为semi-join的条件,又不能转换为物化表或者转换为物化表的成本太大,那么它就会被转换为EXISTS查询。

派生表消除

SELECT
    *
FROM
    (SELECT * FROM s1 WHERE key1 = 'a') AS derived_s1// 派生表
INNER JOIN s2 ON derived_s1.key1 = s2.key1
WHERE
    s2.key2 = 1;
SELECT
    *
FROM
    s1
INNER JOIN s2 ON s1.key1 = s2.key1
WHERE
    s1.key1 = 'a'
AND s2.key2 = 1;
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353

推荐阅读更多精彩内容

  • 1 标量子查询、行子查询的执行方式 我们经常在下边两个场景中使用到标量子查询或者行子查询: SELECT子句中,我...
    括儿之家阅读 361评论 0 0
  • 具体细节 请去掘金购买《MySQL 是怎样运行的:从根儿上理解 MySQL》 mysql会优化我们的查询条件进行优...
    简书徐小耳阅读 799评论 1 0
  • pyspark.sql模块 模块上下文 Spark SQL和DataFrames的重要类: pyspark.sql...
    mpro阅读 9,451评论 0 13
  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi阅读 7,322评论 0 10
  • ORACLE自学教程 --create tabletestone ( id number, --序号usernam...
    落叶寂聊阅读 1,079评论 0 0