亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > MySQL > 正文

MySQL的子查詢及相關優化學習教程

2024-07-24 13:08:10
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了MySQL的子查詢及相關優化學習教程,使用子查詢時需要注意其對數據庫性能的影響,需要的朋友可以參考下


一、子查詢 1、where型子查詢

(把內層查詢結果當作外層查詢的比較條件)





#不用order by 來查詢最新的商品
select goods_id,goods_name from goods where goods_id = (select max(goods_id) from goods);




#取出每個欄目下最新的產品(goods_id唯一)
select cat_id,goods_id,goods_name from goods where goods_id in(select max(goods_id) from goods group by cat_id); 
2、from型子查詢

(把內層的查詢結果供外層再次查詢)

#用子查詢查出掛科兩門及以上的同學的平均成績

思路:





#先查出哪些同學掛科兩門以上
select name,count(*) as gk from stu where score < 60 having gk >=2;
#以上查詢結果,我們只要名字就可以了,所以再取一次名字
select name from (select name,count(*) as gk from stu having gk >=2) as t;
#找出這些同學了,那么再計算他們的平均分
select name,avg(score) from stu where name in (select name from (select name,count(*) as gk from stu having gk >=2) as t) group by name;
3、exists型子查詢

(把外層查詢結果拿到內層,看內層的查詢是否成立)





#查詢哪些欄目下有商品,欄目表category,商品表goods
select cat_id,cat_name from category where exists(select * from goods where goods.cat_id = category.cat_id);
二、優化

從句式的形式看,子查詢分為特殊格式子查詢和非特殊格式子查詢,特殊格式的子查詢中又包括IN、ALL、ANY、SOME、EXISTS等類型的子查詢,對于有的類型的子查詢,MySQL有的支持優化,有的不支持,具體情況如下。

示例一,MySQL不支持對EXISTS類型的子查詢的優化:

EXISTS類型的相關子查詢,查詢執行計劃如下:





mysql> EXPLAIN EXTENDED SELECT * FROM t1 WHERE EXISTS (SELECT 1 FROM t2 WHERE t1.a1= t2.a2 AND t2.a2>10);




+----+--------------------+-------+------+------+-------------+
| id | select_type | table | type | key | Extra |

+----+--------------------+-------+------+------+-------------+

| 1 | PRIMARY | t1 | ALL | NULL | Using where |

| 2 | DEPENDENT SUBQUERY | t2 | ALL | NULL | Using where |

+----+--------------------+-------+------+------+-------------+

2 rows in set, 2 warnings (0.00 sec)
被查詢優化器處理后的語句為:





/* select#1 */ select `test`.`t1`.`id1` AS `id1`,`test`.`t1`.`a1` AS `a1`,

`test`.`t1`.`b1` AS `b1`

from `test`.`t1`

where exists(/* select#2 */

select 1

from `test`.`t2`

where ((`test`.`t1`.`a1` = `test`.`t2`.`a2`) and (`test`.`t2`.`a2` > 10))

)
從查詢執行計劃看,子查詢存在,MySQL沒有進一步做子查詢的優化工作。

另外的一個EXISTS類型的相關子查詢,查詢執行計劃如下:





mysql> EXPLAIN EXTENDED SELECT * FROM t1 WHERE EXISTS (SELECT 1 FROM t2 WHERE t1.b1= t2.b2 AND t1.a1=10);




+----+--------------------+-------+------+------+-------------+

| id | select_type | table | type | key | Extra |

+----+--------------------+-------+------+------+-------------+

| 1 | PRIMARY | t1 | ALL | NULL | Using where |

| 2 | DEPENDENT SUBQUERY | t2 | ALL | NULL | Using where |

+----+--------------------+-------+------+------+-------------+

2 rows in set, 3 warnings (0.02 sec)
被查詢優化器處理后的語句為:





/* select#1 */ select `test`.`t1`.`id1` AS `id1`,`test`.`t1`.`a1` AS `a1`,

`test`.`t1`.`b1` AS `b1`

from `test`.`t1`

