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

FlinkSQL Join 優化器詳解,你學會了嗎?

數據庫 其他數據庫
?Join 操作通常涉及數據的重新分布、大量內存的占用以及潛在的網絡傳輸,因此,優化器的作用在于評估這些因素以選擇最佳的執行方式,從而在盡可能短的時間內完成計算任務,并確保資源的高效利用。

前言

在 FlinkSQL 中,Join 優化器的作用是確定一種最有效的方式來執行 SQL 中的 Join 操作,這一過程在大數據處理的場景中尤為重要,尤其是在需要處理海量數據時。

Join 操作通常涉及數據的重新分布、大量內存的占用以及潛在的網絡傳輸,因此,優化器的作用在于評估這些因素以選擇最佳的執行方式,從而在盡可能短的時間內完成計算任務,并確保資源的高效利用。

Join 優化的目標在于通過智能策略實現高效的數據整合,從而優化查詢的整體性能,尤其是當數據量呈指數增長時,其重要性更加突出。

Join 優化器的核心任務不僅僅是保證 Join 操作能夠順利執行,還需要在有限的硬件資源條件下實現最優的資源利用。例如,通過精確控制內存的使用量,減少網絡傳輸的需求,以及在并行執行中降低節點之間的數據傳輸開銷,這些都對大規模數據處理中的性能提升至關重要。

如果 Join 操作的優化策略不當,將會嚴重拖累查詢的執行效率,甚至導致查詢失敗。因此,Join 優化是 FlinkSQL 查詢中提升性能的核心環節。

為了適應不同的數據結構、分布特性和使用場景,Join 優化器會選擇不同的執行策略。通過對數據表的大小、數據傾斜情況、Join 類型(如內連接、外連接、左連接等)進行詳細分析,優化器能夠在確保性能的前提下選擇最合適的執行方式。此外,FlinkSQL 的優化器還可以根據集群的硬件資源配置和執行環境的變化動態調整執行計劃,保證其在不同集群環境和數據規模下的良好性能表現。

1. Join 優化器的基本原理

Flink 采用 Apache Calcite 作為優化引擎,Join 優化是 Calcite 負責的核心部分之一。其主要任務是將 SQL 查詢轉化為一種高效執行的形式,這一過程通常包括三個關鍵階段:

  • 邏輯計劃:邏輯計劃是將用戶編寫的 SQL 語句轉化為一種中間表示,用于描述如何進行數據操作,如過濾、聚合和連接。邏輯計劃并不關心具體的執行方式,而是提供一個抽象的計算步驟序列,以便后續優化。邏輯計劃是查詢優化的基礎,能夠獨立于物理執行環境,因此為優化器提供了在不同執行環境下選擇最優策略的靈活性。
  • 物理計劃:在邏輯計劃基礎上生成的物理計劃則具體描述了如何執行這些操作,諸如數據的流動方式、數據分區策略以及并行度等詳細信息。物理計劃定義了每個計算步驟在集群中的實際執行方式,是 SQL 查詢在 Flink 中的執行藍圖。通過優化物理計劃,Flink 能夠最大限度地利用集群中的資源,從而提高執行效率。
  • 執行計劃優化:最后一步是優化執行計劃,以減少資源開銷,例如內存消耗和網絡通信量。這一步會根據數據量和集群配置選擇最合適的執行方式,如數據分區策略、任務并行度等,從而在執行過程中保持資源利用的平衡,實現性能的最優化。

在 Flink 的源碼中,org.apache.flink.table.planner.plan.optimize.Program 類中包含了 Join 優化器的一些核心邏輯,用于在優化階段生成最佳的執行計劃。以下是部分源碼示例:

public class FlinkChainedProgram {
    public void optimize(RelNode relNode) {
        for (Program program : programs) {
            relNode = program.run(relNode);
        }
    }
}

這個類使用了一系列的優化程序來對邏輯計劃進行處理,包含了 Join 優化的步驟,目的是在執行之前找出最優的執行方式。

2. Join 優化的主要策略

