婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > MySQL之select in 子查詢優化的實現

MySQL之select in 子查詢優化的實現

熱門標簽:湖南人工外呼系統多少錢 芒果電話機器人自動化 日照旅游地圖標注 南通自動外呼系統軟件 申請外呼電話線路 信陽穩定外呼系統運營商 石家莊電商外呼系統 百度地圖圖標標注中心 廣東人工電話機器人

下面的演示基于MySQL5.7.27版本

一、關于MySQL子查詢的優化策略介紹:

子查詢優化策略

對于不同類型的子查詢,優化器會選擇不同的策略。

1. 對于 IN、=ANY 子查詢,優化器有如下策略選擇:

  • semijoin
  • Materialization
  • exists

2. 對于 NOT IN、>ALL 子查詢,優化器有如下策略選擇:

  • Materialization
  • exists

3. 對于 derived 派生表,優化器有如下策略選擇:
derived_merge,將派生表合并到外部查詢中(5.7 引入 );
將派生表物化為內部臨時表,再用于外部查詢。
注意:update 和 delete 語句中子查詢不能使用 semijoin、materialization 優化策略

二、創建數據進行模擬演示

為了方便分析問題先建兩張表并插入模擬數據:

CREATE TABLE `test02` (
 `id` int(11) NOT NULL,
 `a` int(11) DEFAULT NULL,
 `b` int(11) DEFAULT NULL,
 PRIMARY KEY (`id`),
 KEY `a` (`a`)
) ENGINE=InnoDB;

drop procedure idata;
delimiter ;;
create procedure idata()
begin
 declare i int;
 set i=1;
 while(i=10000)do
  insert into test02 values(i, i, i);
  set i=i+1;
 end while;
end;;
delimiter ;
call idata();

create table test01 like test02;
insert into test01 (select * from test02 where id=1000)

三、舉例分析SQL實例

子查詢示例:

SELECT * FROM test01 WHERE test01.a IN (SELECT test02.b FROM test02 WHERE id  10)

大部分人可定會簡單的認為這個 SQL 會這樣執行:

SELECT test02.b FROM test02 WHERE id  10

結果:1,2,3,4,5,6,7,8,9

SELECT * FROM test01 WHERE test01.a IN (1,2,3,4,5,6,7,8,9);

但實際上 MySQL 并不是這樣做的。MySQL 會將相關的外層表壓到子查詢中,優化器認為這樣效率更高。也就是說,優化器會將上面的 SQL 改寫成這樣:

select * from test01 where exists(select b from test02 where id  10 and test01.a=test02.b);

提示: 針對mysql5.5以及之前的版本

查看執行計劃如下,發現這條SQL對表test01進行了全表掃描1000,效率低下:

root@localhost [dbtest01]>desc select * from test01 where exists(select b from test02 where id  10 and test01.a=test02.b);
+----+--------------------+--------+------------+-------+---------------+---------+---------+------+--------+----------+-------------+
| id | select_type    | table | partitions | type | possible_keys | key   | key_len | ref | rows  | filtered | Extra    |
+----+--------------------+--------+------------+-------+---------------+---------+---------+------+--------+----------+-------------+
| 1 | PRIMARY      | test01 | NULL    | ALL  | NULL     | NULL  | NULL  | NULL | 1000  |  100.00 | Using where |
| 2 | DEPENDENT SUBQUERY | test02 | NULL    | range | PRIMARY    | PRIMARY | 4    | NULL |   9 |  10.00 | Using where |
+----+--------------------+--------+------------+-------+---------------+---------+---------+------+--------+----------+-------------+
2 rows in set, 2 warnings (0.00 sec)

但是此時實際執行下面的SQL,發現也不慢啊,這不是自相矛盾嘛,別急,咱們繼續往下分析:

SELECT * FROM test01 WHERE test01.a IN (SELECT test02.b FROM test02 WHERE id  10)

查看此條SQL的執行計劃如下:

root@localhost [dbtest01]>desc SELECT * FROM test01 WHERE test01.a IN (SELECT test02.b FROM test02 WHERE id  10);
+----+--------------+-------------+------------+-------+---------------+---------+---------+---------------+------+----------+-------------+
| id | select_type | table    | partitions | type | possible_keys | key   | key_len | ref      | rows | filtered | Extra    |
+----+--------------+-------------+------------+-------+---------------+---------+---------+---------------+------+----------+-------------+
| 1 | SIMPLE    | subquery2> | NULL    | ALL  | NULL     | NULL  | NULL  | NULL     | NULL |  100.00 | Using where |
| 1 | SIMPLE    | test01   | NULL    | ref  | a       | a    | 5    | subquery2>.b |  1 |  100.00 | NULL    |
| 2 | MATERIALIZED | test02   | NULL    | range | PRIMARY    | PRIMARY | 4    | NULL     |  9 |  100.00 | Using where |
+----+--------------+-------------+------------+-------+---------------+---------+---------+---------------+------+----------+-------------+
3 rows in set, 1 warning (0.00 sec)

發現優化器使用到了策略MATERIALIZED。于是對此策略進行了資料查詢和學習。
https://dev.mysql.com/doc/refman/5.6/en/subquery-optimization.html

原因是從MySQL5.6版本之后包括MySQL5.6版本,優化器引入了新的優化策略:materialization=[off|on],semijoin=[off|on],(off代表關閉此策略,on代表開啟此策略)
可以采用show variables like 'optimizer_switch'; 來查看MySQL采用的優化器策略。當然這些策略都是可以在線進行動態修改的
set global optimizer_switch='materialization=on,semijoin=on';代表開啟優化策略materialization和semijoin

MySQL5.7.27默認的優化器策略:

root@localhost [dbtest01]>show variables like 'optimizer_switch';                                                               
+------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Variable_name  | Value                                                                                                                                                                                                      |
+------------------+------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| optimizer_switch | index_merge=on,index_merge_union=on,index_merge_sort_union=on,index_merge_intersection=on,engine_condition_pushdown=on,index_condition_pushdown=on,mrr=on,mrr_cost_based=on,block_nested_loop=on,batched_key_access=off,materialization=on,semijoin=on,loosescan=on,firstmatch=on,duplicateweedout=on,subquery_materialization_cost_based=on,use_index_extensions=on,condition_fanout_filter=on,derived_merge=on |
+------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

所以在MySQL5.6及以上版本時

執行下面的SQL是不會慢的。因為MySQL的優化器策略materialization和semijoin 對此SQL進行了優化

SELECT * FROM test01 WHERE test01.a IN (SELECT test02.b FROM test02 WHERE id  10)

然而咱們把mysql的優化器策略materialization和semijoin 關閉掉測試,發現SQL確實對test01進行了全表的掃描(1000):

set global optimizer_switch='materialization=off,semijoin=off';

執行計劃如下test01表確實進行了全表掃描:

root@localhost [dbtest01]>desc SELECT * FROM test01 WHERE test01.a IN (SELECT test02.b FROM test02 WHERE id  10);
+----+--------------------+--------+------------+-------+---------------+---------+---------+------+--------+----------+-------------+
| id | select_type    | table | partitions | type | possible_keys | key   | key_len | ref | rows  | filtered | Extra    |
+----+--------------------+--------+------------+-------+---------------+---------+---------+------+--------+----------+-------------+
| 1 | PRIMARY      | test01 | NULL    | ALL  | NULL     | NULL  | NULL  | NULL | 1000  |  100.00 | Using where |
| 2 | DEPENDENT SUBQUERY | test02 | NULL    | range | PRIMARY    | PRIMARY | 4    | NULL |   9 |  10.00 | Using where |
+----+--------------------+--------+------------+-------+---------------+---------+---------+------+--------+----------+-------------+
2 rows in set, 1 warning (0.00 sec)

下面咱們分析下這個執行計劃:

!?。。≡俅翁崾?如果是mysql5.5以及之前的版本,或者是mysql5.6以及之后的版本關閉掉優化器策略materialization=off,semijoin=off,得到的SQL執行計劃和下面的是相同的