where exists(/* select#2 */

select 1

from `test`.`t2`

where ((`test`.`t1`.`b1` = `test`.`t2`.`b2`) and (`test`.`t1`.`a1` = 10))

)
從查詢執行計劃看,子查詢存在,MySQL沒有進一步做子查詢的優化工作。

示例二,MySQL不支持對NOT EXISTS類型的子查詢的優化:

NOT EXISTS類型的相關子查詢,查詢執行計劃如下:





mysql> EXPLAIN EXTENDED SELECT * FROM t1 WHERE NOT EXISTS (SELECT 1 FROM t2 WHERE t1.a1= t2.a2 AND t2.a2>10);




+----+--------------------+-------+------+------+-------------+

| id | select_type | table | type | key | Extra |

+----+--------------------+-------+------+------+-------------+

| 1 | PRIMARY | t1 | ALL | NULL | Using where |

| 2 | DEPENDENT SUBQUERY | t2 | ALL | NULL | Using where |

+----+--------------------+-------+------+------+-------------+

2 rows in set, 2 warnings (0.00 sec)
被查詢優化器處理后的語句為:





/* select#1 */ select `test`.`t1`.`id1` AS `id1`,`test`.`t1`.`a1` AS `a1`,

`test`.`t1`.`b1` AS `b1`

from `test`.`t1`

where (not(exists(

/* select#2 */ select 1

from `test`.`t2`

where ((`test`.`t1`.`a1` = `test`.`t2`.`a2`) and (`test`.`t2`.`a2` > 10))))

)
從查詢執行計劃看,子查詢存在,MySQL沒有進一步做子查詢的優化工作。

另外的一個NOT EXISTS類型的相關子查詢,查詢執行計劃如下:





mysql> EXPLAIN EXTENDED SELECT * FROM t1 WHERE NOT EXISTS (SELECT 1 FROM t2 WHERE t1.b1= t2.b2 AND t1.a1=10);




+----+--------------------+-------+------+------+-------------+

| id | select_type | table | type | key | Extra |

+----+--------------------+-------+------+------+-------------+

| 1 | PRIMARY | t1 | ALL | NULL | Using where |

| 2 | DEPENDENT SUBQUERY | t2 | ALL | NULL | Using where |

+----+--------------------+-------+------+------+-------------+

2 rows in set, 3 warnings (0.00 sec)
被查詢優化器處理后的語句為:



/* select#1 */ select `test`.`t1`.`id1` AS `id1`,`test`.`t1`.`a1` AS `a1`,

`test`.`t1`.`b1` AS `b1`

from `test`.`t1`

where (not(exists(

/* select#2 */ select 1

from `test`.`t2`

where ((`test`.`t1`.`b1` = `test`.`t2`.`b2`) and (`test`.`t1`.`a1` = 10))))

)
從查詢執行計劃看,子查詢存在,MySQL沒有進一步做子查詢的優化工作。

示例三,MySQL支持對IN類型的子查詢的優化,按也有不支持的情況存在:

IN非相關子查詢,查詢執行計劃如下:





mysql> EXPLAIN EXTENDED SELECT * FROM t1 WHERE t1.a1 IN (SELECT a2 FROM t2 WHERE t2.a2>10);




+----+--------------+-------------+------+------+----------------------------------------------------+

| id | select_type | table | type | key | Extra |

+----+--------------+-------------+------+------+----------------------------------------------------+

| 1 | SIMPLE | <subquery2> | ALL | NULL | NULL |

| 1 | SIMPLE | t1 | ALL | NULL | Using where; Using join buffer (Block Nested Loop) |

| 2 | MATERIALIZED | t2 | ALL | NULL | Using where |

+----+--------------+-------------+------+------+----------------------------------------------------+

3 rows in set, 1 warning (0.00 sec)
被查詢優化器處理后的語句為:





/* select#1 */ select `test`.`t1`.`id1` AS `id1`,`test`.`t1`.`a1` AS `a1`,

`test`.`t1`.`b1` AS `b1`

from `test`.`t1` semi join (`test`.`t2`)