Join 優化器通過評估數據特性來選擇適當的 Join 策略,常見的執行策略包括:

  • 廣播 Join:當 Join 中有一個小表和一個大表時,優化器通常選擇廣播 Join。廣播 Join 的核心思想是將小表的數據發送到所有計算節點,這樣每個節點都可以獨立完成對大表的 Join 操作,避免了大規模的數據移動。在小表數據量較小時,這種策略非常高效,因為它避免了 Shuffle 操作的代價,從而減少了網絡通信開銷。廣播 Join 在數據規模較小時的低成本優勢使其成為處理小表與大表連接的常用選擇。
  • Shuffle Hash Join:對于兩個規模相對較大的表,優化器會選擇 Shuffle Hash Join。這種策略通過將具有相同 Join 鍵的數據分配到同一個節點來實現連接,雖然這種方式需要對數據進行重新分區(即 Shuffle 操作),從而增加了網絡傳輸的開銷,但能夠有效處理大數據集。為了降低 Shuffle 的代價,優化器會嘗試選擇那些在分區過程中可以最大限度減少網絡傳輸的 Join 鍵,從而在處理大規模數據集時提升效率。
  • 嵌套循環 Join:嵌套循環 Join 通常用于處理沒有明確 Join 條件或者 Join 條件較為復雜的場景。在這種情況下,Join 操作通過遍歷兩個表的所有組合來實現,盡管其效率相對較低,但在某些特殊情況下,如小數據集或需要進行非等值連接時,嵌套循環 Join 可能是唯一可行的選擇。因此,嵌套循環 Join 主要用于數據量較小且需要進行復雜匹配的場景,雖然效率較低,但實現簡單。

在 Flink 的源碼中,Join 優化器的邏輯主要體現在 org.apache.flink.table.planner.plan.rules.logical.FlinkJoinRule 類和 org.apache.flink.table.planner.plan.optimize.JoinOptimizer 組件中。FlinkJoinRule 通過對邏輯計劃中的 Join 操作進行分析,確定是否可以將其優化為廣播 Join 或者其他更高效的 Join 類型,而 JoinOptimizer 則負責生成物理計劃中的具體執行策略。

源碼示例(類路徑:org.apache.flink.table.planner.plan.rules.logical.FlinkJoinRule):

public class FlinkJoinRule extends RelOptRule {
    public void onMatch(RelOptRuleCall call) {
        final Join join = call.rel(0);
        // 根據 Join 的類型和輸入大小選擇最優的執行方式
        if (isBroadcastable(join)) {
            call.transformTo(createBroadcastJoin(join));
        } else if (shouldShuffle(join)) {
            call.transformTo(createShuffleHashJoin(join));
        } else {
            call.transformTo(createNestedLoopJoin(join));
        }
    }

    private boolean isBroadcastable(Join join) {
        // 判斷是否可以將小表廣播
        return join.getLeft().getRowCount() < THRESHOLD;
    }

    private boolean shouldShuffle(Join join) {
        // 判斷是否需要進行數據重新分區
        return join.getRowType().getFieldCount() > SHUFFLE_THRESHOLD;
    }
}

在上述源碼中,FlinkJoinRule 通過判斷 Join 的輸入數據量來決定是選擇廣播 Join 還是 Shuffle Hash Join,從而確保查詢的高效執行。

此外,org.apache.flink.table.planner.plan.optimize.JoinOptimizer 中的代碼則進一步處理如何生成優化的物理計劃:

public class JoinOptimizer {
    public RelNode optimizeJoin(RelNode joinNode) {
        if (canUseBroadcast(joinNode)) {
            return createBroadcastJoin(joinNode);
        } else if (needsShuffle(joinNode)) {
            return createShuffleJoin(joinNode);
        } else {
            return createNestedLoopJoin(joinNode);
        }
    }

    private boolean canUseBroadcast(RelNode joinNode) {
        // 判斷小表是否適合廣播
        return joinNode.getLeft().estimateRowCount() < BROADCAST_THRESHOLD;
    }

    private boolean needsShuffle(RelNode joinNode) {
        // 是否需要數據 Shuffle
        return joinNode.getJoinType() != JoinRelType.INNER;
    }
}

在該代碼片段中,JoinOptimizer 決定是否應該使用廣播或 Shuffle Join,并通過對數據量和 Join 類型的判斷來生成最優的物理計劃。

3. Join 重排序

