黄a在线观看-黄a在线-黄a大片-黄色片在线看-黄色毛片免费-黄色大片网站

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

Apache Doris Join 優化原理詳解

瀏覽:436日期:2023-03-07 14:40:44
目錄
  • 背景 & 目標
  • Doris 數據劃分
    • Partition
    • Bucket
  • Join 方式
    • 總覽
    • Broadcast / Shuffle Join
    • Bucket Shuffle Join
      • Plan Rule
    • Colocate Join
    • Runtime Filter 優化
      • Join Reorder 優化
        • Join 調優建議

          背景 & 目標

          • 掌握 Apache Doris Join 優化手段及其實現原理
          • 為代碼閱讀提供理論基礎

          Doris 數據劃分

          不同的 Join 方式非常依賴于對 Doris 中數據劃分方式的透徹理解。因此先在這里列舉出必要的基礎知識。

          首先,在 Doris 中數據都以表(Table)的形式進行邏輯上的描述。

          在 Doris 的存儲引擎中,用戶數據被水平劃分為若干個數據分片(Tablet,也稱作數據分桶 Bucket)。每個 Tablet 包含若干數據行。各個 Tablet 之間的數據沒有交集,并且在物理上是獨立存儲的。

          一個 Tablet 只屬于一個數據分區(Partition)。而一個 Partition 包含若干個 Tablet。因為 Tablet 在物理上是獨立存儲的,所以可以視為 Partition 在物理上也是獨立的。Tablet 是數據移動、復制等操作的最小物理存儲單元。

          若干個 Partition 組成一個 Table。Partition 可以視為是邏輯上最小的管理單元。數據的導入與刪除,僅能針對一個 Partition 進行。

          Doris 支持兩層的數據劃分。第一層是 Partition,支持 Range 和 List 的劃分方式。第二層是 Bucket(Tablet),僅支持 Hash 的劃分方式。也可以僅使用一層分區。使用一層分區時,只支持 Bucket 劃分。

          下圖說明 Table、Partition、Bucket(Tablet) 的關系:

          • Table 按照 Range 的方式按照 date 字段進行分區,得到了 N 個 Partition
          • 每個 Partition 通過相同的 Hash 方式將其中的數據劃分為 M 個 Bucket(Tablet)
          • 從邏輯上來說,Bucket 1 可以包含 N 個 Partition 中劃分得到的數據,比如下圖中的 Tablet 11、Tablet 21、Tablet N1

          特別注意:

          Doris 中的 Partition 和 Bucket 定義可能和某些其它數據庫系統的定義有一些差異,下面配以一個具體的建表語句為例來說明:

          CREATE TABLE IF NOT EXISTS example_db.expamle_range_tbl(    `user_id` LARGEINT NOT NULL COMMENT "用戶id",    `date` DATE NOT NULL COMMENT "數據灌入日期時間",    `timestamp` DATETIME NOT NULL COMMENT "數據灌入的時間戳",    `city` VARCHAR(20) COMMENT "用戶所在城市",    `age` SMALLINT COMMENT "用戶年齡",    `sex` TINYINT COMMENT "用戶性別",    `last_visit_date` DATETIME REPLACE DEFAULT "1970-01-01 00:00:00" COMMENT "用戶最后一次訪問時間",    `cost` BIGINT SUM DEFAULT "0" COMMENT "用戶總消費",    `max_dwell_time` INT MAX DEFAULT "0" COMMENT "用戶最大停留時間",    `min_dwell_time` INT MIN DEFAULT "99999" COMMENT "用戶最小停留時間")ENGINE=OLAPAGGREGATE KEY(`user_id`, `date`, `timestamp`, `city`, `age`, `sex`)PARTITION BY RANGE(`date`)(    PARTITION `p201701` VALUES LESS THAN ("2017-02-01"),    PARTITION `p201702` VALUES LESS THAN ("2017-03-01"),    PARTITION `p201703` VALUES LESS THAN ("2017-04-01"))DISTRIBUTED BY HASH(`user_id`) BUCKETS 16PROPERTIES(    "replication_num" = "3");

          綠色高亮:Partition,此例中使用一個 date 字段進行分區

          藍色高亮:Bucket,此例中使用 user_id 字段為作為分布列

          Partition

          • Partition 列可以指定一列或多列,分區列必須為 KEY 列
          • 分區數量理論上沒有上限
          • 當不使用 Partition 建表時,系統會自動生成一個和表名同名的,全值范圍的 Partition。該 Partition 對用戶不可見,并且不可刪改

          創建分區時不可添加范圍重疊的分區

          有兩種分區方式:

          分區方式一般用法Range通常按時間分區,以方便地管理新舊數據List支持的類型更豐富,分區值為枚舉值。只有當數據為目標分區枚舉值其中之一時,才可以命中分區

          Bucket

          • 如果使用了 Partition,則 DISTRIBUTED 語句描述的是數據在各個分區內的劃分規則。如果不使用 Partition,則描述的是對整個表的數據劃分規則
          • 分桶列的選擇,是在 查詢吞吐 和 查詢并發 之間的一種權衡:
          • 如果選擇多個分桶列,則數據分布更均勻。如果一個查詢條件不包含所有分桶列的等值條件(意味著無法做桶裁剪以減少數據查詢范圍),那么該查詢會觸發所有分桶同時掃描,這樣查詢的吞吐會增加,單個查詢的延遲隨之降低。這個方式適合大吞吐低并發的查詢場景
          • 如果僅選擇一個或少數分桶列,則對應的點查詢可以僅觸發一個分桶掃描(意味著可以做桶裁剪以減少數據查詢范圍)。此時,當多個點查詢并發時,這些查詢有較大的概率分別觸發不同的分桶掃描,各個查詢之間的 IO 影響較小,尤其當不同桶分布在不同磁盤上時),所以這種方式適合高并發的點查詢場景
          • 分桶的數量理論上沒有上限

          Join 方式

          總覽

          作為分布式的 MPP 數據庫, 在 Join 的過程中是需要進行數據的 Shuffle。數據需要進行拆分調度,才能保證最終的 Join 結果是正確的。舉個簡單的例子,假設關系 S 和 R 進行Join,N 表示參與 Join 計算的節點的數量;T 則表示關系的 Tuple 數目。

          目前 Doris 支持的 Join 方式有以上 4 種,這 4 種方式靈活度和適用性是從高到低的,對數據分布的要求越來越嚴,但 Join 計算的性能則通過降低網絡開銷而越來越好。

          Join 方式的選擇是 FE 生成分布式計劃階段會考慮的事項之一。在 FE 進行分布式計劃時,優先選擇的順序為(總是會優先選擇預期性能最好的):Colocate Join -> Bucket Shuffle Join -> Broadcast Join -> Shuffle Join。

          Colocate 以及 Bucket Shuffle 是可遇不可求的。當無法使用它們時,Doris會自動嘗試進行 Broadcast Join,如果預估小表過大則會自動切換至 Shuffle Join。

          但是用戶可以通過顯式 Hint 來強制使用期望的 Join 類型,比如:

          select * from test join [shuffle] baseall on test.k1 = baseall.k1;

          Broadcast / Shuffle Join

          原理比較簡單,這里不展開。

          Bucket Shuffle Join

          當 Join 條件命中了左表的數據分布列時,Broadcast 以及 Shuffle Join 會有非必要的網絡傳輸開銷。而 Bucket Shuffle Join 旨在解決這類問題,通過對左表實現本地性計算優化,來減少左表數據在節點間的傳輸耗時,從而加速查詢。

          以上的例子中,Join 的等值表達式命中了表 A(左表)的數據分布列。Bucket Shuffle Join 會根據表 A 的數據分布信息,將表 B(右表)的數據發送到對應表 A 的數據計算節點。

          定性分析上:

          • 降低了網絡與內存開銷(相比 Broadcast 以及 Shuffle Join 都不會更差),使一類 Join 查詢有更好的性能。尤其是當 FE 能夠執行左表的分區裁剪與桶裁剪時
          • 與 Colocate Join 不同,它對于表的數據分布方式沒有侵入性,對于用戶來說是透明的。對于表的數據分布沒有強制性的要求(體現在建表語句中不需要顯式地設置 colocate_with 屬性),不容易導致數據傾斜的問題
          • 可以為 Join Reorder 提供更多可能的優化空間

          Plan Rule

          • Bucket Shuffle Join 只生效于 Join 條件為等值的場景,原因與 Colocate Join 類似,它們都依賴 Hash 來計算確定的數據分布
          • 在等值 Join 條件之中包含兩張表的分桶列,當左表的分桶列為等值的 Join 條件時,它有很大概率會被規劃為 Bucket Shuffle Join
          • 由于不同的數據類型的 Hash 值計算結果不同,所以 Bucket Shuffle Join 要求左表的分桶列的類型與右表等值 Join 列的類型需要保持一致,否則無法進行對應的規劃
          • Bucket Shuffle Join 只作用于 Doris 原生的 OLAP 表,對于 ODBC,MySQL,ES 等外表,當其作為左表時是無法規劃生效的
          • 對于分區表,由于每一個分區的數據分布規則可能不同,所以 Bucket Shuffle Join 只能保證左表為單分區時生效。所以在 SQL 執行之中,需要盡量使用 where 條件使分區裁剪的策略能夠生效
          • 假如左表為 Colocate 的表,那么它每個分區的數據分布規則是確定的,Bucket Shuffle Join 能在Colocate 表上表現更好

          Colocate Join

          可以理解為在數據分布滿足一定條件的前提下,減少一切不必要的網絡傳輸開銷,實現完全的計算本地化來加速查詢。同時因為沒有網絡傳輸開銷,BE 節點可以擁有更高的并發度,從而進一步提升 Join 性能。

          要理解這個算法,需要先了解兩個術語:

          • Colocation Group(CG):一個 CG 中會包含一張及以上的 Table。在同一個 Group 內的 Table 有著相同的 Colocation Group Schema,并且有著相同的數據分片分布
          • Colocation Group Schema(CGS):用于描述一個 CG 中的 Table,和 Colocation 相關的通用 Schema 信息。包括分桶列類型,分桶數以及副本數等

          和 Buckets Sequence 這一概念:

          一個表的數據,最終會根據分桶列值 Hash、對桶數取模后落在某一個分桶內。假設一個 Table 的分桶數為 8,則共有 [0, 1, 2, 3, 4, 5, 6, 7] 8 個分桶(Bucket),我們稱這樣一個序列為一個 BucketsSequence。每個 Bucket 內會有一個或多個數據分片(Tablet)。當表為單分區表時,一個 Bucket 內僅有一個 Tablet。如果是多分區表,則會有多個(因為多個 Partition 中的不同 Tablet 會被劃分到相同的 Bucket)。

          Colocation Join 功能,是將一組擁有相同 CGS 的 Table 組成一個 CG。并保證這些 Table 對應的數據分片會落在同一個 BE 節點上。使得當 CG 內的表進行分桶列上的 Join 操作時,可以通過直接進行本地數據 Join,減少數據在節點間的傳輸耗時。

          因此關鍵問題就轉變為了「如何保證這些 Table 對應的數據分片會落在同一個 BE 節點上?」

          通過同一 CG 內的 Table 必須保證以下屬性相同實現:

          • 分桶列和分桶數

          分桶列,即在建表語句中 DISTRIBUTED BY HASH(col1, col2, ...) 中指定的列。分桶列決定了一張表的數據通過哪些列的值進行 Hash 劃分到不同的 Tablet 中。同一 CG 內的 Table 必須保證分桶列的類型和數量完全一致,并且桶數一致,才能保證多張表的數據分片能夠一一對應的進行分布控制。

          • 副本數

          同一個 CG 內所有表的所有分區(Partition)的副本數必須一致。如果不一致,可能出現某一個 Tablet 的某一個副本,在同一個 BE 上沒有其他的表分片的副本對應。不過,同一個 CG 內的表,分區的個數、范圍以及分區列的類型不要求一致。

          在固定了分桶列和分桶數后,同一個 CG 內的表會擁有相同的 BucketsSequence。而副本數決定了每個分桶內的 Tablet 的多個副本,存放在哪些 BE 上。假設 BucketsSequence 為 [0, 1, 2, 3, 4, 5, 6, 7],BE 節點有 [A, B, C, D] 4個。則一個可能的數據分布如下:

          +---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+| 0 | | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | | 7 |+---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+| A | | B | | C | | D | | A | | B | | C | | D ||   | |   | |   | |   | |   | |   | |   | |   || B | | C | | D | | A | | B | | C | | D | | A ||   | |   | |   | |   | |   | |   | |   | |   || C | | D | | A | | B | | C | | D | | A | | B |+---+ +---+ +---+ +---+ +---+ +---+ +---+ +---+

          CG 內所有表的數據都會按照上面的規則進行統一分布,這樣就保證了,分桶列值相同的數據都在同一個 BE 節點上,可以進行本地數據 Join。其核心思想是「兩次映射」,保證相同的 Distributed Key 的數據會被映射到相同的 Bucket Sequence,再保證 Bucket Sequence 對應的 Bucket 映射到相同的 BE 節點:

          通過查詢計劃可以檢查一個查詢是否使用了 Colocate Join,同時計劃中的 Exchange Node 也被去掉了,會將 ScanNode 直接設置為 Hash Join Node 的孩子節點。

          DESC SELECT * FROM tbl1 INNER JOIN tbl2 ON (tbl1.k2 = tbl2.k2);-- 在 Hash Join 節點會顯示:-- colocate: true/false

          Colocate Join 十分適合幾張表按照相同字段分桶,并高頻根據固定的字段 Join 的場景。這樣可以將數據預先存儲到相同的分桶中,實現本地計算。

          Runtime Filter 優化

          Doris 在進行 Hash Join 計算時會在右表構建一個 Hash Table,左表流式地通過右表的 Hash Table 從而得出 Join 結果。而 Runtime Filter 就是充分利用了右表的 Hash Table 構建階段去做一些額外的事情。

          在右表生成 Hash Table 的時,同時生成一個基于 Hash Table 數據的一個過濾條件,然后下推到左表的數據掃描節點。通過這樣的方式,Doris 可以在運行時進行數據過濾。

          假如左表是一張大表,右表是一張小表,那么利用下推到左表的過濾條件就可以把絕大多數 Join 層要過濾的數據在數據讀取時就提前過濾(如果能夠下推到引擎層,還能夠利用 Doris 針對 Key 列過濾的延遲物化),從而大幅度地提升 Join 查詢的性能。

          Runtime Filter 在查詢規劃時生成,在 HashJoinNode 中構建,在 ScanNode 中應用。比如 T1(行數 10w) 和 T2(行數 2k) 的 Join 操作:

          |  >      HashJoinNode     <| | || | 100000  | 2000| | ||   OlapScanNode      OlapScanNode| ^ ^   | | 100000  | 2000|T1T2|

          顯而易見對 T2 掃描數據要遠遠快于 T1,如果我們主動等待一段時間再掃描 T1,等 T2 將掃描的數據記錄交給 HashJoinNode 后,HashJoinNode 根據 T2 的數據計算出一個過濾條件,比如 T2 數據的最大和最小值,或者構建一個 Bloom Filter,接著將這個過濾條件發給等待掃描 T1 的 ScanNode,后者應用這個過濾條件,將過濾后的數據交給 HashJoinNode,從而減少 probe hash table 的次數和網絡開銷,這個過濾條件就是 Runtime Filter,效果如下:

          |  >      HashJoinNode     <| | || | 6000    | 2000| | ||   OlapScanNode      OlapScanNode| ^ ^   | | 100000  | 2000|T1T2|

          如果能將過濾條件(Runtime Filter)下推到存儲引擎,則某些情況可以利用索引(比如 Join 列為 Key 列,可以利用延遲物化能力)來直接減少掃描的數據量,從而大大減少掃描耗時,效果如下:

          |  >      HashJoinNode     <| | || | 6000    | 2000| | ||   OlapScanNode      OlapScanNode| ^ ^   | | 6000    | 2000|T1T2|

          可見,和謂詞下推、分區裁剪不同,Runtime Filter 是在運行時動態生成的過濾條件,即在查詢運行時解析 Join 條件確定過濾表達式,并將表達式下推給正在讀取左表的 ScanNode,從而減少掃描的數據量,進而減少 probe hash table 的次數,避免不必要的 IO 和網絡傳輸。因為其運行時生效的特性,官方認為它是 Adaptive Query Execution 的一種應用。

          根據上面的例子,可以推導出場景滿足以下的條件時,使用 Runtime Filter 的效果會比較好:

          • 左表大右表小(當右表上還有額外的過濾條件會更理想),因為構建 Runtime Filter 是需要承擔計算成本的,包括一些內存的開銷,而開銷直接取決于右表的實際數據量
          • 左右表 Join 出來的結果很少,說明通過 Runtime Filter 可以過濾掉左表的絕大部分數據

          Doris 支持 3 種 Runtime Filter:

          • 一種是 IN,很好理解,將一個 hashset 下推到數據掃描節點。
          • 第二種就是 BloomFilter,就是利用哈希表的數據構造一個 BloomFilter,然后把這個 BloomFilter 下推到查詢數據的掃描節點。
          • 最后一種就是 MinMax,就是個 Range 范圍,通過右表數據確定 Range 范圍之后,下推給數據掃描節點。

          工作原理和優劣總結如下:

          Runtime Filter 類型工作原理適用場景優點缺點IN子查詢的方式,實現上是將一個 Hashset 下推到 Scan 節點Broadcast Join開銷小,過濾效果明顯且快速右表超過一定數據量時會失效,目前 Doris 配置的閾值是 1024Min/Max通過右表構建一個 Range 范圍,然后將它下推到 Scan 節點通用開銷小僅對數值類型有效果;對數值以外類型無法使用BloomFilter通過右表構建一個 BloomFilter,然后將它下推到 Scan 節點通用通用性較好,適用于各種類型、效果也較好配置比較復雜且計算成本較高;當過濾率較低或者左表數據較少時,可能導致性能降低

          一些使用的注意事項(比較細節了,后面考慮結合代碼再深入理解):

          開啟 Runtime Filter 后,左表的 ScanNode 會為每一個分配給自己的 Runtime Filter 等待一段時間再掃描數據,即如果 ScanNode 被分配了 3 個 Runtime Filter,那么它最多會等待 3000ms。

          因為 Runtime Filter 的構建和合并均需要時間,ScanNode 會嘗試將等待時間內到達的 Runtime Filter 下推到存儲引擎,如果超過等待時間后,ScanNode 會使用已經到達的 Runtime Filter 直接開始掃描數據。

          如果 Runtime Filter 在 ScanNode 開始掃描之后到達,則 ScanNode 不會將該 Runtime Filter 下推到存儲引擎,而是對已經從存儲引擎掃描上來的數據,在 ScanNode 上基于該 Runtime Filter 使用表達式過濾,之前已經掃描的數據則不會應用該 Runtime Filter,這樣得到的中間數據規模會大于最優解,但可以避免嚴重的劣化。

          如果集群比較繁忙,并且集群上有許多資源密集型或長耗時的查詢,可以考慮增加等待時間,以避免復雜查詢錯過優化機會。如果集群負載較輕,并且集群上有許多只需要幾秒的小查詢,可以考慮減少等待時間,以避免每個查詢增加 1s 的延遲。

          Join Reorder 優化

          有了前面兩表 Join 的 Runtime Filter 鋪墊,再來看 Join Reorder 的優化,邏輯關系上就能夠理順了。

          Doris 目前的 Join Reorder 算法是基于 RBO 的,邏輯描述如下:

          • 盡量讓大表跟小表做 Join,它生成的中間結果是盡可能小的
          • 把有條件的 Join 表往前放,也就是說盡量讓有條件的 Join 表進行過濾
          • Hash Join 的優先級高于 Nest Loop Join,因為 Hash join 本身是比 Nest Loop Join 快很多的

          可以發現前兩條,都是在朝著讓「右表」更小的方向去優化,而最后一條則是從算法的性能上來考慮。

          Join 調優建議

          • Join 列最好是相同的簡單類型;同類型避免 Cast 操作,簡單類型則有不錯的 Join 計算性能
          • Join 列最好是 Key 列,原因是 Key 列能夠充分利用 Doris 延遲物化的特性,減少 IO 提升性能
          • 大表之間的 Join 最好能夠利用上 Colocate,相當于已經做好了預 Shuffle,實際查詢的時候可以直接 Join 計算不再有 Shuffle 操作,徹底避免了大表的 Shuffle 網絡開銷
          • 利用 Runtime Filter,Join 過濾性高時效果顯著。根據 3 種 Runtime Filter 特點選擇最適合的
          • 涉及多表 Join,需要判斷 Join 的合理性。盡量保證“左大右小”的原則,HashJoin 優于 NLJ。必要時可以通過 SQL Rewrite,通過 Hint 來調整 Join 順序

          REF

          以上就是Apache Doris Join 優化原理詳解的詳細內容,更多關于Apache Doris Join 優化的資料請關注其它相關文章!

          標簽: Linux Apache
          主站蜘蛛池模板: 日产精品久久久久久久 | 欧美丰满少妇xxⅹ | 亚洲aⅴ片 | 亲子乱一区二区三区 | 久久久久国产一区二区三区 | 亚洲激情视频在线播放 | 久久久久在线视频 | 一本加勒比hezyo无码资源网 | 欧美激情aaa | 日韩av高清在线观看 | 69久久夜色精品国产69 | 黄色片子看看 | 中国黄色a级片 | 久久精品成人一区二区三区 | 日韩视频在线观看视频 | 午夜成人免费影院 | 我想看一级黄色片 | 国产又黄又粗的视频 | 精品国产三级a∨在线 | 调教驯服丰满美艳麻麻在线视频 | 红桃视频91 | 国产精品久久精品三级 | 99re色| 91亚洲欧美中文精品按摩 | 久久久99精品 | 国产精品情侣呻吟对白视频 | 久久久99国产精品免费 | 人人妻人人澡人人爽精品日本 | xx性欧美肥妇精品久久久久久 | 久久久久久一区 | 91九色porny视频| 欧美 国产 亚洲 卡通 综合 | 亚洲成人第一 | 又粗又硬的毛片aaaaa片 | 中国一级黄色大片 | 大巨胸乳美女做爰视频 | 欧美精品一二三 | 久久精品99国产国产精 | 肉体裸交137日本大胆摄影 | 香蕉av一区| 天堂资源官网在线资源 | 欧美久久久久久久久久久久久久 | 中文字幕一区日韩精品 | 97精品国产97久久久久久免费 | 欧美精品99久久久久久人 | 蜜臀av88| 人妻少妇精品久久 | 91精品网站 | 国产精品丝袜黑色高跟 | 成人夜色视频 | 中文字幕日本最新乱码视频 | 欧美日韩一区在线 | 97成人在线| 亚洲精品人人 | 精品成人一区二区三区四区 | 亚洲人成精品久久久久 | 影虎的最新视频 | 中文字幕精品一二三四五六七八 | 色噜噜狠狠色综合中国 | 漂亮人妻洗澡被公强 日日躁 | 国产美女无遮挡永久免费 | 成人一级片 | 久久久国产打桩机 | 韩国精品视频在线观看 | 中文字幕一区二区人妻电影 | 成人欧美视频 | 丁香六月久久 | 婷婷久久香蕉五月综合加勒比 | 求免费黄色网址 | 欧洲精品在线观看 | 消息称老熟妇乱视频一区二区 | yy111111少妇影院无码 | 精品av天堂毛片久久久借种 | 人成在线视频 | 图片区 小说区 区 亚洲五月 | 91激情在线视频 | 久久久久a | 综合激情五月婷婷 | 久久综合色之久久综合 | 日本jizzjizz | 国产高清精品在线观看 | 国产又黄又嫩又滑又白 | 国产第一页视频 | 美女天天干 | 国产精品久久中文字幕 | 亚洲久草视频 | 大肉大捧一进一出好爽mba | jizz日本国产 | 日本三级黄在线观看 | 国产成人精品午夜2022 | 91丝袜超薄交口足 | 无码国产69精品久久久久同性 | 在线成人免费观看 | 久久久婷婷成人综合激情 | 旅行的意义3在线观看韩国 绿帽av | 麻豆视频免费入口 | 91精品在线视频观看 | 五月天激情国产综合婷婷婷 | 性高湖久久久久久久久 | 欧美肥老太牲交大战 | 免费观看又色又爽又黄的传媒 | 成人免费观看男女羞羞视频 | 五月天激情婷婷婷久久 | 亚洲精品综合在线 | 欧美成人精品欧美一级私黄 | 免费av在线 | 明日花绮罗576空乘在线播放 | 一区二区国产精品 | 永久久久久久 | 四虎国产精品永久地址998 | 粉嫩av一区二区三区在线播放 | 日韩欧美成人一区二区三区 | 一区不卡在线 | 91午夜在线 | 国产a级片视频 | 中文久久乱码一区二区 | 欧美巨猛xxxx猛交黑人97人 | 亚洲国产欧美一区二区潘金莲 | 91亚色| 捏胸吃奶吻胸免费视频大软件 | 91青草视频 | 亚洲在线 | 白天躁晚上躁麻豆视频 | 国产日产欧美最新 | 亚洲色偷偷偷综合网 | 国自产拍偷拍精品 | 国产精品99久久久久久动医院 | 中文字幕无码人妻少妇免费 | 日日摸日日碰夜夜爽亚洲精品蜜乳 | 四虎视频在线观看 | 亚洲人成电影在线观看影院 | 日韩av在线影院 | 久久婷婷五月综合色一区二区 | 91精品久久久久久久久久久 | 成人国产一区二区 | 5a级毛片| 国产乱码精品一区二区三区忘忧草 | 在线播放成人 | 日韩精品―中文字幕 | yy111111少妇影院无码 | jizz日本免费| 免费看国产黄色片 | 日韩性猛交ⅹxxx乱大交 | 99精品久久精品一区二区 | 日本黄视频网站 | 国产综合色在线精品 | 四虎成人精品国产永久免费无码 | 波多野结衣一区二区 | 久久性色 | 琪琪女色窝窝777777 | 91精品视频免费在线观看 | 又大又粗欧美黑人aaaaa片 | 国产成人手机在线 | 国产欧美日韩精品丝袜高跟鞋 | 91极品欧美视频 | 亚洲精品aⅴ | 国产精品久久久久久久久久10秀 | 亚洲呦女专区 | 国产精品爽 | 肉丝袜脚交视频一区二区 | 精品国产乱码久久久久久1区二区 | 欧美日韩se | 免费观看毛片网站 | 婷婷午夜 | 免费看黄色三级 | 91国产在线看 | 欧美大片高清免费观看 | 波多野结衣免费在线视频 | 香蕉97超级碰碰碰免费公开 | 色呦呦网| 精品伊人久久 | 少妇的肉体k8经典 | 亚洲在线观看视频 | 国产成人免费爽爽爽视频 | 中文字字幕在线 | 日韩成人精品一区二区 | 色小说在线 | 午夜激情福利 | 亚洲国产精品一区二区久久 | 国产av国片精品 | 亚洲系列在线观看 | 国产极品美女高潮无套久久久 | 日本视频久久 | 美女诱惑一区二区 | 日韩二区三区 | 久久精品女人天堂av | 白嫩情侣偷拍呻吟刺激 | 亚洲视频图片小说 | 久久精品国产亚洲夜色av网站 | 国产伦精品一区二区三 | 99久久婷婷国产综合精品电影 | 一本久久综合亚洲鲁鲁五月天 | 都市激情亚洲色图 | 久久精品国产免费观看 | 亚洲一区视频在线 | 亚洲色图插插插 | 亚洲a级女人内射毛片 | 9l视频自拍蝌蚪9l视频 | 少妇高潮毛片高清免费播放 | 在线观看视频日韩 | 精品国产一区二区三区香蕉 | 欧美老妇交乱视频在线观看 | 99re中文字幕 | 性少妇中国内射xxxx狠干 | 人人澡澡人人 | 亚洲成在人线在线播放 | 亚洲毛片精品 | 丁香久久久 | 黄色大片免费看 | 老熟妻内射精品一区 | 男人午夜影院 | 精品午夜一区二区 | 国产精品日日摸夜夜添夜夜av | 国产精品a级 | 色一欲一性一乱—区二区三区 | 无码人妻av一区二区三区蜜臀 | asiass极品裸体女pics | 日韩特黄色片子看看 | 欧美黄色a级 | 青草青草视频2免费观看 | 在线看片成人 | 香蕉视频在线网站 | 在线精品国产成人综合 | 国产在线精品一区二区在线播放 | 久久久亚洲国产天美传媒修理工 | 国产精品美女久久久av超清 | 欧美一区二区三区在线观看 | 国产午夜成人久久无码一区二区 | 又黄又爽又色的网站 | 久久综合给合久久狠狠狠97色69 | 国产毛片毛片精品天天看软件 | 一个色的综合 | 国产美女引诱水电工 | 青娱乐伊人| 97sesecom| 香港三日本三级少妇少99 | 女人大荫蒂毛茸茸视频 | 116少妇做爰毛片 | 草色噜噜噜av在线观看香蕉 | 欧美成人aaaaaaaa免费 | 波多野结衣一区二区三区四区 | 水蜜桃av无码| 欧美做爰爽爽爽爽爽爽 | 超碰激情在线 | 少妇性l交大片免费快色 | 亚洲日韩乱码中文字幕 | 综合久久色 | 天天做天天爱夜夜爽 | 国产农村妇女毛片精品 | 精国产品一区二区三区四季综 | 色综合综合色 | 久久精品国产一区二区 | 日韩免费无码人妻波多野 | 好吊妞在线观看 | 在线观看不卡av | 亚洲国产精品网站 | 我要看www免费看插插视频 | 欧洲女人牲交性开放视频 | xxxx国产片 | 欧美色交 | 色姑娘综合 | 伊人久久无码中文字幕 | 国产精品久久久久久久久绿色 | 国产精品久久久久精 | 久久久精品久久久久 | 尹人综合网 | 91久久精品一区二区三区大 | 国产精品日韩欧美一区二区 | 古装清宫性艳史 | 免费aaa乇片 | 在线精品视频一区二区三四 | 欧美人禽杂交狂配 | 极品在线观看 | 999这里只有精品 | 香蕉视频影院 | 97精品在线 | 婷婷久久国产对白刺激五月99 | 99亚洲一区 | 免费av网站观看 | 一区二区三区视频在线看 | 国产午夜精品一区二区三区在线观看 | 国产精品久久久久久久久久免费 | 亚洲精品av羞羞禁网站 | 久久午夜私人影院 | 成年人在线观看视频免费 | 国产大陆亚洲精品国产 | 99久久精品国产同性同志 | julia一区二区 | 50一60岁老妇女毛片 | 九九九在线| 黄色大片一级片 | 免费国产在线一区二区 | 亚洲成av人在线观看网站 | 国产一级淫片a | 国产日韩精品视频 | 久久久久久a | 丁香五月亚洲综合在线 | 久久综合给合久久狠狠狠色97 | 午夜成午夜成年片在线观看 | 成年视频在线 | 午夜视频在线观看免费视频 | www在线免费观看视频 | 视频福利一区 | 三级4级全黄在线 | 久久99精品久久久久久噜噜 | 婷婷丁香九月 | 国内精品卡一卡二卡三 | 久久国产精品成人影院 | 激情春色网| 精品久久一二三区 | 日韩av网站在线观看 | 中文字幕观看视频 | 久久久久久久久久久久久大色天下 | 韩国久久久 | 91gao| 天天操天天谢 | 国产精品嫩草在线 | 亚洲欧美中文日韩在线v日本 | 国产精品国产三级国产潘金莲 | 亚洲性无码av在线 | 日本高清免费在线视频 | 亚洲夜色 | 又色又爽又高潮免费视频国产 | 亚洲精品人成无码中文毛片 | 日韩a级大片 | 国产精品一区二区久久久久 | 三男玩一个饥渴少妇爽叫视频播放 | 大黑人交xxxx18视频 | 亚洲一区二区a | 自拍欧美亚洲 | 伊人网视频在线 | 国产又爽又猛又粗的视频a片 | 国产理论在线观看 | 99久久综合 | 日本乱子伦 | 高清二区 | www国产在线观看 | 国产毛片毛片毛片毛片 | 亚洲一区二区二区久久成人婷婷 | 黄色毛片在线看 | 又色又爽又黄的视频软件app | 成人片在线看 | 亚洲婷婷综合久久一本伊一区 | 日韩av综合在线 | 国产日产欧产精品浪潮的免费功能 | 国产精品999久久久 国产精品99精品 | 午夜小视频在线播放 | 国产精品系列在线播放 | 含羞草传媒mv免费观看视频 | 3bmm在线观看视频免费 | 午夜激情四射 | 久久综合九色综合网站 | 男生草女生视频 | 性欧美videos做受 | 高h禁伦亲女1v2 | 狠狠干视频网 | 国产精品制服丝袜 | 亚洲色图校园春色 | 国产又粗又猛又色 | 影音先锋中文字幕在线播放 | 各种少妇正面着bbw撒尿视频 | 99爱国产| 国产高潮久久 | 女女同性女同一区二区三区91 | 一卡二卡精品 | 人人妻人人添人人爽欧美一区 | 国产又大又粗又爽 | 日本亚洲欧美在线 | 国产午夜影院 | 久久99国产精品女同 | 欧美激情影院 | 日本久久一区 | 国产日韩欧美在线播放 | 日本一级淫片免费看 | 精品免费久久 | 欧美日性视频 | 午夜精品久久久久久久久久久久久 | 一本色道久久加勒比精品 | 中文字幕日产乱码一二三区 | 老色69久久九九精品高潮 | 人人澡人人妻人人爽人人蜜桃麻豆 | 国产精品一区二区三区不卡 | 国产亚洲精品久久久久久国模美 | 蜜臀av在线播放一区二区三区 | 一级做a爰片欧美激情床 | 国产精品久久久久久亚洲 | 日韩av男人天堂 | 欧美午夜精品久久久久 | 黄色福利网站 | 以色列最猛性xxxxx视频 | 成人天堂噜噜噜 | 成人学院中文字幕 | 粉嫩精品国产色综合久久不8 | 亚洲h视频 | 免费看黄色a级片 | 国产精品23p| 一性一乱一乱一爱一频 | 国产精品久久久久久久久久久久久久 | 亚洲日本欧美在线 | 少妇无码av无码一区 | 无码一区二区三区亚洲人妻 | 女人做爰全过程免费观看美女 | 亚洲精品xxxx | 国产欧洲色婷婷久久99精品91 | 国产毛茸茸 | 国产免费无码一区二区视频 | 把腿张开老子臊烂你多p视频 | 农村真人裸体丰满少妇毛片 | 黄色片网战 | 一区二区在线免费观看视频 | 久草热在线 | 国产黄色网 | 欧洲老妇做爰xxxⅹ性视频 | 公妇乱偷在线播放 | 成人一级片视频 | 99热最新网址 | 精品国产午夜肉伦伦影院 | 黑人干亚洲 | 久久精品国产清高在天天线 | 成人黄色av网址 | 麻豆亚洲一区 | 成年人网站免费在线观看 | 精品国产乱码久久久久久移动网络 | 色噜噜亚洲男人的天堂 | 日本高清www免费视频大豆 | 尤物国产 | 狠狠色噜噜狠狠狠狠97俺也去 | 91玉足脚交白嫩脚丫在线播放 | 国产中老年妇女精品 | 国产一区二区在线视频观看 | 欧美mv日韩mv国产网站 | 成人妇女淫片aaaa视频 | 亚洲欧美一级久久精品国产特黄 | 亚洲 欧美 综合 | 亲子伦一区二区三区观看方式 | 妇女性内射冈站hdwwwooo | 日本性高潮视频 | 亚洲日韩乱码久久久久久 | 国产va视频 | 潮喷无码正在播放 | 一级淫片在线观看 | 成人午夜免费无码区 | 久久久久久久久久久久久久免费看 | 欧美人成在线 | 国内三级视频 | 女人被狂躁的高潮免费视频 | 91九色丨porny最新地址 | 婷婷六月久久综合丁香 | 污视频在线免费观看 | 久久99亚洲精品 | 在线观看小视频 | 97婷婷大伊香蕉精品视频 | 222aaa免费国产在线观看 | 国产午夜精品一区二区三区在线观看 | 中国一级大黄大黄大色毛片 | 国产一区二区三区四区视频 | 成人羞羞国产免费 | 久久综合综合久久综合 | 24小时日本在线www免费的 | 成人av网址大全 | 愉拍自拍第43页免费 | 亚洲中字 | 日本久久激情 | 国内毛片毛片 | 另类三区 | 欧美色亚洲 | 日韩中文字幕在线一区二区三区 | 无码137片内射在线影院 | 中文字幕第4页 | 亚洲爆乳无码一区二区三区 | 亚洲成人精品一区 | www久久视频| 人人草视频在线 | 舒淇裸体午夜理伦 | 丰满人妻熟妇乱又伦精品视 | 欧美一区二区三区免费看 | 97国产在线视频 | 日韩欧美国产视频 | 中国丰满少妇人妻xxx性董鑫洁 | 五月天激情婷婷婷久久 | 久久婷婷国产91天堂综合精品 | 18禁无遮挡免费视频网站 | 国产精品1000夫妇激情啪 | 国产精品久久久久久久久ktv | 人体写真福利视频 | 午夜爽爽久久久毛片 | 亚洲色图欧美激情 | 99免费在线 | 精品国内自产拍在线观看 | 亚洲成av人片一区二区梦乃 | 狠狠色狠狠色很很综合很久久 | 麻豆成人久久精品二区三区免费 | 蜜臀久久99精品久久久久久宅男 | 欧美国产激情视频 | 欧美精品一区二区在线播放 | 中文字幕+乱码+中文乱 | 国产亚洲欧美日韩高清 | 欧美天堂网站 | 欧美日韩一级二级 | 拍真实国产伦偷精品 | 国产乱子伦精品无码专区 | 国产精品18久久久久久首页狼 | 一级一片免播放 | 国产精品三级赵丽颖 | 青草热视频 | 美女又爽又黄 | 国产伦精品一区二区三区精品视频 | 婷婷六月久久综合丁香 | 女体拷问一区二区三区 | 中文有码在线 | 91亚洲精品久久久蜜桃网站 | 4h虎影库永久 | 久久综合9988久久爱 | 性一交一乱一区二区洋洋av | 伊人久久久久久久久久久 | 亚洲日韩精品一区二区三区 | 成年人在线免费 | 中文字幕精品一二三四五六七八 | 国产片av国语在线观看 | 香蕉av777xxx色综合一区 | av资源在线免费观看 | 毛茸茸熟妇丰满张开腿呻吟性视频 | 超碰av在线免费观看 | 精品成人av一区二区三区 | 毛片入口 | 看全黄大色黄大片美女人 | 国产经典盗摄91区x99av | 香蕉久久精品日日躁夜夜躁夏 | 91精品久久久久久久久久入口 | 军人粗大的内捧猛烈进出视频 | 成人精品一区二区三区 | 午夜精品99 | 18禁裸男晨勃露j毛免费观看 | 国产femdom调教7777 | 丁香啪啪综合成人亚洲小说 | 国产不卡视频一区二区三区 | 国产伦精品一区二区三区免费视频 | 亚洲伊人天堂 | 少妇理论片 | 亚洲精品乱码久久久久久国产主播 | 少妇人妻系列无码专区视频 | 尤物国产在线 | 国产又嫩又黄又猛视频在线观看 | 国产在线视频一区二区三区 | 国产自产一区二区 | 日韩久久无码免费毛片软件 | 7777精品伊人久久久大香线蕉 | 日韩精品久久无码中文字幕 | 中文字日产幕乱五区 | 久久成人毛片 | 日本黄a三级三级三级 | 91中文字幕在线 | 国产美女特级嫩嫩嫩bbb片 | 国产成人av一区二区三区在线观看 | 午夜三级视频 | 久久久黄色片 | 成人小视频在线免费观看 | 在线播放网址 | 亚洲精品国产精品乱码视色 | 欧美日韩在线视频 | 日韩一二三区在线观看 | 国产寡妇亲子伦一区二区三区四区 | 欧美日本国产一区 | 国产亚洲精品久久久97蜜臀 | 99国内精品久久久久久久 | 国产刺激出水片 | 日韩福利网站 | 亚洲激情视频 | 成人手机在线观看 | 国产一区二区三区久久久久久久 | www欧美日韩 | a级黄毛片 | 美女网站免费黄 | 国产精品igao视频网网址不卡日韩 | 国内偷拍av | 久久久精品动漫 | 在线视频一区二区三区四区 | 日产精品久久久一区二区 | 国产精欧美一区二区三区久久久 | 久久无码精品一区二区三区 | 台湾swag在线播放 | a视频在线观看免费 | 成人国产欧美日韩在线视频 | 人妻少妇被粗大爽.9797pw | 国产一区二区三区精品久久久 | 亚洲日日操| 天天躁夜夜躁狠狠是什么心态 | 欧美性潮喷xxxxx免费视频看 | www.av在线| 丰满少妇理论片在线观看 | 色吊丝网站 | 中曰韩黄色片 | av免费播放网站 | 日韩免费在线观看 | 中文字幕在线天堂 | 果冻传媒色av国产在线播放 | 免费在线你懂的 | 在线免费观看黄网站 | 插插插av| 91中文字幕| 大香伊蕉在人线国产av | 国产精品99久久久久人中文网介绍 | 青青草免费观看视频 | jazzjazz国产精品久久 | 欧美亚洲黄色片 | 亚洲一级av毛片 | 蜜桃av一区二区三区 | 在线观看小视频 | 天堂俺去俺来也www色官网 | 日本不卡免费在线 | 久久久久久人妻一区精品 | 免费无码黄动漫在线观看 | 日韩三级一区 | 亚洲奶水xxxx哺乳期tv | 日韩欧美中文字幕公布 |