where ((`test`.`t1`.`a1` = `<subquery2>`.`a2`) and (`test`.`t2`.`a2` > 10))
從查詢執行計劃看,表t2被物化后,與表t1執行了半連接(semi join)。盡管有“subquery2”這樣的內容看起來是子查詢,但是表t2已經被上拉到表t1層執行了半連接,所以MySQL支持IN子查詢優化為半連接操作。

另外一個IN非相關子查詢,查詢執行計劃如下:





mysql> EXPLAIN EXTENDED SELECT * FROM t1 WHERE t1.a1 IN (SELECT a2 FROM t2 WHERE t2.a2=10);




+----+--------------+-------------+------+------+----------------------------------------------------+

| id | select_type | table | type | key | Extra |

+----+--------------+-------------+------+------+----------------------------------------------------+

| 1 | SIMPLE | <subquery2> | ALL | NULL | Using where |

| 1 | SIMPLE | t1 | ALL | NULL | Using where; Using join buffer (Block Nested Loop) |

| 2 | MATERIALIZED | t2 | ALL | NULL | Using where |

+----+--------------+-------------+------+------+----------------------------------------------------+

3 rows in set, 1 warning (0.02 sec)
被查詢優化器處理后的語句為:





/* select#1 */ select `test`.`t1`.`id1` AS `id1`,`test`.`t1`.`a1` AS `a1`,

`test`.`t1`.`b1` AS `b1`

from `test`.`t1` semi join (`test`.`t2`)

where ((`<subquery2>`.`a2` = 10) and (`test`.`t1`.`a1` = 10) and (`test`.`t2`.`a2` = 10))
從查詢執行計劃看,子查詢不存在,表t1和t2直接做了塊嵌套循環半連接(Block Nested Loop),把子查詢上拉到父查詢中用嵌套循環半連接完成IN操作。另外,由于子查詢上拉,使得增加連接條件“a1=a2”,而原先的條件“a2=10”可以利用常量傳遞優化技術,使得“a1=a2=10”,所以查詢執行計劃中,兩個索引掃描的條件分別為:a1 = 10、a2 = 10。

另外一個IN非相關子查詢,查詢執行計劃如下:





mysql> EXPLAIN EXTENDED SELECT * FROM t1 WHERE t1.a1 IN (SELECT a2 FROM t2 WHERE t1.a1=10);




+----+-------------+-------+------+------------------------------------------------------------------+

| id | select_type | table | type | Extra |

+----+-------------+-------+------+------------------------------------------------------------------+

| 1 | SIMPLE | t2 | ALL | Using where; Start temporary |

| 1 | SIMPLE | t1 | ALL | Using where; End temporary; Using join buffer (Block Nested Loop)|

+----+-------------+-------+------+------------------------------------------------------------------+

2 rows in set, 2 warnings (0.00 sec)
被查詢優化器處理后的語句為:





/* select#1 */ select `test`.`t1`.`id1` AS `id1`,`test`.`t1`.`a1` AS `a1`,

`test`.`t1`.`b1` AS `b1`

from `test`.`t1` semi join (`test`.`t2`)

where ((`test`.`t2`.`a2` = 10) and (`test`.`t1`.`a1` = 10))
從查詢執行計劃看,子子查詢不存在,表t1和t2直接做了塊嵌套循環連接(Block Nested Loop),但屬于半連接操作(semi join),把子查詢上拉到父查詢中用嵌套循環半連接完成IN操作。

示例四,MySQL支持對NOT IN類型的子查詢的優化

NOT IN非相關子查詢,查詢執行計劃如下:





mysql> EXPLAIN EXTENDED SELECT * FROM t1 WHERE t1.a1 NOT IN (SELECT a2 FROM t2 WHERE t2.a2>10);




+----+-------------+-------+------+------+-------------+

| id | select_type | table | type | key | Extra |

+----+-------------+-------+------+------+-------------+

| 1 | PRIMARY | t1 | ALL | NULL | Using where |

| 2 | SUBQUERY | t2 | ALL | NULL | Using where |

+----+-------------+-------+------+------+-------------+

2 rows in set, 1 warning (0.02 sec)
被查詢優化器處理后的語句為:





/* select#1 */ select `test`.`t1`.`id1` AS `id1`,`test`.`t1`.`a1` AS `a1`,

