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

GreatSQL Hash Join 條件列長度對執行計劃的影響

數據庫 其他數據庫
調查生成 Join 的執行計劃代碼,發現在優化器執行JOIN::create_root_access_path_for_join的時候,有一個連接條件內部長度的判斷過程,這里用了一個固定長度1024作為內部長度的判斷,當超過這個長度的時候就要另外執行一次過濾器。

一、問題發現

在一次開發中發現當執行 Hash Join 用 VARCHAR 字段作為連接的時候,字段長度長短不同時候,執行計劃也不一樣。看下面3個例子。

1、連接條件字段長度為20的場景

greatsql> CREATE TABLE t1 (c1 INT, c2 varchar(20)) CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
greatsql> INSERT INTO t1 VALUES (1,'aa'),(2,'bb'),(35,'cc'),(5,'dd'),(null,'eeff');
greatsql> CREATE TABLE t3 (ccc1 INT, ccc2 varchar(20)) CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
greatsql> INSERT INTO t3 VALUES (1,'aa11bb'),(2,'dd1cc'),(3,'ee1dd'),(4,'dd2'),(null,'eeff');

兩張表執行 Hash Join 連接,用 VARCHAR 作為連接條件的結果:

greatsql> EXPLAIN format=tree SELECT * FROM t1 JOIN t3 ON t1.c2=t3.ccc2;
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| EXPLAIN                                                                                                                                                           |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| -> Innerhashjoin (t3.ccc2 = t1.c2)  (cost=3.50rows=5)
    -> Tablescanon t3  (cost=0.07rows=5)
    -> Hash
        -> Tablescanon t1  (cost=0.75rows=5)
 |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------+

2、連接條件字段長度為1000的場景

greatsql> CREATE TABLE t1 (c1 INT, c2 varchar(1000)) CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
greatsql> INSERT INTO t1 VALUES (1,'aa'),(2,'bb'),(35,'cc'),(5,'dd'),(null,'eeff');
greatsql> CREATE TABLE t3 (ccc1 INT, ccc2 varchar(1000)) CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
greatsql> INSERT INTO t3 VALUES (1,'aa11bb'),(2,'dd1cc'),(3,'ee1dd'),(4,'dd2'),(null,'eeff');

兩張表執行 Hash Join 連接,用 VARCHAR 作為連接條件的結果:

greatsql> EXPLAIN format=tree SELECT * FROM t1 JOIN t3 ON t1.c2=t3.ccc2;
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| EXPLAIN                                                                                                                                                                                                                                          |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| -> Filter: (t3.ccc2 = t1.c2)  (cost=3.52rows=5) 這里另外需要一次過濾比較
    -> Innerhashjoin (<hash>(t3.ccc2)=<hash>(t1.c2))  (cost=3.52rows=5)
        -> Tablescanon t3  (cost=0.07rows=5)
        -> Hash
            -> Tablescanon t1  (cost=0.75rows=5)
 |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

3、連接條件字段類型為 BLOB 的場景

greatsql> CREATE TABLE t11 (c1 INT, c2 blob) CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
greatsql> INSERT INTO t11 VALUES (1,'aa'),(2,'bb'),(35,'cc'),(5,'dd'),(null,'eeff');
greatsql> CREATE TABLE t13 (ccc1 INT, ccc2 blob) CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
greatsql> INSERT INTO t13 VALUES (1,'aa11bb'),(2,'dd1cc'),(3,'ee1dd'),(4,'dd2'),(null,'eeff');

兩張表執行 Hash Join 連接,用 BLOB 作為連接條件的結果:

greatsql> EXPLAIN format=tree SELECT * FROM t11 JOIN t3 ON t11.c2=t13.ccc2;
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| EXPLAIN                                                                                                                                                                                                                                                |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| -> Filter: (t13.ccc2 = t11.c2)  (cost=3.52rows=5) 這里另外需要一次過濾比較
    -> Innerhashjoin (<hash>(t13.ccc2)=<hash>(t11.c2))  (cost=3.52rows=5)
        -> Tablescanon t13  (cost=0.07rows=5)
        -> Hash
            -> Tablescanon t11  (cost=0.75rows=5)
 |
+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