root@localhost [dbtest01]>desc select * from test01 where exists(select b from test02 where id  10 and test01.a=test02.b);
+----+--------------------+--------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
| id | select_type    | table | partitions | type | possible_keys | key   | key_len | ref | rows | filtered | Extra    |
+----+--------------------+--------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
| 1 | PRIMARY      | test01 | NULL    | ALL  | NULL     | NULL  | NULL  | NULL | 1000 |  100.00 | Using where |
| 2 | DEPENDENT SUBQUERY | test02 | NULL    | range | PRIMARY    | PRIMARY | 4    | NULL |  9 |  10.00 | Using where |
+----+--------------------+--------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
2 rows in set, 2 warnings (0.00 sec)

不相關子查詢變成了關聯子查詢(select_type:DEPENDENT SUBQUERY),子查詢需要根據 b 來關聯外表 test01,因為需要外表的 test01 字段,所以子查詢是沒法先執行的。執行流程為:

  1. 掃描 test01,從 test01 取出一行數據 R;
  2. 從數據行 R 中,取出字段 a 執行子查詢,如果得到結果為 TRUE,則把這行數據 R 放到結果集;
  3. 重復 1、2 直到結束。

總的掃描行數為 1000+1000*9=10000(這是理論值,但是實際值比10000還少,怎么來的一直沒想明白,看規律是子查詢結果集每多一行,總掃描行數就會少幾行)。

Semi-join優化器:

這樣會有個問題,如果外層表是一個非常大的表,對于外層查詢的每一行,子查詢都得執行一次,這個查詢的性能會非常差。我們很容易想到將其改寫成 join 來提升效率:

select test01.* from test01 join test02 on test01.a=test02.b and test02.id10;

# 查看此SQL的執行計劃:

desc select test01.* from test01 join test02 on test01.a=test02.b and test02.id10;

root@localhost [dbtest01]>EXPLAIN extended select test01.* from test01 join test02 on test01.a=test02.b and test02.id10;
+----+-------------+--------+------------+-------+---------------+---------+---------+-------------------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key   | key_len | ref        | rows | filtered | Extra    |
+----+-------------+--------+------------+-------+---------------+---------+---------+-------------------+------+----------+-------------+
| 1 | SIMPLE   | test02 | NULL    | range | PRIMARY    | PRIMARY | 4    | NULL       |  9 |  100.00 | Using where |
| 1 | SIMPLE   | test01 | NULL    | ref  | a       | a    | 5    | dbtest01.test02.b |  1 |  100.00 | NULL    |
+----+-------------+--------+------------+-------+---------------+---------+---------+-------------------+------+----------+-------------+
2 rows in set, 2 warnings (0.00 sec)

這樣優化可以讓 t2 表做驅動表,t1 表關聯字段有索引,查找效率非常高。

但這里會有個問題,join 是有可能得到重復結果的,而 in(select ...) 子查詢語義則不會得到重復值。
而 semijoin 正是解決重復值問題的一種特殊聯接。
在子查詢中,優化器可以識別出 in 子句中每組只需要返回一個值,在這種情況下,可以使用 semijoin 來優化子查詢,提升查詢效率。
這是 MySQL 5.6 加入的新特性,MySQL 5.6 以前優化器只有 exists 一種策略來“優化”子查詢。

經過 semijoin 優化后的 SQL 和執行計劃分為:

root@localhost [dbtest01]>desc SELECT * FROM test01 WHERE test01.a IN (SELECT test02.b FROM test02 WHERE id  10);
+----+--------------+-------------+------------+-------+---------------+---------+---------+---------------+------+----------+-------------+
| id | select_type | table    | partitions | type | possible_keys | key   | key_len | ref      | rows | filtered | Extra    |
+----+--------------+-------------+------------+-------+---------------+---------+---------+---------------+------+----------+-------------+
| 1 | SIMPLE    | subquery2> | NULL    | ALL  | NULL     | NULL  | NULL  | NULL     | NULL |  100.00 | Using where |
| 1 | SIMPLE    | test01   | NULL    | ref  | a       | a    | 5    | subquery2>.b |  1 |  100.00 | NULL    |
| 2 | MATERIALIZED | test02   | NULL    | range | PRIMARY    | PRIMARY | 4    | NULL     |  9 |  100.00 | Using where |
+----+--------------+-------------+------------+-------+---------------+---------+---------+---------------+------+----------+-------------+
3 rows in set, 1 warning (0.00 sec)
select 
  `test01`.`id`,`test01`.`a`,`test01`.`b` 