`test`.`t1`.`b1` AS `b1`

from `test`.`t1`

where (not(<in_optimizer>(

`test`.`t1`.`a1`,`test`.`t1`.`a1` in (

<materialize> (/* select#2 */

select `test`.`t2`.`a2`

from `test`.`t2`

where (`test`.`t2`.`a2` > 10)

having 1

),

<primary_index_lookup>(

`test`.`t1`.`a1` in <temporary table> on <auto_key>

where ((`test`.`t1`.`a1` = `materialized-subquery`.`a2`))

)

)

))

)
從查詢執行計劃看,表t2做了子查詢(SUBQUERY)。而子查詢被物化(materialize)。所以,MySQL對于NOT IN子查詢采用了物化的優化方式,但不支持子查詢的消除。

另外一個NOT IN非相關子查詢,查詢執行計劃如下:





mysql> EXPLAIN EXTENDED SELECT * FROM t1 WHERE t1.a1 NOT IN (SELECT a2 FROM t2 WHERE t2.a2=10);




+----+-------------+-------+------+------+-------------+

| id | select_type | table | type | key | Extra |

+----+-------------+-------+------+------+-------------+

| 1 | PRIMARY | t1 | ALL | NULL | Using where |

| 2 | SUBQUERY | t2 | ALL | NULL | Using where |

+----+-------------+-------+------+------+-------------+

2 rows in set, 1 warning (0.00 sec)
被查詢優化器處理后的語句為:





/* select#1 */ select `test`.`t1`.`id1` AS `id1`,`test`.`t1`.`a1` AS `a1`,`test`.`t1`.`b1` AS `b1`

from `test`.`t1`

where (not(<in_optimizer>(

`test`.`t1`.`a1`,`test`.`t1`.`a1` in (

<materialize> (/* select#2 */

select `test`.`t2`.`a2`

from `test`.`t2`

where (`test`.`t2`.`a2` = 10)

having 1

),

<primary_index_lookup>(

`test`.`t1`.`a1` in <temporary table> on <auto_key>

where ((`test`.`t1`.`a1` = `materialized-subquery`.`a2`))

)

)

))

)
從查詢執行計劃看,表t2做了子查詢(SUBQUERY)。而子查詢被物化(materialize)。所以,MySQL對于NOT IN子查詢采用了物化的優化方式,但不支持子查詢的消除。



示例五,MySQL支持對ALL類型的子查詢的優化:

不相關的ALL子查詢,查詢執行計劃如下:





mysql> EXPLAIN EXTENDED SELECT * FROM t1 WHERE t1.a1 >ALL (SELECT a2 FROM t2 WHERE t2.a2>10);




+----+-------------+-------+------+------+-------------+

| id | select_type | table | type | key | Extra |

+----+-------------+-------+------+------+-------------+

| 1 | PRIMARY | t1 | ALL | NULL | Using where |

| 2 | SUBQUERY | t2 | ALL | NULL | Using where |

+----+-------------+-------+------+------+-------------+

2 rows in set, 1 warning (0.00 sec)
被查詢優化器處理后的語句為:





/* select#1 */ select `test`.`t1`.`id1` AS `id1`,`test`.`t1`.`a1` AS `a1`,`test`.`t1`.`b1` AS `b1`

from `test`.`t1`

where <not>((`test`.`t1`.`a1` <= <max>(

/* select#2 */

select `test`.`t2`.`a2`

from `test`.`t2`

where (`test`.`t2`.`a2` > 10)

)

))
從查詢執行計劃看,出現了子查詢(SUBQUERY),但是,子查詢被“<= ”操作符限制,而子查詢中的被查詢列a2上存在唯一索引,所以可以利用索引求最值,所以MySQL支持“>ALL”式的子查詢優化,子查詢只被執行一次即可求得最大值。

不相關的ALL子查詢,查詢執行計劃如下:





mysql> EXPLAIN EXTENDED SELECT * FROM t1 WHERE t1.a1 =ALL (SELECT a2 FROM t2 WHERE t2.a2=10);




+----+--------------------+-------+------+------+-------------+