通過以上三個例子發現,當連接字段超過一定長度的時候,執行計劃會在 Hash Join 外面再套一層 FilterIterator 另外進行一次過濾比較。

二、問題調查過程

調查生成 Join 的執行計劃代碼,發現在優化器執行JOIN::create_root_access_path_for_join的時候,有一個連接條件內部長度的判斷過程,這里用了一個固定長度1024作為內部長度的判斷,當超過這個長度的時候就要另外執行一次過濾器。

// 調查代碼發現跟下面代碼的長度判斷有關,如果計算出來的內部長度超過1024最后還是要執行FilterIterator
HashJoinCondition::HashJoinCondition(Item_eq_base *join_condition,
                                     MEM_ROOT *mem_root) {
  m_store_full_sort_key = true;

constbool using_secondary_storage_engine =
      (current_thd->lex->m_sql_cmd != nullptr &&
       current_thd->lex->m_sql_cmd->using_secondary_storage_engine());
if ((join_condition->compare_type() == STRING_RESULT ||
       join_condition->compare_type() == ROW_RESULT) &&
      !using_secondary_storage_engine) {
    const CHARSET_INFO *cs = join_condition->compare_collation();
    // 這里的1024是開發者隨意寫的,但是決定了最后要不要在join外面再執行一次過濾,計算公式見下面三的表格
    if (cs->coll->strnxfrmlen(cs, cs->mbmaxlen * m_max_character_length) > 1024) { 
      m_store_full_sort_key = false;
    }
  }
}

static AccessPath *CreateHashJoinAccessPath() {
// 下面這段跟連接條件的長度計算有關,如果超過1024長度會向hash_join_extra_conditions隊列插入condition,從而最后走過濾器
for (const HashJoinCondition &cond : hash_join_conditions) {
    if (!cond.store_full_sort_key()) {
      hash_join_extra_conditions.push_back(cond.join_condition());
    }
  }
}

對比前兩個場景的執行計劃:

字段長度

AccessPath

參數

說明

20

HashJoinIterator

m_build_input=TableScanIterator (t3表) m_probe_input=TableScanIterator (t1表) />m_row_buffer.m_join_conditions=Item_func_eq

HashJoinIterator內部創建一張hash表,hash表掃描第二張表的時候通過m_row_buffer.m_join_conditions進行數據過濾

1000

FilterIterator

m_source=HashJoinIterator m_condition=Item_func_like

HashJoinIterator外面套一層filter,用m_condition再執行一次過濾

之所以做這個限制,具體原因可以看一下m_store_full_sort_key這個參數的注釋,這個解釋了為什么要加一個新的過濾。

下面的注釋翻譯如下,這個解釋已經很清楚了:


通常,我們將條件的full sort key作為鍵存儲在哈希表中。但是,如果字符串很長,或者我們有一個 PAD SPACE 排序規則,則可能導致排序鍵很大。如果我們檢測到這種情況可能發生在最壞的情況下,我們只會在鍵中存儲哈希值(因此我們對哈希值進行哈希處理)。如果是這樣,我們必須事后重新檢查,以防范哈希沖突。

// Normally, we store the full sort key for the condition as key in the hash
  // table. However, if the string is very long, or we have a PAD SPACE
  // collation, this could result in huge sort keys. If we detect that this
  // could happen in the worst case, we store just a hash in the key instead (so
  // we hash the hash). If so, we have to do a recheck afterwards, in order to
  // guard against hash collisions.
  bool m_store_full_sort_key;

繼續看生成 key 的代碼可以發現,如果是長度超過1024的字段,會通過append_hash_for_string_value先把超長 key 轉為 hash 值,所以才有上面解釋里面的儲存 hash 值的 hash 值的說法。