from `test01` semi join `test02` 
where
  ((`test01`.`a` = `subquery2>`.`b`) 
  and (`test02`.`id`  10)); 

##注意這是優化器改寫的SQL,客戶端上是不能用 semi join 語法的

semijoin 優化實現比較復雜,其中又分 FirstMatch、Materialize 等策略,上面的執行計劃中 select_type=MATERIALIZED 就是代表使用了 Materialize 策略來實現的 semijoin
這里 semijoin 優化后的執行流程為:

先執行子查詢,把結果保存到一個臨時表中,這個臨時表有個主鍵用來去重;
從臨時表中取出一行數據 R;
從數據行 R 中,取出字段 b 到被驅動表 t1 中去查找,滿足條件則放到結果集;
重復執行 2、3,直到結束。
這樣一來,子查詢結果有 9 行,即臨時表也有 9 行(這里沒有重復值),總的掃描行數為 9+9+9*1=27 行,比原來的 10000 行少了很多。

MySQL 5.6 版本中加入的另一種優化特性 materialization,就是把子查詢結果物化成臨時表,然后代入到外查詢中進行查找,來加快查詢的執行速度。內存臨時表包含主鍵(hash 索引),消除重復行,使表更小。
如果子查詢結果太大,超過 tmp_table_size 大小,會退化成磁盤臨時表。這樣子查詢只需要執行一次,而不是對于外層查詢的每一行都得執行一遍。
不過要注意的是,這樣外查詢依舊無法通過索引快速查找到符合條件的數據,只能通過全表掃描或者全索引掃描,

semijoin 和 materialization 的開啟是通過 optimizer_switch 參數中的 semijoin={on|off}、materialization={on|off} 標志來控制的。
上文中不同的執行計劃就是對 semijoin 和 materialization 進行開/關產生的
總的來說對于子查詢,先檢查是否滿足各種優化策略的條件(比如子查詢中有 union 則無法使用 semijoin 優化)
然后優化器會按成本進行選擇,實在沒得選就會用 exists 策略來“優化”子查詢,exists 策略是沒有參數來開啟或者關閉的。

下面舉一個delete相關的子查詢例子:

把上面的2張測試表分別填充350萬數據和50萬數據來測試delete語句

root@localhost [dbtest01]>select count(*) from test02;
+----------+
| count(*) |
+----------+
| 3532986 |
+----------+
1 row in set (0.64 sec)
root@localhost [dbtest01]>create table test01 like test02;
Query OK, 0 rows affected (0.01 sec)

root@localhost [dbtest01]>insert into test01 (select * from test02 where id=500000)

root@localhost [dbtest01]>select count(*) from test01;
+----------+
| count(*) |
+----------+
|  500000 |

執行delete刪除語句執行了4s

root@localhost [dbtest01]>delete FROM test01 WHERE test01.a IN (SELECT test02.b FROM test02 WHERE id  10);
Query OK, 9 rows affected (4.86 sec)

查看 執行計劃,對test01表進行了幾乎全表掃描:

root@localhost [dbtest01]>desc delete FROM test01 WHERE test01.a IN (SELECT test02.b FROM test02 WHERE id  10);
+----+--------------------+--------+------------+-------+---------------+---------+---------+------+--------+----------+-------------+
| id | select_type    | table | partitions | type | possible_keys | key   | key_len | ref | rows  | filtered | Extra    |
+----+--------------------+--------+------------+-------+---------------+---------+---------+------+--------+----------+-------------+
| 1 | DELETE       | test01 | NULL    | ALL  | NULL     | NULL  | NULL  | NULL | 499343 |  100.00 | Using where |
| 2 | DEPENDENT SUBQUERY | test02 | NULL    | range | PRIMARY    | PRIMARY | 4    | NULL |   9 |  10.00 | Using where |
+----+--------------------+--------+------------+-------+---------------+---------+---------+------+--------+----------+-------------+
2 rows in set (0.00 sec)