| id | select_type | table | type | key | Extra |

+----+--------------------+-------+------+------+-------------+

| 1 | PRIMARY | t1 | ALL | NULL | Using where |

| 2 | DEPENDENT SUBQUERY | t2 | ALL | NULL | Using where |

+----+--------------------+-------+------+------+-------------+

2 rows in set, 1 warning (0.00 sec)
被查詢優化器處理后的語句為:





/* select#1 */ select `test`.`t1`.`id1` AS `id1`,`test`.`t1`.`a1` AS `a1`,`test`.`t1`.`b1` AS `b1`

from `test`.`t1`

where <not>(<in_optimizer>(

`test`.`t1`.`a1`,<exists>(

/* select#2 */ select 1 from `test`.`t2`

where ((`test`.`t2`.`a2` = 10) and

<if>(outer_field_is_not_null,

((<cache>(`test`.`t1`.`a1`) <> 10) or <cache>(isnull(10))),

true

)

)

having <if>(outer_field_is_not_null, <is_not_null_test>(`test`.`t2`.`a2`), true)

)

))
從查詢執行計劃看,出現了子查詢(SUBQUERY),但是被查詢優化器處理后的語句中包含“exists”,這表明MySQL對于“=ALL”式的子查詢優化用“EXISTS strategy”方式優化,所以MySQL支持“=ALL”式的子查詢優化。

不相關的ALL子查詢,查詢執行計劃如下:





mysql> EXPLAIN EXTENDED SELECT * FROM t1 WHERE t1.a1 <ALL (SELECT a2 FROM t2 WHERE t2.a2=10);




+----+-------------+-------+------+------+-------------+

| id | select_type | table | type | key | Extra |

+----+-------------+-------+------+------+-------------+

| 1 | PRIMARY | t1 | ALL | NULL | Using where |

| 2 | SUBQUERY | t2 | ALL | NULL | Using where |

+----+-------------+-------+------+------+-------------+

2 rows in set, 1 warning (0.00 sec)
被查詢優化器處理后的語句為:





/* select#1 */ select `test`.`t1`.`id1` AS `id1`,`test`.`t1`.`a1` AS `a1`,`test`.`t1`.`b1` AS `b1`

from `test`.`t1`

where <not>((`test`.`t1`.`a1` >= <min>

(/* select#2 */

select `test`.`t2`.`a2`

from `test`.`t2`

where (`test`.`t2`.`a2` = 10)

)

))
從查詢執行計劃看,出現了子查詢(SUBQUERY),但是,子查詢被“>= ”操作符限制,而子查詢中的被查詢列a2上存在唯一索引,所以可以利用索引求最值,所以MySQL支持“

示例六,MySQL支持對SOME類型的子查詢的優化:

使用了“>SOME”式子的子查詢被優化,查詢執行計劃如下:





mysql> EXPLAIN EXTENDED SELECT * FROM t1 WHERE t1.a1 >SOME (SELECT a2 FROM t2 WHERE t2.a2>10);




+----+-------------+-------+------+------+-------------+

| id | select_type | table | type | key | Extra |

+----+-------------+-------+------+------+-------------+

| 1 | PRIMARY | t1 | ALL | NULL | Using where |

| 2 | SUBQUERY | t2 | ALL | NULL | Using where |

+----+-------------+-------+------+------+-------------+

2 rows in set, 1 warning (0.05 sec)
被查詢優化器處理后的語句為:





/* select#1 */ select `test`.`t1`.`id1` AS `id1`,`test`.`t1`.`a1` AS `a1`,

`test`.`t1`.`b1` AS `b1`

from `test`.`t1`

where <nop>((`test`.`t1`.`a1` > (

/* select#2 */

select min(`test`.`t2`.`a2`)

from `test`.`t2`

where (`test`.`t2`.`a2` > 10)

)))
從查詢執行計劃看,出現了子查詢(SUBQUERY),但是,子查詢被“min”函數限制,而子查詢中的被查詢列a2上存在唯一索引,所以可以利用索引求最值,所以MySQL支持“>SOME”式的子查詢優化,子查詢只被執行一次即可求得最大值。