static bool extract_value_for_hash_join() {
switch (comparator->get_compare_type()) {
    case STRING_RESULT: {
      if (join_condition.store_full_sort_key()) { 這里代表長度沒有超過1024
        return append_string_value(
            comparand, comparator->cmp_collation.collation,
            join_condition.max_character_length(),
            (thd->variables.sql_mode & MODE_PAD_CHAR_TO_FULL_LENGTH) > 0,
            is_multi_column_key, join_key_buffer);
      } else { 這里代表長度超過1024
        return append_hash_for_string_value(
            comparand, comparator->cmp_collation.collation, join_key_buffer);
      }
    }
}

三、相關計算公式

判斷公式:
cs->coll->strnxfrmlen(cs, cs->mbmaxlen * m_max_character_length) > 1024
其中cs為字符集,cs->mbmaxlen為字符集的最大長度,m_max_character_length為字段長度
以上公式為真的話就在hashjoin外面另外套一層過濾器FilterIterator。

部分字符集和 Hash Join 內部長度的計算公式表:

字符集

計算公式

說明

utf8mb4

((len + 3) / 4) * 2

其中4為字符集的最長長度

utf8mb3

((len + 2) / 3) * 2

其中3為字符集的最長長度

unicode_full_bin

((len + 3) / cs->mbmaxlen) * 3

cs->mbmaxlen為字符集的最長長度


注:表里的len=cs->mbmaxlen * m_max_character_length,其中cs為字符集,cs->mbmaxlen為字符集的最大長度,m_max_character_length為字段長度

這里我們舉一個例子計算一下:

假設有一個字段是c2 varchar(300),字符集是my_charset_utf8mb4_0900_ai_ci,找到utf8mb4_0900相關的計算函數如下:
static size_t my_strnxfrmlen_uca_900(const CHARSET_INFO *cs, size_t len) {
constsize_t num_codepoints = (len + 3) / 4;
constsize_t max_num_weights_per_level = num_codepoints * 8;
size_t max_num_weights = max_num_weights_per_level * cs->levels_for_compare;
if (cs->coll_param && cs->coll_param->reorder_param) {
    max_num_weights += max_num_weights_per_level;
  }
return (max_num_weights + (cs->levels_for_compare - 1)) * sizeof(uint16_t);
}

因此strnxfrmlen的計算公式就是:
num_codepoints = (300 * 4 + 3 ) / 4 = 300;
max_num_weights_per_level = num_codepoints * 8 = 2400
max_num_weights = max_num_weights_per_level * cs->levels_for_compare = 2400 * 1 = 2400
strnxfrmlen = (max_num_weights + (cs->levels_for_compare - 1)) * sizeof(uint16_t) = (2400 + 1-1 )) * 2= 4800
最后由于4800大于1024,因此執行計劃需要在hashjoin外面另外套一層過濾器FilterIterator。
從上面的計算過程可以看出,如果不想套一層過濾器,那么varchar長度最大只能設置為64.

四、問題總結

通過以上分析我們可以發現,執行 Hash Join 的時候,連接條件的字段字符集和長度不一樣的時候,最后的執行計劃結果也不一樣。究其原因是因為如果字段過長,hash 表只儲存 key 的 hash 值,這樣必須事后重新檢查,以防范哈希沖突。所以如果連接字段過長(比如 my_charset_utf8mb4_0900_ai_ci 字符集的情況下,varchar長度超過64),會比短字段(比如小于64長度)消耗更多資源和內存用來做查詢,因此在實際使用中,應該避免使用過長的字段進行 Hash Join 連接。

責任編輯:武曉燕 來源: GreatSQL社區
相關推薦

2022-12-29 08:22:32

JOINCPU系統

2017-09-22 11:01:00

Oracle數據庫中直方圖

2011-09-14 17:03:17

數據庫執行計劃解析

2015-04-22 14:17:45

SQL SERVERMSSQL SERVE緩沖區

2021-03-17 09:35:51

MySQL數據庫explain

2023-09-21 10:55:51

MysqlSQL語句

2021-05-28 10:46:36

MySQL執行計劃

2020-09-15 08:44:57

MySQL慢日志SQL

2009-11-10 16:00:05

Oracle執行計劃

2010-04-16 09:27:18

Ocacle執行計劃

2022-08-15 15:09:26

SQL數據庫MySQL

2022-08-08 08:03:44

MySQL數據庫CBO

2009-11-13 16:28:02

Oracle生成執行計

2024-09-12 15:16:14

2010-08-18 10:52:36

DB2執行計劃顯示工具

2022-02-15 07:36:21

SQLEXPLAIN數據庫

2021-02-20 08:40:19

HiveExplain底層

2009-11-18 17:05:47

捕獲Oracle SQ

