久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:4日期:2023-10-11 11:20:39

下面的演示基于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 字段,所以子查詢是沒法先執行的。執行流程為:

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

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

Semi-join優化器:

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

select test01.* from test01 join test02 on test01.a=test02.b and test02.id<10;

# 查看此SQL的執行計劃:

desc select test01.* from test01 join test02 on test01.a=test02.b and test02.id<10;root@localhost [dbtest01]>EXPLAIN extended select test01.* from test01 join test02 on test01.a=test02.b and test02.id<10;+----+-------------+--------+------------+-------+---------------+---------+---------+-------------------+------+----------+-------------+| 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.id<10;+----+-------------+--------+------------+-------+---------------+---------+---------+-------------------+------+----------+-------------+| 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.id<10;Query OK, 9 rows affected (0.01 sec)root@localhost [dbtest01]>select test01.* from test01 join test02 on test01.a=test02.b and test02.id<10;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.htmlhttps://www.jianshu.com/p/3989222f7084https://dev.mysql.com/doc/refman/5.6/en/subquery-optimization.html

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

標簽: MySQL 數據庫
相關文章:
主站蜘蛛池模板: 欧美高清成人 | 2012中文版免费观看 | 91精品国产综合久久久久久丝袜 | 欧美性一区二区三区 | 性色视频免费观看 | 亚洲精品久久久一区二区三区 | 国产精品国产成人国产三级 | 韩日精品在线观看 | 在线观看国精产品二区1819 | 黄色最新网站 | 午夜资源 | 欧美日韩亚洲三区 | 久久99精品久久久 | 精品国产一区二区三区四 | 高清三区| 毛片搜索 | 成人亚洲免费视频 | 成人黄色电影小说 | 国产做a爰片久久毛片a我的朋友 | 久久久精品网站 | 亚洲视频在线看 | 成人免费crm在线观看 | 能免费看的av| 欧美精品www | 91精品久久久久久综合五月天 | 亚洲欧美第一页 | 免费成人在线网站 | 久久一二三四 | 不用播放器的毛片 | 精品国产一区在线 | 美女张开腿视频网站免费 | 最近免费中文字幕大全免费版视频 | 欧美不卡一区二区三区 | 国产第99页 | 久草中文在线 | 久久久久国产精品 | 九九r热| 亚洲精品在线视频 | 三级黄视频在线观看 | 爱色区综合网 | 国产综合精品一区二区三区 | 中文字幕亚洲欧美 | 日韩免费高清在线 | 天天舔天天干天天操 | www国产亚洲精品 | a级在线免费| 在线播放黄色片网站 | 亚洲一区二区三区久久 | 台湾佬成人| 欧美精品在线一区 | 国产精品久久久久久亚洲调教 | 日韩免费网站 | 国产精品毛片久久久久久久 | 一级黄色大片免费观看 | 成人看片在线观看 | 久久久久久久久国产精品 | 欧美日韩一二三区 | 亚洲国产精品99久久久久久久久 | 国产精品久久久久久久久久大牛 | 香蕉三级| 欧美一区二区三区电影 | 日本黄色一级 | 国产成人精品综合 | 不卡久久 | 日韩综合一区 | 欧美日本国产欧美日本韩国99 | 精品视频久久 | 91精品国产91久久久久久最新 | 制服 丝袜 激情 欧洲 亚洲 | 成人在线精品 | 成人免费看电影 | 台湾佬亚洲色图 | 97超碰人人 | 欧美全黄| 天天天天天天天操 | 欧美激情第二页 | 久久精品久久久久久久久久16 | 先锋影音在线观看 | 日韩在线观看视频一区二区三区 | 国产一区二区三区久久久 | 国产欧美日韩中文字幕 | 日韩中文字幕免费观看 | 999在线观看视频 | 久久一级 | 欧美全黄| 激情五月综合网 | 特级毛片在线 | 国产精彩视频 | 午夜精品福利一区二区三区蜜桃 | 久草av在线播放 | 在线免费一级片 | 亚洲精品在线免费播放 | 91资源在线 | 黄色免费在线观看 | 日韩精品一区二区三区中文在线 | 国产欧美一区二区精品忘忧草 | 久久久999精品视频 五月天婷婷在线视频 | 亚洲黄页 | 久在线 | 黄久久久| 国产精品99久久免费观看 | 一区二区国产精品 | 欧美精品一区二区三区在线 | www.色.com| 精品无码久久久久久国产 | 国产三级视频 | 久久久久一区二区 | 毛片一区二区三区 | 日韩第一页 | 九九久久久 | 国产伦精品一区二区三区照片91 | 动漫羞免费网站中文字幕 | 91免费在线播放 | 欧美lesbianxxxxhd视频社区 | 日韩精品av一区二区三区 | 精品国产乱码简爱久久久久久 | 欧美日韩一区二区中文字幕 | 一区不卡 | 蜜桃av一区 | 欧美人妖在线 | 亚洲精品中文字幕 | 夜夜视频 | 国产精品久久二区 | av看片网| 国产日韩欧美一区二区 | a级黄色毛片免费观看 | 日韩免费视频 | 中文字幕在线观看2021 | 国产成人免费 | 欧美在线网站 | 丝袜+亚洲+另类+欧美+变态 | 久久综合久色欧美综合狠狠 | 精品久久久久久国产 | 99亚洲| 日韩欧美一区二区在线 | 亚洲精品一区在线观看 | 91久久久久| 国产精品自产av一区二区三区 | 日韩精品 | 亚洲一区二区中文 | 亚洲国产成人av好男人在线观看 | 国产亚洲欧美精品永久 | 国产精品久久久久久久午夜片 | 成人欧美一区二区三区白人 | 成人av电影网址 | 久久综合一区 | 在线第一页| 99精品一区二区三区 | 男人电影天堂 | 国产偷录视频叫床高潮对白 | 91精品国产91久久久久久久久久久久 | 亚洲另类视频 | 视频在线一区 | 成人在线激情 | 国产偷录视频叫床高潮对白 | 99精品视频免费在线观看 | 一区二区在线看 | 一区福利 | 亚洲欧洲精品一区二区三区 | 97国产超碰 | 曰曰操| 亚洲精品久久久久久下一站 | 国产精品高清在线 | 国产精品欧美久久久久一区二区 | 成人激情视频在线观看 | 日本福利网站 | 亚洲色图第八页 | 国产精品久久久av | 国产九九精品视频 | 亚洲精品片 | 99久久夜色精品国产网站 | 亚洲精品一区二区三区精华液 | 亚洲精品久久久久久下一站 | 操视频网站 | 成人在线小视频 | a在线观看 | 午夜小视频在线观看 | 国产九九九 | 国产98色在线 | 日韩 | 可以免费看黄的网站 | 天天夜夜操操 | 日韩在线免费观看视频 | 天堂在线中文 | 美女福利视频网站 | 玖玖精品| 欧美a在线看 | 亚洲午夜精品一区二区三区他趣 | 国产精品久久久久久一区二区三区 | 亚洲国产一区二区三区在线观看 | 国产一区二区在线电影 | 国产色视频网站 | 91亚洲一区 | 久久久资源 | 日韩精品久久久久久 | 婷婷在线观看视频 | 久综合网 | 天天舔天天干天天操 | 欧美日韩综合在线 | 国产精品观看 | 国产精品成人一区二区 | 在线视频成人永久免费 | 日韩在线视频免费看 | 成人不卡 | 91免费影片| 亚洲欧美第一页 | 日韩在线播放视频 | 97成人在线视频 | 欧美精品欧美极品欧美激情 | 中文字幕一区二区在线观看 | 毛片毛片毛片毛片毛片毛片 | 精品久久久久久亚洲综合网站 | 一区二区视频网站 | 久久人人爽人人爽人人片av软件 | 国产成人亚洲精品 | 四季久久免费一区二区三区四区 | 中文字幕日韩在线 | 亚洲 欧美日韩 国产 中文 | 免费成人在线网站 | 精品午夜久久久 | 精品国产91亚洲一区二区三区www | 日韩精品一区二区三区 | 精品视频一区二区三区 | 国产一区二区精品在线观看 | 久久99精品久久久久久琪琪 | 超碰3| 国产精品96久久久久久久 | 久久久精品影院 | 精品久久久av | 国产精品入口久久 | 成人福利网站 | 亚洲视频一区二区 | 成年人在线观看 | 在线观看精品91福利 | 亚洲第一成年免费网站 | 中文字幕国产 | 久久中文字幕一区二区 | 在线成人亚洲 | 999在线观看精品免费不卡网站 | 午夜妇女aaaa区片 | 国产精一区二区 | 亚洲国产精品久久人人爱 | 久久久久久成人精品 | 亚洲一区二区三区四区五区午夜 | 一级电影免费看 | 日韩一区二区三区在线观看 | 中文字幕av一区 | 成人久久久精品乱码一区二区三区 | 日韩三级视频 | 毛片国产| 中文字幕在线第一页 | 日产精品久久久一区二区 | chinese中国真实乱对白 | 免费国产一区二区 | 成人免费视屏 | 欧美激情一区二区三区 | 久久成人免费观看 | 久久6 | 欧美日本国产 | 天天草av| 亚洲欧洲精品成人久久奇米网 | 成人在线观看网 | 亚洲精品成人悠悠色影视 | 欧美不卡 | 国产精品亚洲一区二区三区在线 | 亚洲一区二区三区在线观看免费 | 国产三区四区 | 日韩毛片免费视频一级特黄 | 亚洲wu码 | 亚洲欧美日韩另类精品一区二区三区 | 国产精品自产拍在线观看 | 91免费看 | www.中文字幕在线 | 日本一区二区不卡 | 欧洲精品视频在线观看 | 三级在线视频 | 男人天堂av网站 | 亚洲天堂一区二区 | 亚洲精品久久久久午夜 | 毛片在线视频 | 色av色av色av | 日韩视频在线观看视频 | 成人在线观看免费 | 精品一区视频 | www国产一区 | 成人三级网址 | 狠狠爱网站 | 一级片av | 成人欧美一区二区三区在线播放 | 国产欧美日韩综合精品一区二区 | 国产高清精品一区二区三区 | 一区二区免费在线视频 | 这里只有精品视频 | 国产不卡精品视频 | 欧美二区三区 | 精品乱码久久久 | 国产成人精品久久二区二区 | 国产 高清 在线 | 亚洲人成在线观看 | 干干干操操操 | 久草院线 | 欧美激情视频久久 | 亚洲国产精品一区二区三区 | 中文字幕av一区二区 | 国产精品成人在线观看 | 日韩av一区二区三区四区 | 久久99国产精品久久99大师 | 一区二区三区不卡视频 | 成人免费一区二区三区视频软件 | 在线播放一区二区三区 | 久草视频在线看 | 久久免费在线观看 | 国产精品一区二区三区在线看 | 久草成人网 | 国产三级日本三级美三级 | 91亚洲精| 国产精品久久久久久久久久久杏吧 | 亚洲欧美国产精品久久久久 | 成人黄色电影在线观看 | 国产拍拍拍拍拍拍拍拍拍拍拍拍拍 | 亚洲成av | 亚洲区一区二 | 欧美二区三区 | 成人精品一区 | 免费在线a | 在线成人www免费观看视频 | 成人免费xxxxxxx | 国产精品久久久久永久免费观看 | 99免费精品 | 天天干天天av | 99精品欧美一区二区三区综合在线 | 91视视频在线观看入口直接观看 | 亚洲第一区在线 | 五月婷亚洲 | 久久久国产精品一区 | 欧美夜夜骑 | 亚洲免费视频网 | 欧洲精品一区 | 麻豆精品国产91久久久久久 | 国产成人精品久久二区二区 | 久久国产精品久久久久久久久久 | 国产午夜精品视频 | 国产高清在线精品一区二区三区 | 91在线免费看 | 国产精品27页 | 久久精品免费观看 | 久久国产精品久久精品 | 欧美日韩精品一区二区三区 | 毛片毛片毛片 | 日韩成人一区二区 | 99精品视频在线观看 | 欧美激情在线观看 | 久久精品小视频 | 羞羞在线观看视频免费观看hd | 一区二区日韩 | 亚洲精品二区 | 亚洲大尺度网站 | 91麻豆精品国产91久久久更新时间 | 亚洲第一免费看片 | 亚洲欧美一区二区三区在线 | 久久久久久亚洲 | 精品一区二区不卡 | 成人高清视频在线 | 欧美日本三级 | 欧美日韩中文字幕 | 91精品国产777在线观看 | 香港三级日本三级a视频 | 精品少妇一区二区 | 精品99久久久久久 | 国产综合av | 美女视频久久 | 亚洲国产午夜视频 | 欧美视频一区 | 91色爱 | 欧美精品久久久久 | 国产91对白叫床清晰播放 | 久久精选视频 | 天天天操 | 欧美日韩在线看 | 免费在线成人 | 亚洲 欧美 另类 综合 偷拍 | 中文字幕二区 | 国产精品不卡视频 | 欧美在线亚洲 | 色婷婷激情 | 久久久久一区二区三区 | 视频一区 国产精品 | 欧美视频三级 | 久久久成人网 | 黄在线看v| 久久国产精品免费一区二区三区 | 欧美日本韩国一区二区三区 | 91精品国产综合久久久久久丝袜 | 九九热精品视频在线观看 | 免费xxxxx在线观看网站软件 | 日韩欧美一区二区在线观看 | 久久综合久久久 | 免费国产一区二区 | 成人国产精品一级毛片视频 | 美女视频黄a | 97国产精品 | 精品久久影院 | 国产精品成人国产乱一区 | 欧美一区二区三区在线视频 | 久久精品1区2区 | 五月婷亚洲 | 天天操免费| 国产日产精品一区二区三区四区 | 国产香蕉视频在线播放 | 国产日韩av在线 | 精品久久久久久国产 | 国产一区中文字幕 | 三级在线视频 | 久色视频在线观看 | 香蕉久久久久久 | 久久精品亚洲一区二区 | 国产一区亚洲二区三区 | 黄色精品视频 | 黄视频网址 | 91一区二区在线 | 久久亚洲视频 | 91精品欧美久久久久久久 | 日韩欧美一区二区三区 | 人人草在线观看视频 | 国产91精品一区二区绿帽 | 激情久久av一区av二区av三区 | 一区二区三区视频在线 | 国产成人午夜精品影院游乐网 | 亚洲一区二区伦理 | 天天干,夜夜操 | 在线色网站 | 日日夜夜精品免费视频 | 国产一级黄色av | 免费看国产一级特黄aaaa大片 | 中文字幕免费视频观看 | 欧美一区二区三区免费 | 欧美精品在线观看 | 国产三级久久久久 | 久久叉| 久久综合一区二区三区 | 在线国产一区二区 | 久久久91精品国产一区二区三区 | 中文字幕亚洲欧美精品一区四区 | 一区中文字幕 | 欧美精品色网 | 国产精品成人国产乱一区 | 欧美日韩精品区 | 午夜艹 | 欧美精品一区二区三区四区 | 91免费观看视频 | 午夜精品网站 | 国产精品成人一区二区三区夜夜夜 | 成人精品久久 | 中文字幕亚洲精品 | 亚洲精品66 | www.国产高清 | 久免费视频 | 色啪网站 | 久久久久免费精品视频 | 久久小草 | 午夜免费高清视频 | 日韩a∨ | 久久精品久久久久电影 | 午夜午夜精品一区二区三区文 | 久久久久久免费免费 | 欧美在线观看视频 | 久久精品国产99国产精品 | 一区二区在线免费观看 | 欧洲成人在线 | 天天干天天插 | 日韩福利 | 欧美一级在线观看 | 亚洲一区二区三区免费 | 日韩一区二区三区在线观看 | 中文字幕在线免费视频 | 国产成人精品免高潮在线观看 | 国内精品一区二区三区 | 日本xxx性| 国产免费一区 | 久久精品小视频 | 精品国产欧美一区二区三区不卡 | 久草成人网 | 亚洲精品乱码久久久久久蜜桃不卡 | 国产精品视频99 | 精品第一区 | 国产一区二区三区四区五区加勒比 | 四季久久免费一区二区三区四区 | 丁香亚洲| 日韩一区二区福利视频 | 涩涩久久| 在线看av的网址 | 91精品视频在线播放 | 成年人在线观看视频 | 久久精品视频网站 | 日本一区二区不卡 | www日本高清视频 | 日韩在线观看 | 国产精品国产三级国产aⅴ无密码 | av一级毛片 | 婷婷色国产偷v国产偷v小说 | 性色视频在线 | 三级黄色视频毛片 | a级在线| 国产精品视频播放 | 亚洲在线 | 亚洲精品一区国语对白 | 亚洲人久久 | 一区二区三区在线看 | 一级欧美一级日韩片 | 天天操一操 | 中文字幕久久久 | 精品一区二区三区四区视频 | 天天天天天天天天干 | 综合网亚洲 | 成人免费视频在线观看 | 日韩视频一区二区三区在线观看 | 国产丝袜人妖ts黄檬 | 日韩精品99久久久久中文字幕 | 高清一区二区三区视频 | 久久久久久国产精品 | 日韩视频在线免费 | 国产精品永久久久久久久久久 | 国产日韩精品一区二区 | 伊人春色成人 | 日本一区二区不卡视频 | 国产在线日韩 | h视频在线免费观看 | 亚洲精品乱码久久久久久不卡 | 国产高清在线 | 午夜视频在线观看免费视频 | 欧美一级视频在线观看 | 欧洲国产伦久久久久久久 | 成人精品久久 | 国产麻豆乱码精品一区二区三区 | 美女久久一区 | 亚洲精品自拍 | 91久久久久久久久久久久久久久久 | 九一视频在线播放 | 久久久国产一区 | 亚洲综合大片69999 | 污污视频免费网站 | 久久久国产视频 | 99精品网站| 一区亚洲| 欧美成人一区二区三区片免费 | 91精品国产777在线观看 | 国产成人精品久久二区二区 | 欧美精品一区二 | 国产精品一区二区在线 | 一区二区三区精品 | 99国产精品久久久久久久 | 日韩成人在线视频 | 成人亚洲精品久久久久软件 | 欧美一区二区三区男人的天堂 | 日韩国产精品一区二区三区 | 国产精品视频免费播放 | 国产剧情一区二区三区 | 国产福利在线播放 | 亚洲国产一区二区三区四区 | 日韩在线视频一区 | 91在线网址 | av在线日韩 | 日韩aⅴ一区二区三区 | 高清一区二区三区 | 日韩欧美视频一区 | 黄毛片视频| 亚洲精品一 | 国产精品第一国产精品 | 日韩久久久久久 | 91资源总站 | 欧美在线播放一区二区三区 | 麻豆.蜜桃.91.天美入口 | 一区二区三区国产在线观看 | 久久久综合色 | 国产在线二区 | 日本久久久久久久久 | 亚洲国产欧美日韩 | 色视频网站在线观看 | 一区二区日本 | 99日韩| 日韩第一区| 久久久噜噜噜www成人网 | 精品国产髙清在线看国产毛片 | 日日精品| 日韩不卡一区 | 亚洲一区二区三区高清 | 日本在线免费观看 | 一区二区中文字幕在线观看 | 在线 亚洲 欧美 | 亚洲精品一区久久久久久 | 国产成人精品在线观看 | 国产精品网站在线观看 | 亚洲免费视频网站 | 亚洲精品7777xxxx青睐 | 91成人免费看 | 日韩欧美国产一区二区 | 这里只有精品在线 | 国产精品精品 | 国产精品美女 | 91视频专区 | 中文字幕av一区 | 极品久久 | 国产片在线观看 | 亚洲精品久久久久久一区二区 | 免费观看一级特黄欧美大片 | 国产一区精品视频 | 欧美一区免费 | 日本午夜网 | 青青久久北条麻妃 | 精品日韩欧美 | 国产精品第一国产精品 | 久久久久久亚洲 | 麻豆视频国产 | 久久久久久久精 | 成人亚洲天堂 | a级毛片免费高清视频 |