于是修改上面的delete SQL語句偽join語句

root@localhost [dbtest01]>desc delete test01.* from test01 join test02 on test01.a=test02.b and test02.id10;
+----+-------------+--------+------------+-------+---------------+---------+---------+-------------------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key   | key_len | ref        | rows | filtered | Extra    |
+----+-------------+--------+------------+-------+---------------+---------+---------+-------------------+------+----------+-------------+
| 1 | SIMPLE   | test02 | NULL    | range | PRIMARY    | PRIMARY | 4    | NULL       |  9 |  100.00 | Using where |
| 1 | DELETE   | test01 | NULL    | ref  | a       | a    | 5    | dbtest01.test02.b |  1 |  100.00 | NULL    |
+----+-------------+--------+------------+-------+---------------+---------+---------+-------------------+------+----------+-------------+
2 rows in set (0.01 sec)

執行非常的快
root@localhost [dbtest01]>delete test01.* from test01 join test02 on test01.a=test02.b and test02.id10;
Query OK, 9 rows affected (0.01 sec)

root@localhost [dbtest01]>select test01.* from test01 join test02 on test01.a=test02.b and test02.id10;
Empty set (0.00 sec)

下面的這個表執行要全表掃描,非常慢,基本對表test01進行了全表掃描:

root@lcalhost [dbtest01]>desc delete FROM test01 WHERE id IN (SELECT id FROM test02 WHERE id='350000');
+----+--------------------+--------+------------+-------+---------------+---------+---------+-------+--------+----------+-------------+
| id | select_type    | table | partitions | type | possible_keys | key   | key_len | ref  | rows  | filtered | Extra    |
+----+--------------------+--------+------------+-------+---------------+---------+---------+-------+--------+----------+-------------+
| 1 | DELETE       | test01 | NULL    | ALL  | NULL     | NULL  | NULL  | NULL | 499343 |  100.00 | Using where |
| 2 | DEPENDENT SUBQUERY | test02 | NULL    | const | PRIMARY    | PRIMARY | 4    | const |   1 |  100.00 | Using index |
+----+--------------------+--------+------------+-------+---------------+---------+---------+-------+--------+----------+-------------+
2 rows in set (0.00 sec)

然而采用join的話,效率非常的高:

root@localhost [dbtest01]>desc delete test01.* FROM test01 inner join test02 WHERE test01.id=test02.id and test02.id=350000 ;
+----+-------------+--------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key   | key_len | ref  | rows | filtered | Extra    |
+----+-------------+--------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+
| 1 | DELETE   | test01 | NULL    | const | PRIMARY    | PRIMARY | 4    | const |  1 |  100.00 | NULL    |
| 1 | SIMPLE   | test02 | NULL    | const | PRIMARY    | PRIMARY | 4    | const |  1 |  100.00 | Using index |
+----+-------------+--------+------------+-------+---------------+---------+---------+-------+------+----------+-------------+
2 rows in set (0.01 sec)

 
root@localhost [dbtest01]> desc delete test01.* from test01 join test02 on test01.a=test02.b and test02.id=350000;
+----+-------------+--------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key   | key_len | ref  | rows | filtered | Extra |
+----+-------------+--------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
| 1 | SIMPLE   | test02 | NULL    | const | PRIMARY    | PRIMARY | 4    | const |  1 |  100.00 | NULL |
| 1 | DELETE   | test01 | NULL    | ref  | a       | a    | 5    | const |  1 |  100.00 | NULL |
+----+-------------+--------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
2 rows in set (0.00 sec)

參考文檔:

https://www.cnblogs.com/zhengyun_ustc/p/slowquery1.html
https://www.jianshu.com/p/3989222f7084
https://dev.mysql.com/doc/refman/5.6/en/subquery-optimization.html