2021-04-24 12:01:08

MySQL數據庫Mysql執行計劃

2021-09-07 10:43:25

EverDB分布式執行
點贊
收藏

51CTO技術棧公眾號

亚洲手机成人高清视频| 亚洲欧美成人| 日韩欧美在线一区二区三区| 天堂精品一区二区三区| 中文字幕av无码一区二区三区| 亚洲+变态+欧美+另类+精品| 日本大香伊一区二区三区| 先锋影音亚洲资源| 精品国产av一区二区三区| 精品1区2区3区4区| 亚洲区免费影片| 亚洲男人天堂av在线| 91国内在线| av一本久道久久综合久久鬼色| 88国产精品欧美一区二区三区| 国产高清自拍视频| 欧美日韩伦理一区二区| 一区二区三区精密机械公司| 久久久久久久久久久久久久久久av | 欧美一级久久| 社区色欧美激情 | 9191在线视频| 波多野结衣亚洲一二三| 国产精品国产成人国产三级 | 麻豆映画在线观看| 欧洲天堂在线观看| 国产一区二区三区四| 欧美激情国产精品| 永久免费毛片在线观看| 999久久久精品一区二区| 欧洲一区二区av| 日韩精品在线视频免费观看| 狠狠狠综合7777久夜色撩人| 国产精品一级二级三级| 国产精品扒开腿做| 国产一级二级三级| 日韩国产专区| 日韩av最新在线观看| 手机版av在线| 一区二区三区电影大全| 亚洲欧美日韩综合aⅴ视频| 成人片在线免费看| 这里只有精品免费视频| 亚洲日本成人| 欧美大胆a视频| 青青草自拍偷拍| 私拍精品福利视频在线一区| 欧美一区二区三区不卡| 黄色一级二级三级| 97蜜桃久久| 亚洲女同ⅹxx女同tv| 清纯唯美一区二区三区| 天堂在线免费av| 精品亚洲aⅴ乱码一区二区三区| 欧美制服第一页| 国产真实夫妇交换视频| 中文av一区| 色黄久久久久久| 蜜臀av一区二区三区有限公司| 97久久综合区小说区图片区 | 日本精品一区在线观看| 超碰97免费在线| 亚洲精品免费在线观看| 手机成人av在线| 精品av中文字幕在线毛片| 成人免费视频视频| 亚洲在线免费观看| 国产精品一区二区黑人巨大| 久久电影网站中文字幕| 国产精品免费在线免费| 黄色av网站免费| 狂野欧美一区| 日本高清视频一区| 区一区二在线观看| 久久最新视频| 国产精品欧美日韩一区二区| 欧美男人亚洲天堂| 日韩av中文字幕一区二区三区| 国产91精品久| 欧美a视频在线观看| 日韩精品一卡二卡三卡四卡无卡| 日本国产高清不卡| 中文字幕一区2区3区| 久久精品国产一区二区三 | 成人精品亚洲人成在线| 99视频网站| 欧美一区二区三区黄片| 播五月开心婷婷综合| 国产精品日韩一区二区| 天天干天天操av| 久久久久久久久久久久久女国产乱| 国产精品日本一区二区 | 麻豆成人在线观看| 91美女片黄在线观看游戏| 国产日韩欧美视频在线观看| 国产成人综合自拍| 久久99九九| 91社区在线| 一区二区三区四区在线免费观看 | 国产视频手机在线观看| 成人免费毛片aaaaa**| 欧洲国产精品| 国产高清一区二区三区视频| 亚洲一卡二卡三卡四卡无卡久久| 黑人糟蹋人妻hd中文字幕| 成人国产一区| 日韩欧美在线影院| 欧美黑人欧美精品刺激| 久久五月天小说| 欧美激情欧美激情在线五月| 国产在线观看成人| 日韩成人一级片| 91久久精品www人人做人人爽| 狠狠躁日日躁夜夜躁av| 国产午夜精品福利| 草草草视频在线观看| 日韩欧美精品一区二区三区| 欧美日韩免费观看一区三区| 国产香蕉精品视频| 成人精品久久| 98精品在线视频| 一级黄色小视频| k8久久久一区二区三区 | 亚洲人午夜射精精品日韩| 国产蜜臀97一区二区三区| 久久男人资源站| 51一区二区三区| 亚洲国产又黄又爽女人高潮的| 国产精品久久久久久久av| 亚洲区欧美区| 亚洲aaa激情| 性xxxx视频| 夜夜夜精品看看| 男人的天堂日韩| 猫咪成人在线观看| 欧美另类老女人| 中文字幕永久在线视频| 99视频一区二区| 久久777国产线看观看精品| av资源免费观看| 成人免费毛片片v| 水蜜桃色314在线观看| 日韩一区网站| 久久91亚洲精品中文字幕| 97超视频在线观看| 亚洲天堂福利av| 亚洲欧美一区二区三区不卡| 图片小说视频色综合| 91精品视频大全| 在线观看a级片| 精品精品欲导航| 国产亚洲第一页| 成人激情午夜影院| 久久精品国产sm调教网站演员| 成人在线视频你懂的| 久久久久久久久网站| 欧美一级在线免费观看| 欧美日韩亚洲国产一区| 在线观看福利片| 日本视频中文字幕一区二区三区| 日韩在线电影一区| 亚洲欧美在线人成swag| 欧美片一区二区三区| 日本久久一级片| 黑人精品xxx一区| 色噜噜日韩精品欧美一区二区| 日本最新不卡在线| 亚洲免费av网| 国产伦精品一区二区三区在线播放| 久久青草精品视频免费观看| 欧洲一级在线观看| 欧美裸体bbwbbwbbw| 麻豆91精品91久久久| jlzzjlzz国产精品久久| 久久久久久久久久久久91| 中国精品18videos性欧美| 国产一区二区视频在线免费观看| 超碰一区二区| 久久久91精品国产| 天天爽夜夜爽夜夜爽| 欧美影院一区二区三区| 2025国产精品自拍| 不卡av在线网| 日本一二区免费| 一区在线视频观看| 亚洲国产精品视频一区| 日本在线成人| 国产精品99导航| av片哪里在线观看| 亚洲欧美成人一区二区在线电影| 在线免费看av片| 亚洲成人av在线电影| 欧美日韩国产黄色| caoporn国产一区二区| 不卡的在线视频| 国产精品久久久久9999高清| 吴梦梦av在线| 蜜桃一区二区三区| 91丝袜脚交足在线播放| 国产高清不卡| 九九精品在线观看| wwwww在线观看免费视频| 亚洲成人a级网| 97精品人妻一区二区三区| 欧美日韩在线第一页| 九九九在线视频| 国产精品情趣视频| 30一40一50老女人毛片| 国产精品亚洲午夜一区二区三区 | 久久99久久98精品免观看软件| 久久亚洲一级片| 久久久久亚洲AV成人网人人小说| 美女网站色91| 亚洲精品乱码久久久久久自慰| 欧美日韩1080p| 一区二区在线不卡| 免费看成人吃奶视频在线| 国产乱码精品一区二区三区卡| 欧美黄页免费| 国产精品成久久久久三级| 国产直播在线| 国内外成人免费激情在线视频| 黄色动漫在线| 色黄久久久久久| av网页在线| 亚洲精品不卡在线| www.精品久久| 欧美一区二区三区四区视频| 在线播放成人av| 精品视频在线免费| 国产美女www爽爽爽| 91精品办公室少妇高潮对白| 黄色大片网站在线观看| 亚洲成人自拍一区| 久久免费小视频| 一区二区三区欧美视频| 精品欧美一区二区久久久久| 国产精品国产三级国产三级人妇| 成人激情五月天| 国产日韩精品一区二区浪潮av| 四虎永久免费影院| 91麻豆国产精品久久| 亚洲一区二区三区四区五区六区| av亚洲精华国产精华精| 黄色性视频网站| 99热精品一区二区| 久久一区二区电影| 26uuu亚洲| 亚洲久久久久久久| 欧美—级在线免费片| 懂色av粉嫩av浪潮av| 综合在线观看色| 久久久久久免费观看| 亚洲成人av一区二区| 国产三级精品三级在线观看| 色诱视频网站一区| 国产在线一级片| 欧美浪妇xxxx高跟鞋交| 国产超碰人人模人人爽人人添| 911精品产国品一二三产区| www.99视频| 亚洲激情久久久| 免费福利在线观看| 色多多国产成人永久免费网站 | 尤物av一区二区| 日本免费在线播放| 色综合天天天天做夜夜夜夜做| 一级片在线观看免费| 欧美性淫爽ww久久久久无| 国产女人18毛片水真多| 亚洲精品720p| 在线免费av网站| 久久久欧美精品| 粉嫩一区二区| 成人欧美在线视频| 国产精品久av福利在线观看| 欧美精品久久久| 国产精品久久久久久久久久10秀| 欧美在线观看黄| 免费久久99精品国产自在现线| 三级a三级三级三级a十八发禁止| 国产精品香蕉一区二区三区| free性中国hd国语露脸| 亚洲欧洲在线观看av| 中文字幕精品三级久久久 | 国产精品极品美女粉嫩高清在线| 高清精品久久| 蜜桃成人免费视频| 一区二区三区四区在线观看国产日韩| 欧美一级片免费播放| 蜜桃av一区二区三区| av av在线| 国产精品乱人伦中文| 亚洲 欧美 日韩 综合| 欧美精品日韩一本| 免费在线超碰| 欧美激情xxxxx| 在线免费成人| 美女主播视频一区| 国内精品99| 国产一伦一伦一伦| 久久久综合视频| 黄色一级视频在线观看| 在线观看网站黄不卡| 韩国av免费在线| 色婷婷综合成人| 欧洲亚洲两性| 国产尤物91| 欧美日韩国产色综合一二三四| 嫩草影院国产精品| 久久久精品综合| 国产无码精品在线播放| 欧美一区二区二区| 日本最新在线视频| 欧美综合第一页| 国产精品乱战久久久| 黄色一级片国产| 国内精品视频一区二区三区八戒| 日韩一区二区a片免费观看| 亚洲电影一级黄| www.黄色小说.com| 欧美成人精品三级在线观看| 日本美女久久| 四虎影院一区二区三区| 久久精品一区| 人妻大战黑人白浆狂泄| 亚洲成人动漫av| 囯产精品久久久久久| 欧美大胆在线视频| 精品国产鲁一鲁****| 在线观看免费91| 久久精品国产一区二区三 | 亚洲国产中文字幕在线视频综合| aaa国产视频| 久久综合伊人77777尤物| 伊人国产精品| 欧美另类videos| 国产高清精品久久久久| 国产这里有精品| 日韩女优毛片在线| 青青青草视频在线| 国产精品播放| 在线综合视频| 在线观看福利片| 欧美性感一类影片在线播放| 成在在线免费视频| 国产日韩精品综合网站| 999国产精品视频| 黄色三级视频在线播放| 亚洲中国最大av网站| 日本久久一级片| 日韩暖暖在线视频| 日韩精品永久网址| 日韩在线一区视频| 亚洲一区自拍偷拍| 亚洲 欧美 精品| 日本一区二区不卡| 精品一区二区三| 天堂av2020| 亚洲最快最全在线视频| 五月婷中文字幕| 国产精品久久久久久婷婷天堂| 视频在线不卡免费观看| 色哟哟在线观看视频| 亚洲成av人影院在线观看网| 日韩电影免费| 国产精选久久久久久| 中文在线日韩| 欧美双性人妖o0| 欧洲视频一区二区| 天堂8中文在线| 开心色怡人综合网站| 免费精品视频在线| 国产一二三四在线| 国产亚洲一区精品| 日韩精品成人| 超碰97人人射妻| 最新久久zyz资源站| 日日夜夜精品免费| 国产精品亚洲欧美导航| 国产一区二区三区四区三区四| 色无极影院亚洲| 欧美成人艳星乳罩| 粉嫩一区二区三区| 400部精品国偷自产在线观看| 99精品视频在线观看免费| 亚洲天堂777| 欧美综合激情网| 欧美区亚洲区| www.99热| 亚洲精品videossex少妇| 日韩精品一页| 激情五月开心婷婷| 亚洲国产一区二区视频| 调教视频免费在线观看| 精品国产日本| 国产精品影音先锋| 国产精品51麻豆cm传媒 | 欧美 国产 精品| 久久精品亚洲精品国产欧美|