當多個表參與 Join 時,連接順序對查詢性能有顯著影響。Join 優化器會通過重排序找到最優的連接順序,以減少執行代價。

  • 重排序:優化器基于表大小、數據分布等信息,動態地重新排列多個表的 Join 順序,選擇代價最低的連接順序。通過合理重排序,可以優先處理數據量較小、代價較低的連接,從而減小中間結果的規模,降低整體計算的復雜度。Join 重排序對于提升查詢性能至關重要,尤其是在多表 Join 的情況下,通過減少中間結果的大小,優化器能夠顯著降低資源占用和執行時間。
  • 代價模型:優化器使用代價模型來評估不同 Join 策略的執行代價,這包括數據量、網絡傳輸開銷、內存使用以及 CPU 負載等因素。代價模型的作用在于為每個可能的 Join 順序和策略提供一個成本估計,以便選擇資源消耗最小的執行方式。通過代價模型,優化器能夠根據不同執行環境中的硬件配置和數據特性,找到既節約資源又高效的執行方案,確保查詢能夠在復雜環境下穩定運行。

在 Flink 的源碼中,org.apache.flink.table.planner.plan.rules.physical.stream.JoinReorderRule 類用于實現 Join 重排序的邏輯。該類會嘗試多種不同的 Join 順序,并基于代價模型計算每種方案的開銷,最終選擇代價最低的順序。

源碼示例(類路徑:org.apache.flink.table.planner.plan.rules.physical.stream.JoinReorderRule):

public class JoinReorderRule extends RelOptRule {
    public void onMatch(RelOptRuleCall call) {
        final List<Join> joins = call.getJoins();
        // 使用動態規劃算法計算最優的 Join 順序
        List<JoinOrder> possibleOrders = computeAllJoinOrders(joins);
        JoinOrder bestOrder = selectBestOrder(possibleOrders);
        call.transformTo(bestOrder.getPhysicalPlan());
    }

    private List<JoinOrder> computeAllJoinOrders(List<Join> joins) {
        // 生成所有可能的 Join 順序
        return DynamicProgramming.joinOrders(joins);
    }

    private JoinOrder selectBestOrder(List<JoinOrder> orders) {
        // 根據代價模型選擇代價最低的順序
        return Collections.min(orders, Comparator.comparing(JoinOrder::getCost));
    }
}

此外,org.apache.flink.table.planner.plan.rules.physical.batch.BatchJoinRule 也用于批處理場景中的 Join 優化,特別是批量計算模式下的 Join 規則應用。

源碼示例(類路徑:org.apache.flink.table.planner.plan.rules.physical.batch.BatchJoinRule):

public class BatchJoinRule extends RelOptRule {
    public void onMatch(RelOptRuleCall call) {
        final Join join = call.rel(0);
        // 檢查批處理環境下的 Join 策略
        if (canUseSortMergeJoin(join)) {
            call.transformTo(createSortMergeJoin(join));
        } else if (canUseHashJoin(join)) {
            call.transformTo(createHashJoin(join));
        } else {
            call.transformTo(createNestedLoopJoin(join));
        }
    }

    private boolean canUseSortMergeJoin(Join join) {
        // 判斷是否可以使用 Sort Merge Join
        return join.getLeft().getRowType().getFieldCount() < SORT_MERGE_THRESHOLD;
    }

    private boolean canUseHashJoin(Join join) {
        // 判斷是否可以使用 Hash Join
        return join.getRight().estimateRowCount() < HASH_JOIN_THRESHOLD;
    }
}

BatchJoinRule 通過判斷是否適合使用排序合并 Join(Sort Merge Join)或者哈希 Join(Hash Join),從而在批處理模式下實現最優的執行效率。上述代碼展示了如何通過不同的邏輯條件選擇最優的執行計劃,以確保批處理場景下的 Join 操作高效執行。

4. 示例:FlinkSQL 中的 Join 優化應用

在金融銀行業務場景中,Join 操作是非常常見的,例如將交易數據與客戶賬戶信息進行關聯,以實現對客戶行為的深入分析和實時風控。假設我們有以下兩個數據表:

  • Transactions 表:包含客戶的交易數據,如交易金額、交易時間等;
  • Accounts 表:包含客戶的賬戶信息,如客戶的姓名、賬戶余額等。