到此這篇關于MySQL之select in 子查詢優化的實現的文章就介紹到這了,更多相關MySQL select in 子查詢優化內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • 淺談MySQL之select優化方案
  • MySQL將select結果執行update的實例教程
  • 解決MySQL讀寫分離導致insert后select不到數據的問題
  • MySQL Select語句是如何執行的
  • mysql學習筆記之完整的select語句用法實例詳解
  • MySQL select、insert、update批量操作語句代碼實例
  • 簡單了解MySQL SELECT執行順序
  • mysql事務select for update及數據的一致性處理講解
  • MySQL中Update、select聯用操作單表、多表,及視圖與臨時表的區別
  • mysql select緩存機制使用詳解
  • MySql數據庫中Select用法小結
  • 論一條select語句在MySQL是怎樣執行的

標簽:沈陽 天津 阿里 合肥 牡丹江 惠州 呼和浩特 公主嶺

巨人網絡通訊聲明:本文標題《MySQL之select in 子查詢優化的實現》,本文關鍵詞  MySQL,之,select,子,查詢,優化,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《MySQL之select in 子查詢優化的實現》相關的同類信息!
  • 本頁收集關于MySQL之select in 子查詢優化的實現的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    极品少妇xxxx偷拍精品少妇| 国产日韩欧美激情| 日韩精品91亚洲二区在线观看| 26uuu亚洲| 欧美私人免费视频| 99视频热这里只有精品免费| 亚洲超碰97人人做人人爱| 国产精品久久看| 欧美刺激脚交jootjob| 欧美三级在线播放| 91片黄在线观看| 不卡一区二区中文字幕| 国产不卡免费视频| 国产一区视频导航| 激情偷乱视频一区二区三区| 日本美女视频一区二区| 天天做天天摸天天爽国产一区| 亚洲一区二区成人在线观看| 亚洲品质自拍视频| 亚洲免费视频成人| 亚洲黄色小视频| 一区二区三区免费观看| 亚洲成人综合视频| 亚洲一区二区成人在线观看| 一区二区三区丝袜| 水野朝阳av一区二区三区| 亚洲国产欧美在线| 偷拍亚洲欧洲综合| 麻豆高清免费国产一区| 国产自产视频一区二区三区| 国产成人丝袜美腿| 91美女精品福利| 欧美日韩激情在线| 欧美日韩亚洲丝袜制服| 欧美一二三区在线观看| 久久精品一区蜜桃臀影院| 国产精品美女久久久久久久久 | 欧美综合色免费| 色综合色综合色综合色综合色综合| 99久久精品国产导航| 欧洲另类一二三四区| 在线成人免费视频| 久久麻豆一区二区| 一区二区在线观看不卡| 另类的小说在线视频另类成人小视频在线| 老司机精品视频在线| 国产电影一区二区三区| 色婷婷综合久色| 日韩欧美高清一区| 亚洲欧洲三级电影| 免费成人在线观看| 99re热视频精品| 日韩一级免费观看| 国产一区二区伦理| 国产精品国产三级国产aⅴ无密码| 有码一区二区三区| 国产综合成人久久大片91| 色系网站成人免费| wwwwxxxxx欧美| 一区二区在线免费观看| 韩国女主播一区二区三区| 99久久99久久久精品齐齐| 国产激情视频一区二区三区欧美 | 亚洲国产成人va在线观看天堂| 成人激情午夜影院| 捆绑紧缚一区二区三区视频| 夜夜精品浪潮av一区二区三区| 国产亚洲欧美一区在线观看| 日韩欧美高清一区| 欧美精品v日韩精品v韩国精品v| 欧美日韩在线播放一区| 欧美日韩国产乱码电影| 亚洲第四色夜色| 粗大黑人巨茎大战欧美成人| 91精品一区二区三区久久久久久| 中文乱码免费一区二区| 麻豆精品国产传媒mv男同| 欧美亚洲一区二区三区四区| 国产免费成人在线视频| 久久99精品久久久久久动态图| 在线中文字幕一区| 国产精品美女久久久久aⅴ | 亚洲制服丝袜av| 国产高清不卡二三区| 日韩亚洲欧美成人一区| 亚洲国产日韩精品| 色偷偷久久一区二区三区| 国产精品美女一区二区三区| 国产一区二区免费在线| 精品日韩在线观看| 麻豆精品视频在线观看| 91精品久久久久久久91蜜桃| 日韩精品一二三区| 欧美精品自拍偷拍| 一区二区国产视频| 精品视频在线免费| 亚洲综合色在线| 欧美三级乱人伦电影| 亚洲成人激情社区| 欧美日韩国产三级| 丝袜诱惑亚洲看片| 91麻豆精品国产综合久久久久久| 天天色综合天天| 欧美一卡在线观看| 久久成人免费网站| 国产人成亚洲第一网站在线播放| 高清不卡一二三区| 亚洲欧美在线高清| 日本大香伊一区二区三区| 一区二区三区日韩| 欧美日韩亚洲综合| 蜜桃视频在线观看一区| 久久久久9999亚洲精品| 粉嫩蜜臀av国产精品网站| 成人免费一区二区三区在线观看| 91久久免费观看| 人人狠狠综合久久亚洲| 久久色成人在线| eeuss影院一区二区三区| 国产精品日日摸夜夜摸av| 久久日韩精品一区二区五区| 国产欧美精品在线观看| 99久久er热在这里只有精品15| 亚洲欧美日韩电影| 67194成人在线观看| 精品一区二区三区在线观看国产| 国产喷白浆一区二区三区| 色妹子一区二区| 日韩成人一级大片| 国产精品午夜在线观看| 911精品国产一区二区在线| 国产精品一区二区果冻传媒| 亚洲欧美国产高清| 精品国产乱码久久久久久夜甘婷婷 | 三级一区在线视频先锋| 久久久久久日产精品| 欧美亚洲一区二区三区四区| 国产成人午夜电影网| 亚洲18女电影在线观看| 国产欧美日韩不卡| 欧美女孩性生活视频| 丁香桃色午夜亚洲一区二区三区| 一区二区成人在线| 国产区在线观看成人精品| 日韩一区二区麻豆国产| 色婷婷av一区二区三区之一色屋| 国产中文一区二区三区| 亚洲一区二区三区视频在线播放 | 午夜不卡在线视频| 中文字幕精品一区二区三区精品| 欧美日本在线一区| 99国产精品久久久久| 日本vs亚洲vs韩国一区三区二区 | 一区二区三区精品视频| 26uuu色噜噜精品一区二区| 欧美在线999| 99国产精品国产精品久久| 国产精品亚洲人在线观看| 视频一区国产视频| 亚洲图片欧美一区| 亚洲日本中文字幕区| 欧美国产日韩亚洲一区| 久久久久久**毛片大全| 日韩精品一区二区三区中文不卡 | 国产精品毛片无遮挡高清| 欧美一级欧美三级| 欧美日本一区二区在线观看| 91高清视频在线| 一本色道**综合亚洲精品蜜桃冫| av亚洲精华国产精华精华 | 国产高清一区日本| 蜜桃久久精品一区二区| 日韩av电影一区| 日韩av网站在线观看| 天使萌一区二区三区免费观看| 一区二区三区免费观看| 亚洲一区欧美一区| 一区二区三区加勒比av| 一区二区三区中文字幕电影| 一区二区三区精品在线观看| 亚洲一卡二卡三卡四卡无卡久久 | 亚洲综合999| 亚洲一区二区四区蜜桃| 一区二区三区成人在线视频| 亚洲人吸女人奶水| 夜夜亚洲天天久久| 97精品国产露脸对白| 视频在线观看一区二区三区| 午夜精品福利一区二区蜜股av| 无吗不卡中文字幕| 麻豆精品精品国产自在97香蕉 | 国产欧美精品一区二区色综合 | 欧美国产日本视频| 亚洲欧美日韩人成在线播放| 亚洲国产日韩a在线播放性色| 亚洲国产一区二区三区| 精品一区精品二区高清| 国产 欧美在线| 欧美亚洲国产一区二区三区| 日韩一区二区三区三四区视频在线观看|