使用了“=SOME”式子的子查詢被優化,查詢執行計劃如下:





mysql> EXPLAIN EXTENDED SELECT * FROM t1 WHERE t1.a1 =SOME (SELECT a2 FROM t2 WHERE t2.a2=10);




+----+--------------+-------------+------+------+----------------------------------------------------+

| id | select_type | table | type | key | Extra |

+----+--------------+-------------+------+------+----------------------------------------------------+

| 1 | SIMPLE | <subquery2> | ALL | NULL | Using where |

| 1 | SIMPLE | t1 | ALL | NULL | Using where; Using join buffer (Block Nested Loop) |

| 2 | MATERIALIZED | t2 | ALL | NULL | Using where |

+----+--------------+-------------+------+------+----------------------------------------------------+

3 rows in set, 1 warning (0.01 sec)
被查詢優化器處理后的語句為:





/* select#1 */ select `test`.`t1`.`id1` AS `id1`,`test`.`t1`.`a1` AS `a1`,

`test`.`t1`.`b1` AS `b1`

from `test`.`t1` semi join (`test`.`t2`)

where ((`<subquery2>`.`a2` = 10) and (`test`.`t1`.`a1` = 10) and (`test`.`t2`.`a2` = 10))
從查詢執行計劃看,沒有出現了子查詢,表t2被物化,與表t1進行了半連接。

使用了“





mysql> EXPLAIN EXTENDED SELECT * FROM t1 WHERE t1.a1 <SOME (SELECT a2 FROM t2 WHERE t2.a2=10);




+----+-------------+-------+------+------+-------------+

| id | select_type | table | type | key | Extra |

+----+-------------+-------+------+------+-------------+

| 1 | PRIMARY | t1 | ALL | NULL | Using where |

| 2 | SUBQUERY | t2 | ALL | NULL | Using where |

+----+-------------+-------+------+------+-------------+

2 rows in set, 1 warning (0.00 sec)
被查詢優化器處理后的語句為:





/* select#1 */ select `test`.`t1`.`id1` AS `id1`,`test`.`t1`.`a1` AS `a1`,

`test`.`t1`.`b1` AS `b1`

from `test`.`t1`

where <nop>(

(

`test`.`t1`.`a1` < (/* select#2 */

select max(`test`.`t2`.`a2`)

from `test`.`t2`

where (`test`.`t2`.`a2` = 10)

)

)

)
從查詢執行計劃看,出現了子查詢(SUBQUERY),但是,子查詢被“max”函數限制,而子查詢中的被查詢列a2上存在唯一索引,所以可以利用索引求最值,所以MySQL支持“

示例七,MySQL支持對ANY類型的子查詢的優化:

使用了“>ANY”式子的子查詢被優化,查詢執行計劃如下:





mysql> EXPLAIN EXTENDED SELECT * FROM t1 WHERE t1.a1 >ANY (SELECT a2 FROM t2 WHERE t2.a2>10);




+----+-------------+-------+------+------+-------------+

| id | select_type | table | type | key | Extra |

+----+-------------+-------+------+------+-------------+

| 1 | PRIMARY | t1 | ALL | NULL | Using where |

| 2 | SUBQUERY | t2 | ALL | NULL | Using where |

+----+-------------+-------+------+------+-------------+

2 rows in set, 1 warning (0.00 sec)
被查詢優化器處理后的語句為:





/* select#1 */ select `test`.`t1`.`id1` AS `id1`,`test`.`t1`.`a1` AS `a1`,

`test`.`t1`.`b1` AS `b1`

from `test`.`t1`

where <nop>(

(

`test`.`t1`.`a1` > (/* select#2 */

select min(`test`.`t2`.`a2`)

from `test`.`t2`

where (`test`.`t2`.`a2` > 10)

)

)

)
從查詢執行計劃看,出現了子查詢(SUBQUERY),但是,子查詢被“min”函數限制,而子查詢中的被查詢列a2上存在唯一索引,所以可以利用索引求最值,所以MySQL支持“>ANY”式的子查詢優化,子查詢只被執行一次即可求得最小值。