我們希望通過 customer_id 將這兩個表連接,分析客戶的交易數據,并生成針對每個客戶的實時風控報告。

示例 SQL 查詢:

SELECT t.transaction_id, t.transaction_time, t.amount, a.customer_name, a.account_balance
FROM Transactions t
JOIN Accounts a ON t.customer_id = a.customer_id;

Join 優化器的實際應用:

  • 廣播 Join:在金融行業中,客戶賬戶信息(Accounts 表)通常較小且變化不頻繁,而交易數據(Transactions 表)則相對龐大且流動性較高。此時,FlinkSQL 優化器可能會選擇廣播 Join,將 Accounts 表廣播到各個節點,以避免大規模數據的 Shuffle。每個節點獨立處理 Transactions 表中的數據,通過與廣播的 Accounts 表進行連接,極大地提高了處理效率。業務應用:在金融實時風控系統中,廣播 Join 可以用來快速將客戶靜態信息與海量交易數據進行關聯,實時檢測可疑交易行為。

源碼分析:FlinkJoinRule 中的 isBroadcastable 方法會檢測 Accounts 表的大小,判斷是否適合采用廣播 Join。

  • Shuffle Hash Join:當 Transactions 和 Accounts 表的數據量都非常大時,廣播 Join 變得不可行。這種情況下,優化器可能會選擇 Shuffle Hash Join。FlinkSQL 會將兩個表的數據按 customer_id 進行分區,使具有相同 customer_id 的記錄位于同一節點,從而完成 Join 操作。業務應用:在銀行的海量交易數據處理場景下,Shuffle Hash Join 可以確保數據的均勻分布,提高大規模數據的 Join 性能。例如,當處理歷史交易數據進行合規性審計時,可能會使用此 Join 策略。

源碼分析:JoinOptimizer 類中的 needsShuffle 方法會判斷 Join 的兩側表是否需要進行數據 Shuffle。如果兩個表的數據分布不均勻,Shuffle 可以避免熱點問題。

  • 排序合并 Join:在批處理場景下,如果 Transactions 和 Accounts 表的數據按照 customer_id 進行了排序,優化器可能會選擇使用 Sort Merge Join。這種方式在處理已經排序的數據時,避免了額外的排序開銷,特別適合批量數據的分析。

    業務應用:在批量交易對賬、清算等業務中,數據往往是預先排序好的,這種情況下使用排序合并 Join 可以大幅減少計算資源的消耗,提升處理效率。

源碼分析:BatchJoinRule 中的 canUseSortMergeJoin 方法判斷兩個表是否已經排序,適用于批量數據處理時的優化。


責任編輯:武曉燕 來源: 大數據左右手
相關推薦

2024-02-04 00:00:00

Effect數據組件

2024-01-02 12:05:26

Java并發編程

2022-07-13 08:16:49

RocketMQRPC日志

2023-03-26 22:31:29

2022-12-06 07:53:33

MySQL索引B+樹

2022-04-26 08:41:54

JDK動態代理方法

2024-12-31 00:08:37

C#語言dynamic?

2024-09-10 10:34:48

2024-01-19 08:25:38

死鎖Java通信

2023-01-10 08:43:15

定義DDD架構

2023-07-26 13:11:21

ChatGPT平臺工具

2023-12-08 13:23:00

大數據MySQL存儲

2024-08-12 08:12:38

2023-03-09 07:38:58

static關鍵字狀態

2023-05-18 09:01:11

MBRGPT分區

2022-04-26 08:10:33

MySQL存儲InnoDB

2023-08-01 12:51:18

WebGPT機器學習模型

2024-01-02 07:04:23

2023-07-03 07:20:50

2023-01-30 09:01:54

圖表指南圖形化
點贊
收藏

51CTO技術棧公眾號

