精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

不要再問我 In,Exists 走不走索引了...

運維 數(shù)據(jù)庫運維
最近,有一個業(yè)務(wù)需求,給我一份數(shù)據(jù) A ,把它在數(shù)據(jù)庫 B 中存在,而又比 A 多出的部分算出來。由于數(shù)據(jù)比較雜亂,我這里簡化模型。

[[339313]]

前言

最近,有一個業(yè)務(wù)需求,給我一份數(shù)據(jù) A ,把它在數(shù)據(jù)庫 B 中存在,而又比 A 多出的部分算出來。由于數(shù)據(jù)比較雜亂,我這里簡化模型。

然后就會發(fā)現(xiàn),我去,這不就是 not in ,not exists 嘛。

那么問題來了,in, not in , exists , not exists 它們有什么區(qū)別,效率如何?

曾經(jīng)從網(wǎng)上聽說,in 和 exists 不會走索引,那么事實真的是這樣嗎?

帶著疑問,我們研究下去。

注意: 在說這個問題時,不說明 MySQL 版本的都是耍流氓,我這里用的是 5.7.18 。

用法講解

為了方便,我們創(chuàng)建兩張表 t1 和 t2 。并分別加入一些數(shù)據(jù)。(id為主鍵,name為普通索引)

  1. -- t1 
  2. DROP TABLE IF EXISTS `t1`; 
  3. CREATE TABLE `t1` ( 
  4.   `id` int(11) NOT NULL AUTO_INCREMENT, 
  5.   `namevarchar(255) DEFAULT NULL
  6.   `address` varchar(255) DEFAULT NULL
  7.   PRIMARY KEY (`id`), 
  8.   KEY `idx_t1_name` (`name`(191)) USING BTREE 
  9. ) ENGINE=InnoDB AUTO_INCREMENT=1009 DEFAULT CHARSET=utf8mb4; 
  10.  
  11. INSERT INTO `t1` VALUES ('1001''張三''北京'), ('1002''李四''天津'), ('1003''王五''北京'), ('1004''趙六''河北'), ('1005''杰克''河南'), ('1006''湯姆''河南'), ('1007''貝爾''上海'), ('1008''孫琪''北京'); 
  12.  
  13. -- t2 
  14. DROP TABLE IF EXISTS `t2`; 
  15. CREATE TABLE `t2`  ( 
  16.   `id` int(11) NOT NULL AUTO_INCREMENT, 
  17.   `namevarchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL
  18.   `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL
  19.   PRIMARY KEY (`id`) USING BTREE, 
  20.   INDEX `idx_t2_name`(`name`(191)) USING BTREE 
  21. ) ENGINE = InnoDB AUTO_INCREMENT = 1014 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic
  22.  
  23. INSERT INTO `t2` VALUES (1001, '張三''北京'); 
  24. INSERT INTO `t2` VALUES (1004, '趙六''河北'); 
  25. INSERT INTO `t2` VALUES (1005, '杰克''河南'); 
  26. INSERT INTO `t2` VALUES (1007, '貝爾''上海'); 
  27. INSERT INTO `t2` VALUES (1008, '孫琪''北京'); 
  28. INSERT INTO `t2` VALUES (1009, '曹操''魏國'); 
  29. INSERT INTO `t2` VALUES (1010, '劉備''蜀國'); 
  30. INSERT INTO `t2` VALUES (1011, '孫權(quán)''吳國'); 
  31. INSERT INTO `t2` VALUES (1012, '諸葛亮''蜀國'); 
  32. INSERT INTO `t2` VALUES (1013, '典韋''魏國'); 

 

那么,對于當(dāng)前的問題,就很簡單了,用 not in 或者 not exists 都可以把 t1 表中比 t2 表多出的那部分?jǐn)?shù)據(jù)給挑出來。(當(dāng)然,t2 比 t1 多出來的那部分不算)

這里假設(shè)用 name 來匹配數(shù)據(jù)。

  1. select * from t1 where name not in (select name from t2); 
  2. 或者用 
  3. select * from t1 where not exists (select name from t2 where t1.name=t2.name); 

得到的結(jié)果都是一樣的。

 

但是,需要注意的是,not in 和 not exists 還是有不同點的。

在使用 not in 的時候,需要保證子查詢的匹配字段是非空的。如,此表 t2 中的 name 需要有非空限制。如若不然,就會導(dǎo)致 not in 返回的整個結(jié)果集為空。

例如,我在 t2 表中加入一條 name 為空的數(shù)據(jù)。

  1. INSERT INTO `t2` VALUES (1014, NULL'魏國'); 

則此時,not in 結(jié)果就會返回空。

 

另外需要明白的是, exists 返回的結(jié)果是一個 boolean 值 true 或者 false ,而不是某個結(jié)果集。因為它不關(guān)心返回的具體數(shù)據(jù)是什么,只是外層查詢需要拿這個布爾值做判斷。

區(qū)別是,用 exists 時,若子查詢查到了數(shù)據(jù),則返回真。用 not exists 時,若子查詢沒有查到數(shù)據(jù),則返回真。

由于 exists 子查詢不關(guān)心具體返回的數(shù)據(jù)是什么。因此,以上的語句完全可以修改為如下,

  1. -- 子查詢中 name 可以修改為其他任意的字段,如此處改為 1 。 
  2. select * from t1 where not exists (select 1 from t2 where t1.name=t2.name); 

從執(zhí)行效率來說,1 > column > * 。因此推薦用 select 1。(準(zhǔn)確的說應(yīng)該是常量值)

in, exists 執(zhí)行流程

1、 對于 in 查詢來說,會先執(zhí)行子查詢,如上邊的 t2 表,然后把查詢得到的結(jié)果和外表 t1 做笛卡爾積,再通過條件進行篩選(這里的條件就是指 name 是否相等),把每個符合條件的數(shù)據(jù)都加入到結(jié)果集中。

sql 如下,

  1. select * from t1 where name in (select name from t2); 

偽代碼如下:

  1. for(x in A){ 
  2.     for(y in B){ 
  3.      if(condition is true) {result.add();} 
  4.     } 

這里的 condition 其實就是對比兩張表中的 name 是否相同。

2、對于 exists 來說,是先查詢遍歷外表 t1 ,然后每次遍歷時,再檢查在內(nèi)表是否符合匹配條件,即檢查是否存在 name 相等的數(shù)據(jù)。

sql 如下,

  1. select * from t1 where name exists (select 1 from t2); 

偽代碼如下:

  1. for(x in A){ 
  2.   if(exists condition is true){result.add();} 

對應(yīng)于此例,就是從 id 為 1001 開始遍歷 t1 表 ,然后遍歷時檢查 t2 中是否有相等的 name 。

如 id=1001時,張三存在于 t2 表中,則返回 true,把 t1 中張三的這條記錄加入到結(jié)果集,繼續(xù)下次循環(huán)。id=1002 時,李四不在 t2 表中,則返回 false,不做任何操作,繼續(xù)下次循環(huán)。直到遍歷完整個 t1 表。

是否走索引?

針對網(wǎng)上說的 in 和 exists 不走索引,那么究竟是否如此呢?

我們在 MySQL 5.7.18 中驗證一下。(注意版本號哦)

單表查詢

首先,驗證單表的最簡單的情況。我們就以 t1 表為例,id為主鍵, name 為普通索引。

分別執(zhí)行以下語句,

  1. explain select * from t1 where id in (1001,1002,1003,1004); 
  2. explain select * from t1 where id in (1001,1002,1003,1004,1005); 
  3. explain select * from t1 where name in ('張三','李四'); 
  4. explain select * from t1 where name in ('張三','李四','王五'); 

為什么我要分別查不同的 id 個數(shù)呢?看截圖,

 

會驚奇的發(fā)現(xiàn),當(dāng) id 是四個值時,還走主鍵索引。而當(dāng) id 是五個值時,就不走索引了。這就很耐人尋味了。

再看 name 的情況,

 

同樣的當(dāng)值多了之后,就不走索引了。

所以,我猜測這個跟匹配字段的長度有關(guān)。按照漢字是三個字節(jié)來計算,且程序設(shè)計中喜歡用2的n次冪的尿性,這里大概就是以 16 個字節(jié)為分界點。

然而,我又以同樣的數(shù)據(jù),去我的服務(wù)器上查詢(版本號 5.7.22),發(fā)現(xiàn)四個id值時,就不走索引了。因此,估算這里的臨界值為 12 個字節(jié)。

不管怎樣,這說明了,在 MySQL 中應(yīng)該對 in 查詢的字節(jié)長度是有限制的。(沒有官方確切說法,所以,僅供參考)

多表涉及子查詢

我們主要是去看當(dāng)前的這個例子中的兩表查詢時, in 和 exists 是否走索引。

一、分別執(zhí)行以下語句,主鍵索引(id)和普通索引(name),在 in , not in 下是否走索引。

  1. explain select * from t1 where id in (select id from t2); --1 
  2. explain select * from t1 where name in (select name from t2); --2 
  3. explain select * from t1 where id not in (select id from t2); --3 
  4. explain select * from t1 where name not in (select name from t2); --4 

結(jié)果截圖如下,

1、t1 走索引,t2 走索引。

1

 

2、t1 不走索引,t2不走索引。(此種情況,實測若把name改為唯一索引,則t1也會走索引)

2

 

3、t1 不走索引,t2走索引。

3

 

4、t1不走索引,t2不走索引。

4

 

我滴天,這結(jié)果看起來亂七八糟的,好像走不走索引,完全看心情。

但是,我們發(fā)現(xiàn)只有第一種情況,即用主鍵索引字段匹配,且用 in 的情況下,兩張表才都走索引。

這個到底是不是規(guī)律呢?有待考察,且往下看。

二、接下來測試,主鍵索引和普通索引在 exists 和 not exists 下的情況。sql如下,

  1. explain select * from t1 where exists (select 1 from t2 where t1.id=t2.id); 
  2. explain select * from t1 where exists (select 1 from t2 where t1.name=t2.name); 
  3. explain select * from t1 where not exists (select 1 from t2 where t1.id=t2.id); 
  4. explain select * from t1 where not exists (select 1 from t2 where t1.name=t2.name); 

這個結(jié)果就非常有規(guī)律了,且看,

 

有沒有發(fā)現(xiàn), t1 表哪種情況都不會走索引,而 t2 表是有索引的情況下就會走索引。為什么會出現(xiàn)這種情況?

其實,上一小節(jié)說到了 exists 的執(zhí)行流程,就已經(jīng)說明問題了。

它是以外層表為驅(qū)動表,無論如何都會循環(huán)遍歷的,所以會全表掃描。而內(nèi)層表通過走索引,可以快速判斷當(dāng)前記錄是否匹配。

效率如何?

針對網(wǎng)上說的 exists 一定比 in 的執(zhí)行效率高,我們做一個測試。

分別在 t1,t2 中插入 100W,200W 條數(shù)據(jù)。

我這里,用的是自定義函數(shù)來循環(huán)插入,語句參考如下,(沒有把表名抽離成變量,因為我沒有找到方法,尷尬)

  1. -- 傳入需要插入數(shù)據(jù)的id開始值和數(shù)據(jù)量大小,函數(shù)返回結(jié)果為最終插入的條數(shù),此值正常應(yīng)該等于數(shù)據(jù)量大小。 
  2. -- id自增,循環(huán)往 t1 表添加數(shù)據(jù)。這里為了方便,id、name取同一個變量,address就為北京。 
  3. delimiter //  
  4. drop function if exists insert_datas1// 
  5. create function insert_datas1(in_start int(11),in_len int(11)) returns int(11) 
  6. begin   
  7.   declare cur_len int(11) default 0; 
  8.   declare cur_id int(11); 
  9.   set cur_id = in_start; 
  10.   
  11.   while cur_len < in_len do 
  12.      insert into t1 values(cur_id,cur_id,'北京'); 
  13.   set cur_len = cur_len + 1; 
  14.   set cur_id = cur_id + 1; 
  15.   end while;  
  16.   return cur_len; 
  17. end   
  18. // 
  19. delimiter ; 
  20. -- 同樣的,往 t2 表插入數(shù)據(jù) 
  21. delimiter //  
  22. drop function if exists insert_datas2// 
  23. create function insert_datas2(in_start int(11),in_len int(11)) returns int(11) 
  24. begin   
  25.   declare cur_len int(11) default 0; 
  26.   declare cur_id int(11); 
  27.   set cur_id = in_start; 
  28.   
  29.   while cur_len < in_len do 
  30.      insert into t2 values(cur_id,cur_id,'北京'); 
  31.   set cur_len = cur_len + 1; 
  32.   set cur_id = cur_id + 1; 
  33.   end while;  
  34.   return cur_len; 
  35. end   
  36. // 
  37. delimiter ; 

在此之前,先清空表里的數(shù)據(jù),然后執(zhí)行函數(shù),

  1. select insert_datas1(1,1000000); 

對 t2 做同樣的處理,不過為了兩張表數(shù)據(jù)有交叉,就從 70W 開始,然后插入 200W 數(shù)據(jù)。

  1. select insert_datas2(700000,2000000); 

在家里的電腦,實際執(zhí)行時間,分別為 36s 和 74s。

不知為何,家里的電腦還沒有在 Docker 虛擬機中跑的腳本快。。害,就這樣湊合著用吧。

等我有了新歡錢,就把它換掉,哼哼。

同樣的,把上邊的執(zhí)行計劃都執(zhí)行一遍,進行對比。我這里就不貼圖了。

in 和 exists 孰快孰慢

為了方便,主要拿以下這兩個 sql 來對比分析。

  1. select * from t1 where id in (select id from t2); 
  2. select * from t1 where exists (select 1 from t2 where t1.id=t2.id); 

執(zhí)行結(jié)果顯示,兩個 sql 分別執(zhí)行 1.3s 和 3.4s 。

注意此時,t1 表數(shù)據(jù)量為 100W, t2 表數(shù)據(jù)量為 200W 。

按照網(wǎng)上對 in 和 exists 區(qū)別的通俗說法,

如果查詢的兩個表大小相當(dāng),那么用in和exists差別不大;如果兩個表中一個較小一個較大,則子查詢表大的用exists,子查詢表小的用in;

對應(yīng)于此處就是:

  • 當(dāng) t1 為小表, t2 為大表時,應(yīng)該用 exists ,這樣效率高。
  • 當(dāng) t1 為大表,t2 為小表時,應(yīng)該用 in,這樣效率較高。

而我用實際數(shù)據(jù)測試,就把第一種說法給推翻了。因為很明顯,t1 是小表,但是 in 比 exists 的執(zhí)行速度還快。

為了繼續(xù)測驗它這個觀點,我把兩個表的內(nèi)表外表關(guān)系調(diào)換一下,讓 t2 大表作為外表,來對比查詢,

  1. select * from t2 where id in (select id from t1); 
  2. select * from t2 where exists (select 1 from t1 where t1.id=t2.id); 

執(zhí)行結(jié)果顯示,兩個 sql 分別執(zhí)行 1.8s 和 10.0s 。

是不是很有意思。可以發(fā)現(xiàn),

  • 對于 in 來說,大表小表調(diào)換了內(nèi)外層關(guān)系,執(zhí)行時間并無太大區(qū)別。一個是 1.3s,一個是 1.8s。
  • 對于 exists 來說,大小表調(diào)換了內(nèi)外層關(guān)系,執(zhí)行時間天壤之別,一個是 3.4s ,一個是 10.0s,足足慢了兩倍。

一、以查詢優(yōu)化器維度對比。

為了探究這個結(jié)果的原因。我去查看它們分別在查詢優(yōu)化器中優(yōu)化后的 sql 。

  1. -- 此為 5.7 寫法,如果是 5.6版本,需要用 explain extended ... 
  2. explain select * from t1 where id in (select id from t2); 
  3. -- 本意為顯示警告信息。但是和 explain 一塊兒使用,就會顯示出優(yōu)化后的sql。需要注意使用順序。 
  4. show warnings; 

-- 此為 5.7 寫法,如果是 5.6版本,需要用 explain extended ...explain select * from t1 where id in (select id from t2);-- 本意為顯示警告信息。但是和 explain 一塊兒使用,就會顯示出優(yōu)化后的sql。需要注意使用順序。show warnings;

在結(jié)果 Message 里邊就會顯示我們要的語句。

  1. -- message 優(yōu)化后的sql 
  2. select `test`.`t1`.`id` AS `id`,`test`.`t1`.`nameAS `name`,`test`.`t1`.`address` AS `address` from `test`.`t2` join `test`.`t1` where (`test`.`t2`.`id` = `test`.`t1`.`id`) 

可以發(fā)現(xiàn),這里它把 in 轉(zhuǎn)換為了 join 來執(zhí)行。

這里沒有用 on,而用了 where,是因為當(dāng)只有 join 時,后邊的 on 可以用 where 來代替。即 join on 等價于 join where 。

PS: 這里我們也可以發(fā)現(xiàn),select * 最終會被轉(zhuǎn)化為具體的字段,知道為什么我們不建議用 select * 了吧。

同樣的,以 t2 大表為外表的查詢情況,也查看優(yōu)化后的語句。

  1. explain select * from t2 where id in (select id from t1); 
  2. show warnings; 

我們會發(fā)現(xiàn),它也會轉(zhuǎn)化為 join 的。

  1. select `test`.`t2`.`id` AS `id`,`test`.`t2`.`nameAS `name`,`test`.`t2`.`address` AS `address` from `test`.`t1` join `test`.`t2` where (`test`.`t2`.`id` = `test`.`t1`.`id`) 

這里不再貼 exists 的轉(zhuǎn)化 sql ,其實它沒有什么大的變化。

二、以執(zhí)行計劃維度對比。

我們再以執(zhí)行計劃維度來對比他們的區(qū)別。

  1. explain select * from t1 where id in (select id from t2); 
  2. explain select * from t2 where id in (select id from t1); 
  3. explain select * from t1 where exists (select 1 from t2 where t1.id=t2.id); 
  4. explain select * from t2 where exists (select 1 from t1 where t1.id=t2.id); 

執(zhí)行結(jié)果分別為,

1

2

3


 

4

 

可以發(fā)現(xiàn),對于 in 來說,大表 t2 做外表還是內(nèi)表,都會走索引的,小表 t1 做內(nèi)表時也會走索引。看它們的 rows 一列也可以看出來,前兩張圖結(jié)果一樣。

對于 exists 來說,當(dāng)小表 t1 做外表時,t1 全表掃描,rows 近 100W;當(dāng) 大表 t2 做外表時, t2 全表掃描,rows 近 200W 。這也是為什么 t2 做外表時,執(zhí)行效率非常低的原因。

因為對于 exists 來說,外表總會執(zhí)行全表掃描的,當(dāng)然表數(shù)據(jù)越少越好了。

最終結(jié)論: 外層大表內(nèi)層小表,用in。外層小表內(nèi)層大表,in和exists效率差不多(甚至 in 比 exists 還快,而并不是網(wǎng)上說的 exists 比 in 效率高)。

not in 和 not exists 孰快孰慢

此外,實測對比 not in 和 not exists 。

  1. explain select * from t1 where id not in (select id from t2); 
  2. explain select * from t1 where not exists (select 1 from t2 where t1.id=t2.id); 
  3. explain select * from t1 where name not in (select name from t2); 
  4. explain select * from t1 where not exists (select 1 from t2 where t1.name=t2.name); 
  5.  
  6. explain select * from t2 where id not in (select id from t1); 
  7. explain select * from t2 where not exists (select 1 from t1 where t1.id=t2.id); 
  8. explain select * from t2 where name not in (select name from t1); 
  9. explain select * from t2 where not exists (select 1 from t1 where t1.name=t2.name); 

小表做外表的情況下。對于主鍵來說, not exists 比 not in 快。對于普通索引來說, not in 和 not exists 差不了多少,甚至 not in 會稍快。

大表做外表的情況下,對于主鍵來說, not in 比 not exists 快。對于普通索引來說, not in 和 not exists 差不了多少,甚至 not in 會稍快。

感興趣的同學(xué),可自行嘗試。以上邊的兩個維度(查詢優(yōu)化器和執(zhí)行計劃)分別來對比一下。

join 的嵌套循環(huán) (Nested-Loop Join)

為了理解為什么這里的 in 會轉(zhuǎn)換為 join ,我感覺有必要了解一下 join 的三種嵌套循環(huán)連接。

1、簡單嵌套循環(huán)連接,Simple Nested-Loop Join ,簡稱 SNLJ

join 即是 inner join ,內(nèi)連接,它是一個笛卡爾積,即利用雙層循環(huán)遍歷兩張表。

我們知道,一般在 sql 中都會以小表作為驅(qū)動表。所以,對于 A,B 兩張表,若A的結(jié)果集較少,則把它放在外層循環(huán),作為驅(qū)動表。自然,B 就在內(nèi)層循環(huán),作為被驅(qū)動表。

簡單嵌套循環(huán),就是最簡單的一種情況,沒有做任何優(yōu)化。

因此,復(fù)雜度也是最高的,O(mn)。偽代碼如下,

  1. for(id1 in A){ 
  2.     for(id2 in B){ 
  3.         if(id1==id2){ 
  4.             result.add(); 
  5.         } 
  6.     } 

2、索引嵌套循環(huán)連接,Index Nested-Loop Join ,簡稱 INLJ

看名字也能看出來了,這是通過索引進行匹配的。外層表直接和內(nèi)層表的索引進行匹配,這樣就不需要遍歷整個內(nèi)層表了。利用索引,減少了外層表和內(nèi)層表的匹配次數(shù)。

所以,此種情況要求內(nèi)層表的列要有索引。

偽代碼如下,

  1. for(id1 in A){ 
  2.     if(id1 matched B.id){ 
  3.         result.add(); 
  4.     } 

3、塊索引嵌套連接,Block Nested-Loop Join ,簡稱 BNLJ

塊索引嵌套連接,是通過緩存外層表的數(shù)據(jù)到 join buffer 中,然后 buffer 中的數(shù)據(jù)批量和內(nèi)層表數(shù)據(jù)進行匹配,從而減少內(nèi)層循環(huán)的次數(shù)。

以外層循環(huán)100次為例,正常情況下需要在內(nèi)層循環(huán)讀取外層數(shù)據(jù)100次。如果以每10條數(shù)據(jù)存入緩存buffer中,并傳遞給內(nèi)層循環(huán),則內(nèi)層循環(huán)只需要讀取10次(100/10)就可以了。這樣就降低了內(nèi)層循環(huán)的讀取次數(shù)。

MySQL 官方文檔也有相關(guān)說明,可以參考:https://dev.mysql.com/doc/refman/5.7/en/nested-loop-joins.html#block-nested-loop-join-algorithm

 

所以,這里轉(zhuǎn)化為 join,可以用到索引嵌套循環(huán)連接,從而提高了執(zhí)行效率。

本文轉(zhuǎn)載自微信公眾號「煙雨星空」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系煙雨星空公眾號。

 

責(zé)任編輯:武曉燕 來源: 煙雨星空
相關(guān)推薦

2022-03-14 10:14:43

底層系統(tǒng)Nacos

2020-12-11 09:24:19

Elasticsear存儲數(shù)據(jù)

2018-09-28 05:25:53

TopK算法代碼

2018-11-09 09:34:05

面試Spring Clou底層

2019-08-29 09:49:50

2020-09-24 14:40:55

Python 開發(fā)編程語言

2020-04-22 11:19:07

貪心算法動態(tài)規(guī)劃

2018-11-01 13:49:23

桶排序排序面試

2018-10-28 22:37:00

計數(shù)排序排序面試

2021-01-22 10:09:23

簡歷求職者面試

2020-04-16 08:22:11

HTTPS加解密協(xié)議

2015-02-13 10:42:31

前端工具Dreamweaver

2021-11-24 10:10:32

axios前端攔截器

2024-11-29 10:44:00

2020-03-30 17:20:54

B+樹SQL索引

2020-04-02 11:06:47

數(shù)據(jù)庫Docker容器

2022-02-24 07:48:47

MySQL索引查詢

2019-12-17 09:29:02

數(shù)據(jù)庫架構(gòu)分庫分表

2021-09-29 07:29:57

索引子查詢開發(fā)

2018-11-06 11:40:19

時間復(fù)雜度面試算法
點贊
收藏

51CTO技術(shù)棧公眾號

91超碰国产在线| 91一区二区视频| 亚洲尤物av| 欧美巨大另类极品videosbest | 国产精品电影久久久久电影网| 中文字幕精品亚洲| 国产精品久久久久av蜜臀 | 一级aaaa毛片| 99精品免费| 精品国产美女在线| 极品人妻一区二区三区| 国产精品日本一区二区三区在线| 欧美日韩国产中文字幕| 欧美乱大交xxxxx| 手机免费看av片| 成人做爰免费视频免费看| 一区二区三区视频在线看| 日韩理论片在线观看| www.久久成人| 久久成人久久鬼色| 日本久久中文字幕| 日本中文字幕免费| 欧美第十八页| 一区二区成人精品| 中文在线永久免费观看| 欧美一区一区| 欧美日韩电影在线播放| 免费欧美一级视频| 免费在线播放电影| 一区在线播放视频| 午夜精品区一区二区三| 免费国产精品视频| 高清不卡一区二区在线| 成人中文字幕+乱码+中文字幕| www.日韩一区| 亚洲主播在线| 97超级碰碰人国产在线观看| 精品一区免费观看| 欧美不卡高清| 不卡av在线播放| 蜜桃av免费在线观看| 九九热精品视频在线观看| 亚洲国产成人精品久久久国产成人一区 | yw视频在线观看| av成人动漫在线观看| 91av免费看| 99精品人妻无码专区在线视频区| 男女男精品视频网| 国产精品丝袜白浆摸在线| 黄色av一级片| 久久久久国产精品一区二区| 人妖精品videosex性欧美| 亚洲视频免费播放| 一级成人国产| 国产va免费精品高清在线观看| 成人免费a视频| 国产精品综合色区在线观看| 欧洲中文字幕国产精品| 樱花视频在线免费观看| 青青草国产成人99久久| 国产精品亚洲网站| 国产普通话bbwbbwbbw| 国内精品伊人久久久久av影院| 成人欧美一区二区三区在线| 国产剧情久久久| 国产成人综合网站| 国产精品视频在线免费观看 | 四虎4hu永久免费入口| 日本福利在线| 亚洲精品视频观看| 国产曰肥老太婆无遮挡| 在线观看爽视频| 日本高清不卡在线观看| 性生活免费在线观看| vam成人资源在线观看| 日韩精品一区二区三区在线观看 | 在线观看毛片av| 国产一区二区伦理片| 成人av片网址| 婷婷国产在线| 欧美韩日一区二区三区| 亚洲亚洲精品三区日韩精品在线视频| 久草中文在线| 亚洲成av人片一区二区梦乃| 久久久久久久久久久久久久国产| 国产亚洲人成a在线v网站| 日韩视频在线一区二区| 影音先锋黄色资源| 成人免费在线播放| 欧美黑人性视频| 欧美日韩一二三四区| 久草中文综合在线| 国产区二精品视| 午夜小视频在线| 亚洲国产一区二区三区青草影视| 日本精品久久久久中文字幕| 国产亚洲精aa在线看| 亚洲激情在线观看| 美国一级片在线观看| 亚洲精品激情| 成人国产精品久久久久久亚洲| 狠狠综合久久av一区二区| 国产婷婷色一区二区三区四区 | 3d玉蒲团在线观看| 色综合久久久网| 亚洲黄色片免费看| 亚洲春色h网| 九九热精品视频国产| 日韩 国产 欧美| 国产不卡视频一区二区三区| 日韩视频专区| 欧美在线极品| 日韩美女主播在线视频一区二区三区| jizz中文字幕| 亚洲毛片在线| 不卡视频一区二区三区| 在线视频1区2区| 色婷婷国产精品综合在线观看| 18深夜在线观看免费视频| 欧美偷拍自拍| 秋霞av国产精品一区| 亚洲AV无码乱码国产精品牛牛| 欧美国产在线观看| 亚洲熟妇av一区二区三区 | 婷婷五月色综合| 一个人www视频在线免费观看| 欧美大片在线观看| 色老板免费视频| 久久精品国产成人一区二区三区 | 97av自拍| av片哪里在线观看| 欧美剧在线免费观看网站| 手机毛片在线观看| 西西裸体人体做爰大胆久久久| 国产精品免费一区二区三区在线观看 | 日韩欧美中文字幕一区二区三区| 在线观看91久久久久久| 日韩 国产 欧美| 国产亚洲一区二区在线观看| 99999精品视频| 香蕉久久夜色精品国产更新时间| 久久人人97超碰精品888| www久久久久久| 一区二区三区不卡视频在线观看| 91亚洲精品久久久蜜桃借种| 久久神马影院| 国产在线拍揄自揄视频不卡99| h视频在线播放| 欧美日韩视频一区二区| 人妻熟人中文字幕一区二区| 日本视频免费一区| 五月婷婷综合色| 亚洲精品毛片| 插插插亚洲综合网| www.激情五月| 午夜精品123| jizz欧美性20| 日韩电影在线一区二区三区| 亚洲欧洲日韩精品| 国产高清日韩| 欧美大秀在线观看| 天天爽夜夜爽夜夜爽| 欧美日韩视频在线| 国产伦理片在线观看| 美女视频免费一区| 粉嫩av一区二区三区天美传媒 | 国产第一页第二页| 99视频一区二区| 欧美一级黄色影院| 999精品视频| 超碰97在线人人| 国产伦理精品| 国产一区二区三区中文| 国产精品免费无遮挡| 亚洲国产综合在线| av在线网站观看| 狠狠色丁香久久婷婷综合丁香| 久久免费一级片| 久久久久高潮毛片免费全部播放| 日韩av不卡电影| 日本三级在线视频| 亚洲成人av在线| 337p粉嫩色噜噜噜大肥臀| 中文字幕欧美一| 亚洲久久久久久| 蜜桃视频在线一区| 国产成a人亚洲精v品在线观看| 免费国产自久久久久三四区久久| 国产女精品视频网站免费| 黄色的视频在线观看| 亚洲色图五月天| 亚洲国产精彩视频| 在线亚洲一区二区| 久久久久久久国产视频| 日本一区二区三级电影在线观看 | 欧美性在线视频| 欧美jizzhd69巨大| 日韩高清av一区二区三区| 一级黄色片免费看| 无吗不卡中文字幕| 搜索黄色一级片| 久久婷婷综合激情| 巨乳女教师的诱惑| 青娱乐精品视频| 久久视频这里有精品| 国产精品久久久久久久免费观看| 久草精品电影| 欧美第一在线视频| 国产精品视频一区二区高潮| 大桥未久在线视频| 欧美理论片在线观看| 成人高清网站| 精品无码久久久久久国产| 99久久精品免费看国产交换| 91国产精品成人| 日韩手机在线观看| 国产精品久久久久久久久果冻传媒 | 日本少妇做爰全过程毛片| 亚洲视频在线观看一区| 欧美大波大乳巨大乳| 91丝袜美腿高跟国产极品老师| 日本人dh亚洲人ⅹxx| 国产做a爰片久久毛片| 三级在线视频观看| 老司机精品久久| 欧美 日韩 国产一区| 精品999日本| 蜜桃网站在线观看| 亚洲h色精品| 在线播放豆国产99亚洲| 欧美日韩亚洲在线观看| 欧美日韩精品免费看| 亚州精品视频| 久久精品中文字幕一区二区三区 | 日韩激情电影免费看| 欧美激情综合色| 日本动漫理论片在线观看网站| 久久久国产视频| 黄色在线视频网站| 久久久成人的性感天堂| 色综合久久影院| 日韩中文理论片| 91caoporn在线| 色婷婷综合成人av| 免费人成在线观看播放视频| 中文字幕精品网| 免费在线看a| 久久精品99久久久香蕉| 国产精品剧情一区二区在线观看| 精品国产一区二区三区久久狼5月| 欧美日韩在线看片| 久久精品国产亚洲精品| av在线网址观看| 久久99视频精品| 欧美videosex性欧美黑吊| 国模精品系列视频| 色偷偷偷在线视频播放| 日韩av日韩在线观看| 日韩高清在线| 成人激情视频在线播放| 精品一区二区三区中文字幕视频| 亚洲综合中文字幕68页| 亚洲精品v亚洲精品v日韩精品| 国产精品美女黄网| 亚洲自拍电影| 亚洲无玛一区| 激情视频一区二区三区| 日本在线观看a| 欧美96一区二区免费视频| 欧美在线a视频| 成人午夜在线视频| 91中文字幕永久在线| 国产精品剧情在线亚洲| 日本妇女毛茸茸| 欧美日韩另类在线| 最近中文字幕在线免费观看| 911国产精品| 人妻无码中文字幕| 亚洲网站在线观看| 综合图区亚洲| 国产成人精品日本亚洲| 成人噜噜噜噜| 久久久免费看| 国产精品久久观看| 少妇人妻在线视频| 蜜臀久久99精品久久久画质超高清 | 91伊人久久| 99在线免费观看视频| 亚洲+变态+欧美+另类+精品| 一区二区精品免费视频| 在线播放亚洲| 999在线观看| 99久久综合国产精品| 日韩欧美视频免费观看| 亚洲成a天堂v人片| 中文字幕在线一| 亚洲高清在线观看| 国产在线高清理伦片a| 热re99久久精品国产66热| 中文成人激情娱乐网| 欧美成人在线免费观看| 午夜精品久久久久99热蜜桃导演| 男女曰b免费视频| 国产1区2区3区精品美女| 精品一区二区6| 欧美日韩亚洲网| 国产福利小视频| 中文字幕久热精品在线视频 | 国产精品日韩在线一区| 国产主播性色av福利精品一区| 亚洲免费精品视频| 亚洲少妇在线| 亚欧美一区二区三区| 国产午夜精品一区二区三区嫩草| 国产性生活网站| 欧美一区二区三区色| аⅴ资源新版在线天堂| 日本精品久久电影| 久草精品视频| 国产免费xxx| 久久99精品国产麻豆不卡| 日本一区二区三区网站| 亚洲大尺度视频在线观看| 99精品在线视频观看| 精品国偷自产在线视频99| 精品裸体bbb| 日韩av电影免费在线| 国产情侣一区| 国产白袜脚足j棉袜在线观看| 亚洲精品综合在线| 国产精品久久久久久免费| 一区二区三欧美| 日韩成人亚洲| 日本最新一区二区三区视频观看| 国产精品久久久亚洲一区| 国产十八熟妇av成人一区| 亚洲黄色小说网站| 午夜精品久久久久久久91蜜桃| 久久视频中文字幕| 国产精品久久久久久久久久久久久久久| 视频一区视频二区视频三区视频四区国产 | 欧美一级xxxx| 中文字幕一区二区视频| 国产又黄又粗又长| 久久精品中文字幕| 国产精品1区| 国产激情片在线观看| 国产精品一区三区| 强乱中文字幕av一区乱码| 日韩欧美视频在线| 草莓视频丝瓜在线观看丝瓜18| 国产在线观看一区| 在线亚洲免费| 国产真实乱人偷精品人妻| 欧美在线免费视屏| 日本电影在线观看网站| 亚洲qvod图片区电影| 欧美午夜视频| jizz日本免费| 在线观看日韩电影| 麻豆网站在线| 成人片在线免费看| 亚洲综合欧美| 快灬快灬一下爽蜜桃在线观看| 欧美精品粉嫩高潮一区二区| 91小视频xxxx网站在线| 国产欧美日韩在线播放| 久久一区精品| 国产天堂av在线| 精品国产sm最大网站免费看| 天堂在线中文网官网| 日韩精品欧美在线| 精品亚洲porn| 五月天婷婷网站| 一区二区成人精品| 亚洲一区二区三区免费| 成人在线观看黄| 亚洲欧美日韩国产成人精品影院| 蜜桃视频久久一区免费观看入口| 国产成人中文字幕| 亚洲国产一区二区在线观看| av2014天堂网| 欧美日韩精品欧美日韩精品| 丝袜国产在线| 日韩亚洲视频在线| 国产精品夜夜嗨| 日韩国产成人在线| 欧美成人免费全部观看天天性色| 天天躁日日躁成人字幕aⅴ| 亚洲这里只有精品| 亚洲大片精品永久免费| 日韩黄色影院| 久久综合九色欧美狠狠| 精东粉嫩av免费一区二区三区| 国产无遮挡又黄又爽又色| 亚洲一区999| 国产毛片精品| 欧美成人手机在线视频| 一本一道久久a久久精品| 羞羞网站在线免费观看|