使用了“=ANY”式子的子查詢被優化,查詢執行計劃如下:



mysql> EXPLAIN EXTENDED SELECT * FROM t1 WHERE t1.a1 =ANY (SELECT a2 FROM t2 WHERE t2.a2>10);




+----+--------------+-------------+------+------+----------------------------------------------------+

| id | select_type | table | type | key | Extra |

+----+--------------+-------------+------+------+----------------------------------------------------+

| 1 | SIMPLE | <subquery2> | ALL | NULL | NULL |

| 1 | SIMPLE | t1 | ALL | NULL | Using where; Using join buffer (Block Nested Loop) |

| 2 | MATERIALIZED | t2 | ALL | NULL | Using where |

+----+--------------+-------------+------+------+----------------------------------------------------+

3 rows in set, 1 warning (0.02 sec)
被查詢優化器處理后的語句為:





/* select#1 */ select `test`.`t1`.`id1` AS `id1`,`test`.`t1`.`a1` AS `a1`,

`test`.`t1`.`b1` AS `b1`

from `test`.`t1` semi join (`test`.`t2`)

where ((`test`.`t1`.`a1` = `<subquery2>`.`a2`) and (`test`.`t2`.`a2` > 10))
從查詢執行計劃看,沒有出現了子查詢,表t2被物化,與表t1進行了半連接。

使用了“





mysql> EXPLAIN EXTENDED SELECT * FROM t1 WHERE t1.a1 <ANY (SELECT a2 FROM t2 WHERE t2.a2>10);


+----+-------------+-------+------+------+-------------+

| id | select_type | table | type | key | Extra |

+----+-------------+-------+------+------+-------------+

| 1 | PRIMARY | t1 | ALL | NULL | Using where |

| 2 | SUBQUERY | t2 | ALL | NULL | Using where |

+----+-------------+-------+------+------+-------------+

2 rows in set, 1 warning (0.00 sec)
被查詢優化器處理后的語句為:





/* select#1 */ select `test`.`t1`.`id1` AS `id1`,`test`.`t1`.`a1` AS `a1`,

`test`.`t1`.`b1` AS `b1`

from `test`.`t1`