国产亚洲亚洲国产一二区| 午夜激情视频在线观看| 国产欧美91| 在线电影欧美日韩一区二区私密| 超碰在线公开97| 搞黄网站在线观看| wwwwww.欧美系列| 成人a在线视频| 日韩少妇高潮抽搐| 99视频精品全部免费在线视频| 日韩精品一区二区三区视频播放| 干日本少妇首页| 超碰在线caoporn| 久久麻豆一区二区| 999精品视频一区二区三区| 亚洲精品男人的天堂| 天天av综合| 亚洲欧洲日产国产网站| 久久综合桃花网| 欧美天堂视频| 亚洲第一福利视频在线| 伊人久久大香线蕉精品| 全部免费毛片在线播放网站| 国产精品一卡二卡| 国产精品久久久久av免费| 欧美精品乱码视频一二专区| 成人激情开心网| 亚洲精品福利在线| 无码人妻一区二区三区在线视频| 日韩不卡在线| 欧美午夜激情在线| 国产高清www| av黄色在线| 国产精品久久久久久久久动漫 | 欧美精品密入口播放| 777午夜精品免费视频| mm1313亚洲国产精品无码试看| 538在线视频| 一区二区三区欧美日韩| 在线免费观看成人网| 黄色片视频在线观看| 97久久超碰国产精品| 国产精品国产精品国产专区蜜臀ah| 中文字幕乱码视频| 日韩精品久久理论片| 庆余年2免费日韩剧观看大牛| 国产精品二区一区二区aⅴ| 亚洲精品一区二区妖精| www.国产精品一二区| 国产伦理片在线观看| 在线亚洲a色| 精品亚洲国产视频| 久久精品老司机| 台湾色综合娱乐中文网| 日韩成人av在线| 免费成人深夜夜行p站| 久久a级毛片毛片免费观看| 精品国精品自拍自在线| 在线观看免费视频国产| 成人av动漫| 亚洲韩国日本中文字幕| 久久人妻少妇嫩草av无码专区| 中文字幕av一区二区三区四区| 精品奇米国产一区二区三区| 日韩女优在线视频| 美腿丝袜亚洲图片| 国产视频一区在线| 无码熟妇人妻av| 综合亚洲色图| 尤物精品国产第一福利三区| 影音先锋男人看片资源| 99精品网站| 蜜月aⅴ免费一区二区三区| 91高清免费看| 影音先锋一区| 日本精品一区二区三区在线播放视频| 91精品国产高清一区二区三密臀| 久久精品男女| 成人黄色在线播放| 成人av无码一区二区三区| 大白屁股一区二区视频| 久久亚洲一区二区| av福利精品| 亚洲一区二区四区蜜桃| 久久久久久久久久久免费视频| 亚洲一区二区三区四区| 91麻豆精品国产91久久久久| 国产香蕉精品视频| 国产精品免费大片| 久久久精品影院| 免费在线一级片| 麻豆亚洲精品| 91在线免费网站| 香港三日本三级少妇66| 国产精品久久久久婷婷二区次| av久久久久久| 欧美色网在线| 欧美tk丨vk视频| 一区二区三区在线观看免费视频| 欧美1区3d| 国产精品第七十二页| 国产麻豆精品一区| 久久久午夜精品理论片中文字幕| 一区二区三区在线视频看| 秋霞在线视频| 欧美日韩一区二区欧美激情| 妖精视频一区二区| 久久亚洲成人| 91高清视频免费| 国产熟女一区二区三区四区| 久久亚洲一级片| 国产精品三级一区二区| 国产一区二区三区朝在线观看| 日韩一区二区三区免费观看| 中文字幕 自拍| 亚洲久久在线| 91成人在线看| 天堂а√在线资源在线| 婷婷综合另类小说色区| 在线免费观看av网| 成人6969www免费视频| 欧美夜福利tv在线| 亚洲第一天堂在线观看| 亚洲同性同志一二三专区| 乱子伦视频在线看| 亚洲va久久久噜噜噜久久| 美女扒开尿口让男人操亚洲视频网站| 波多野结衣在线电影| 91免费看`日韩一区二区| 成人区一区二区| 国产精品亚洲一区二区在线观看| 国产午夜精品免费一区二区三区| 四虎成人精品永久免费av| 国产一区二区免费在线| 亚洲国产欧美一区二区三区不卡| 婷婷六月国产精品久久不卡| 亚洲精品久久久久久下一站 | 亚洲一区二区在线播放| 瑟瑟视频在线| 欧美性做爰猛烈叫床潮| 中文字幕第4页| 亚洲黄色成人| 国产日韩欧美精品| aa视频在线观看| 欧美白人最猛性xxxxx69交| 美国黄色小视频| 国产剧情av麻豆香蕉精品| 只有这里有精品| 成人av在线播放| 久久影院在线观看| 99久久精品国产一区色| 亚洲美女免费在线| 毛片毛片毛片毛片毛| 最新欧美人z0oozo0| 亚洲专区在线视频| 丝袜在线视频| 精品久久一二三区| 粉嫩aⅴ一区二区三区| jlzzjlzz亚洲日本少妇| 欧美亚洲国产成人| 色吊丝一区二区| 国产99久久精品一区二区永久免费 | 亚洲欧美日韩精品久久久| 欧美日韩精品一区二区三区视频| 亚洲免费人成在线视频观看| av一级在线观看| 国产精品无遮挡| 亚洲精品mv在线观看| 欧美久久一区| 久久久久久高清| 日韩三区免费| 久久天天躁狠狠躁夜夜躁| 精品美女www爽爽爽视频| 亚洲福中文字幕伊人影院| 熟女少妇一区二区三区| 蜜臀av一区二区在线免费观看 | 国产情侣一区| 欧美日韩精品久久久免费观看| 日本精品在线中文字幕| 久久亚洲国产精品| 蜜桃91麻豆精品一二三区| 欧美日韩国产激情| 你懂得视频在线观看| 国产一区免费电影| 青娱乐自拍偷拍| 日本一区二区高清不卡| 亚洲最大的成人网| 深夜福利视频一区二区| 中国人与牲禽动交精品| 成人爽a毛片一区二区| 色婷婷综合激情| 91插插插插插插| 91丨国产丨九色丨pron| 91pony九色| 国产视频久久| 黄黄视频在线观看| 嫩草影视亚洲| 亚洲一区二区三区久久| 成人日韩精品| 久久久久久香蕉网| 在线观看精品一区二区三区| 日韩你懂的在线播放| 国产又粗又猛又爽又| 亚洲最大成人网4388xx| 色婷婷国产精品免| 91丨九色丨国产丨porny| 女王人厕视频2ⅴk| 日本vs亚洲vs韩国一区三区 | 亚洲 欧美 国产 另类| 97se亚洲国产综合自在线观| 欧美成人手机在线视频| 久久久成人网| 日本一区午夜艳熟免费| 91欧美国产| 日韩国产高清一区| 国产+成+人+亚洲欧洲在线| 国产伊人精品在线| 色婷婷综合久久久中字幕精品久久| 久久99视频免费| 蜜桃视频网站在线| 永久免费看mv网站入口亚洲| 婷婷在线观看视频| 日韩视频不卡中文| 国产伦子伦对白视频| 欧美日韩美少妇| 中文字幕一区二区三区四区欧美| 欧美日韩国产丝袜另类| 国产亚洲精久久久久久无码77777| 亚洲婷婷在线视频| 中文字幕黄色网址| 久久久精品国产99久久精品芒果 | 国产婷婷一区二区三区久久| 在线观看国产一区二区| 97超碰人人干| 精品久久久久久久久久国产| 国产一级二级三级视频| 亚洲久本草在线中文字幕| 国产人与禽zoz0性伦| 国产精品色眯眯| 手机看片日韩av| 欧美激情综合在线| 韩国三级hd中文字幕| 国产午夜一区二区三区| 日韩精品卡通动漫网站| 26uuu色噜噜精品一区| 中文字幕精品视频在线| caoporen国产精品视频| 中文字幕第3页| 99这里只有久久精品视频| 精品人妻伦一二三区久| www.成人网.com| 亚洲专区区免费| 久久免费视频色| 中文字幕在线观看免费高清| 久久免费的精品国产v∧| 实拍女处破www免费看| 国产亚洲一区字幕| 亚洲高潮女人毛茸茸| 国产精品久久久久7777按摩| www成人啪啪18软件| 亚洲视频中文字幕| 青娱乐av在线| 亚洲不卡av一区二区三区| 日韩精品久久久久久久酒店| 色女孩综合影院| 亚洲资源在线播放| 日韩一区二区三区在线视频| 噜噜噜久久,亚洲精品国产品| 日韩激情在线视频| 国产黄色在线| 久久手机精品视频| 成人在线高清免费| 日本一区二区不卡| 一级欧美视频| 国产综合精品一区二区三区| 狠狠综合久久av一区二区蜜桃| 亚洲精品高清国产一线久久| 欧美激情五月| 无码aⅴ精品一区二区三区浪潮 | 国产无套精品一区二区三区| 懂色av一区二区三区免费看| 中文字幕丰满孑伦无码专区| 国产精品天天摸av网| 久久久久久激情| 色诱视频网站一区| 国产露脸国语对白在线| 亚洲国产一区自拍| 日p在线观看| 午夜精品久久久久久久久久久久 | 制服丝袜一区二区三区| 女人18毛片水真多18精品| 亚洲图片欧洲图片av| 伊人福利在线| 国产精品久久久久久av下载红粉 | 日韩免费一区二区三区在线播放| 无码国产精品一区二区免费16| 中文字幕亚洲专区| 成人三级高清视频在线看| 国产欧美va欧美va香蕉在线| 精品嫩草影院| 欧洲精品视频在线| 亚洲一区二区三区四区五区午夜| wwwwwxxxx日本| 91欧美激情一区二区三区成人| 任我爽在线视频| 日韩欧美一区视频| 黑人乱码一区二区三区av| 色偷偷888欧美精品久久久| h片在线观看视频免费免费| 国产欧美精品一区二区| 午夜欧洲一区| r级无码视频在线观看| 激情伊人五月天久久综合| 成人精品999| 香蕉乱码成人久久天堂爱免费| 国产精品久久777777换脸| 国产小视频国产精品| 韩国精品一区| 国产成人精品日本亚洲11 | 中文无码精品一区二区三区| 精品国产免费视频| av大大超碰在线| 国产色视频一区| 精品久久影视| 国产a级一级片| 波多野结衣视频一区| 爱爱视频免费在线观看| 欧美日韩在线播放| 国产在线色视频| 欧美在线视频观看| 日韩激情啪啪| 国产免费黄色av| 99久久精品国产导航| 国产中文字幕免费| 欧美大片日本大片免费观看| 操你啦在线视频| 亚洲直播在线一区| 欧美日韩91| 中国特级黄色片| 亚洲一区二区精品视频| 午夜美女福利视频| 欧美成人剧情片在线观看| 91精品国产自产观看在线| 在线成人性视频| 精品在线亚洲视频| 四虎884aa成人精品| 69久久夜色精品国产69蝌蚪网| 最新av网站在线观看| 国产在线视频欧美| 一区二区日韩欧美| 日本一二三四区视频| 亚洲精品中文在线| 亚洲美女福利视频| 性欧美长视频免费观看不卡| 麻豆精品少妇| 成人在线免费播放视频| 国产丝袜欧美中文另类| 亚洲午夜无码久久久久| 日韩专区在线观看| 免费欧美网站| 日本在线xxx| 国产婷婷色一区二区三区四区| 中文字幕乱码视频| 欧美精品在线免费播放| 丁香5月婷婷久久| av网站在线观看不卡| 国产婷婷色一区二区三区在线| 亚洲在线精品视频| 欧美大片免费观看| 欧美日韩看看2015永久免费| 成人午夜视频免费在线观看| 国产精品国产三级国产aⅴ入口 | 亚洲视频视频在线| 欧洲美女精品免费观看视频| 午夜探花在线观看| 95精品视频在线| a片在线免费观看| 欧美精品一区在线播放| 天堂综合网久久| 伊人网在线综合| 亚洲一本大道在线| 国内精品在线视频| 91深夜福利视频| 亚洲免费影视| 免费成人美女女在线观看| 精品久久久网站| 成人网ww555视频免费看| 日本久久高清视频| 91免费在线视频观看| 一级片在线免费观看视频| 久久久久久久久久国产| 欧美人与牛zoz0性行为| 国产精品久久久久野外| 日韩欧美精品免费在线| 18+视频在线观看| 欧美一卡2卡3卡4卡无卡免费观看水多多| 久久99国产精品麻豆| 国偷自拍第113页| 久久五月天综合| 欧美精选一区二区三区|