where <nop>(

(

`test`.`t1`.`a1` < (/* select#2 */

select max(`test`.`t2`.`a2`)

from `test`.`t2`

where (`test`.`t2`.`a2` > 10)

)

)

)
從查詢執行計劃看,出現了子查詢(SUBQUERY),但是,子查詢被“max”函數限制,而子查詢中的被查詢列a2上存在唯一索引,所以可以利用索引求最值,所以MySQL支持“
注:相關教程知識閱讀請移步到MYSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品一久久香蕉国产线看观看| 九九久久久久久久久激情| 一级做a爰片久久毛片美女图片| 国产91色在线播放| 中文字幕亚洲一区二区三区| 欧美激情视频在线| 国产亚洲人成网站在线观看| 久久久成人的性感天堂| 亚洲欧洲美洲在线综合| 日本精品一区二区三区在线播放视频| 国产xxx69麻豆国语对白| 91精品国产99久久久久久| 国产精品丝袜久久久久久不卡| 日韩成人网免费视频| 国产精品久久视频| 国产精品白丝jk喷水视频一区| 91免费视频网站| 中文在线资源观看视频网站免费不卡| 视频在线观看99| 日产日韩在线亚洲欧美| 久久夜精品va视频免费观看| 亚洲伊人第一页| 久久影视电视剧凤归四时歌| 日日摸夜夜添一区| 亚洲最新在线视频| 亚洲午夜久久久久久久| 久久伊人色综合| 久久久影视精品| 成人写真福利网| 国产精品88a∨| 日本一区二三区好的精华液| 综合激情国产一区| 精品国产一区二区三区久久狼5月| 97香蕉超级碰碰久久免费软件| 亚洲久久久久久久久久| 正在播放欧美视频| 91av在线播放视频| 亚洲欧美视频在线| 亚洲女成人图区| 日韩中文字幕在线视频| 国产又爽又黄的激情精品视频| 5566成人精品视频免费| 91爱爱小视频k| 亚洲丁香婷深爱综合| 欧美性xxxx极品高清hd直播| 全色精品综合影院| 国产精品免费久久久| 久久久久久亚洲精品中文字幕| 亚洲精品网站在线播放gif| 黑人精品xxx一区| 亚洲成人黄色在线| 亚洲国产精品成人va在线观看| 欧美一级淫片aaaaaaa视频| 日韩有码在线电影| 亚洲国产精品推荐| 国模吧一区二区三区| 69久久夜色精品国产69| 亚洲成人精品视频| 91精品久久久久久久久中文字幕| 国产乱人伦真实精品视频| 久久精品国产免费观看| 日韩免费观看网站| 久久久视频精品| 成人黄色短视频在线观看| 在线亚洲午夜片av大片| 一本色道久久综合狠狠躁篇怎么玩| 九九九久久久久久| 欧美一级在线播放| 国产精品久久久久久久久久久新郎| 国产69精品久久久久9999| 日韩av影院在线观看| 国产91热爆ts人妖在线| 精品无人区乱码1区2区3区在线| 国内精品一区二区三区| 久久久天堂国产精品女人| 国产精品久久久久久久久久免费| 成人亚洲激情网| 亚洲欧美自拍一区| 成人免费xxxxx在线观看| 久久久免费av| 日韩中文字幕不卡视频| 性视频1819p久久| 亚洲色图av在线| 国产精品va在线播放| 欧美激情手机在线视频| 蜜月aⅴ免费一区二区三区| 欧美在线视频在线播放完整版免费观看| 日韩av观看网址| 91精品久久久久久久久久久久久久| 91在线看www| 日韩免费观看网站| 久久久免费av| 亚洲欧美中文字幕| 欧美性猛交丰臀xxxxx网站| 亚洲精品欧美日韩| 一区二区三区四区视频| 国产精品久久久久久婷婷天堂| 亚洲欧洲午夜一线一品| …久久精品99久久香蕉国产| 亚洲aⅴ日韩av电影在线观看| 最近更新的2019中文字幕| 日韩精品在线免费观看视频| 亚洲成色999久久网站| 日韩美女在线播放| 亚洲国产一区自拍| 91在线视频导航| 亚洲精品wwwww| 日韩福利伦理影院免费| 国产精品亚洲欧美导航| 欧美成人第一页| 不用播放器成人网| 91日本在线观看| 欧美电影在线观看高清| 欧美精品一区三区| 日韩在线欧美在线| 国产精品夫妻激情| 久久久亚洲成人| 91精品国产免费久久久久久| 日韩三级成人av网| 91视频国产一区| 成人福利视频在线观看| 亚洲色图15p| 欧美电影免费观看高清完整| 最近日韩中文字幕中文| 久久亚洲欧美日韩精品专区| 欧美国产在线视频| 91精品国产91久久久久久久久| 在线丨暗呦小u女国产精品| 91精品国产综合久久久久久蜜臀| 91精品综合久久久久久五月天| 国产热re99久久6国产精品| 性色av一区二区咪爱| 中日韩美女免费视频网址在线观看| 国产精品777| 久久久久久美女| 国产成人91久久精品| 欧美日韩福利电影| 久久综合五月天| 亚洲国产欧美自拍| 狠狠色狠狠色综合日日五| 久久久免费精品视频| 久久艳片www.17c.com| 日韩女优人人人人射在线视频| 欧美壮男野外gaytube| 国产精品免费网站| 国产性色av一区二区| 精品国产一区av| 久久综合电影一区| 国产日韩欧美在线观看| 大桥未久av一区二区三区| 色狠狠av一区二区三区香蕉蜜桃| 久久天天躁夜夜躁狠狠躁2022| 欧美日韩国产在线| 欧美性猛交99久久久久99按摩| 欧洲中文字幕国产精品| 亚洲人成电影在线| 91sao在线观看国产| 国产精品久久久久久婷婷天堂| 日韩中文字幕国产| 亚洲人成电影网站色www| 欧美久久久精品| 欧美精品videos性欧美| 国产精品自拍偷拍视频| 久久全球大尺度高清视频|