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

火山引擎在行為分析場景下的 ClickHouse JOIN 優化

原創 精選
大數據
火山引擎增長分析 DataFinder 基于 ClickHouse 來進行行為日志的分析,ClickHouse 的主要版本是基于社區版改進開發的字節內部版本。

1. 背景

火山引擎增長分析 DataFinder 基于 ClickHouse 來進行行為日志的分析,ClickHouse 的主要版本是基于社區版改進開發的字節內部版本。主要的表結構:

圖片

事件表:存儲用戶行為數據,以用戶 ID 分 shard 存儲。

--列出了主要的字段信息
CREATE TABLE tob_apps_all
(
`tea_app_id` UInt32, --應用ID
`device_id` String DEFAULT '', --設備ID
`time` UInt64,--事件日志接受時間
`event` String,--事件名稱
`user_unique_id` String,--用戶ID
`event_date` Date , --事件日志日期,由time轉換而來
`hash_uid` UInt64 --用戶ID hash過后的id,用來join降低內存消耗
)│
```

用戶表:存儲用戶的屬性數據,以用戶 ID 分 shard 存儲。

--列出了主要的字段信息
CREATE TABLE users_unique_all
(
`tea_app_id` UInt32, --應用ID
`user_unique_id` String DEFAULT '', -- 用戶ID
`device_id` String DEFAULT '', -- 用戶最近的設備ID
`hash_uid` UInt64,--用戶ID hash過后的id,用來join降低內存消耗
`update_time` UInt64,--最近一次更新時間
`last_active_date` Date --用戶最后活躍日期
)

設備表:存儲設備相關的數據,以設備 ID 分 shard 存儲。

--列出了主要的字段信息
CREATE TABLE devices_all
(
`tea_app_id` UInt32, --應用ID
`device_id` String DEFAULT '', --設備ID
`update_time` UInt64, --最近一次更新時間
`last_active_date` Date --用戶最后活躍日期
)

業務對象表:存儲業務對象相關的數據,每個 shard 存儲全量的數據。

--列出了主要的字段信息
CREATE TABLE rangers.items_all
(
`tea_app_id` UInt32,
`hash_item_id` Int64,
`item_name` String, --業務對象名稱。比如商品
`item_id` String, --業務對象ID。比如商品id 1000001
`last_active_date` Date
)

1.1 業務挑戰

圖片

隨著接入應用以及應用的 DAU 日益增加,ClickHouse 表的事件量增長迅速;并且基于行為數據需要分析的業務指標越來越復雜,需要 JOIN 的表增多;我們遇到有一些涉及到 JOIN 的復雜 SQL 執行效率低,內存和 CPU 資源占用高,導致分析接口響應時延和錯誤率增加。

2. 關于 Clickhouse 的 JOIN

在介紹優化之前,先介紹一下基本的 ClickHouse JOIN 的類型和實現方式。

2.1 分布式 JOIN

SELECT 
et.os_name,
ut.device_id AS user_device_id
FROM tob_apps_all AS et
ANY LEFT JOIN
(
SELECT
device_id,
hash_uid
FROM users_unique_all
WHERE (tea_app_id = 268411) AND (last_active_date >= '2022-08-06')
) AS ut ON et.hash_uid = ut.hash_uid
WHERE (tea_app_id = 268411)
AND (event = 'app_launch')
AND (event_date = '2022-08-06')

基本執行過程:

一個 Clickhouse 節點作為 Coordinator 節點,給每個節點分發子查詢,子查詢 sql(tob_apps_all 替換成本地表,users_unique_all 保持不變依然是分布式表)。

每個節點執行 Coordinator 分發的 sql 時,發現 users_unique_all 是分布式表,就會去所有節點上去查詢以下 SQL(一共有 N*N。N 為 shard 數量)。

  1. SELECT device_id, hash_uid FROMusers_uniqueWHERE (tea_app_id = 268411) AND (last_active_date >= '2022-08-06')
  1. 每個節點從其他 N-1個節點拉取2中子查詢的全部數據,全量存儲(內存 or 文件),進行本地 JOIN。
  2. Coordinator 節點從每個節點拉取3中的結果集,然后做處理返回給 client。

存在的問題:

  1. 子查詢數量放大。
  2. 每個節點都全量存儲全量的數據。

2.2 分布式 Global JOIN

SELECT 
et.os_name,
ut.device_id AS user_device_id
FROM tob_apps_all AS et
GLOBAL ANY LEFT JOIN
(
SELECT
device_id,
hash_uid
FROM users_unique_all
WHERE (tea_app_id = 268411) AND (last_active_date >= '2022-08-06')
) AS ut ON et.hash_uid = ut.hash_uid
WHERE (tea_app_id = 268411)
AND (event = 'app_launch')
AND (event_date = '2022-08-06')

基本執行過程:

  1. 一個 Clickhouse 節點作為 Coordinator 節點,分發查詢。在每個節點上執行sql(tob_apps_all 替換成本地表,右表子查詢替換成別名 ut)。
  2. Coordinator 節點去其他節點拉取 users_unique_all 的全部數據,然后分發到全部節點(作為1中別名表 ut 的數據)。
  3. 每個節點都會存儲全量的2中分發的數據(內存or文件),進行本地 local join。
  4. Coordinator 節點從每個節點拉取3中的結果集,然后做處理返回給 client。

存在的問題:

  1. 每個節點都全量存儲數據。
  2. 如果右表較大,分發的數據較大,會占用網絡帶寬資源。

2.3 本地 JOIN

SQL 里面只有本地表的 JOIN,只會在當前節點執行。

SELECT et.os_name,ut.device_id AS user_device_id
FROM tob_apps et any LEFT JOIN
(SELECT device_id,
hash_uid
FROM rangers.users_unique
WHERE tea_app_id = 268411
AND last_active_date>='2022-08-06') ut
ON et.hash_uid=ut.hash_uid
WHERE tea_app_id = 268411
AND event='app_launch'
AND event_date='2022-08-06'

2.3.1 Hash join

  • 右表全部數據加載到內存,再在內存構建 hash table。key 為 joinkey。
  • 從左表分批讀取數據,從右表 hash table匹配數據。
  • 優點是:速度快 缺點是:右表數據量大的情況下占用內存。

2.3.2 Merge join?

  • 對右表排序,內部 block 切分,超出內存部分 flush 到磁盤上,內存大小通過參數設定。
  • 左表基于 block 排序,按照每個 block 依次與右表 merge。
  • 優點是:能有效控制內存 缺點是:大數據情況下速度會慢。

優先使用 hash join 當內存達到一定閾值后再使用 merge join,優先滿足性能要求。

3. 解決方案

圖片

3.1 避免JOIN

3.1.1 數據預生成

數據預生成(由 Spark/Flink 或者 Clickhouse 物化視圖產出數據),形成大寬表,基于單表的查詢是 ClickHouse 最為擅長的場景。

我們有個指標,實現的 SQL 比較復雜(如下),每次實時查詢很耗時,我們單獨建了一個表 table,由 Spark 每日構建出這個指標,查詢時直接基于 table 查詢。

SELECT event_date,count(distinct uc1) AS uv,sum(value) AS sum_value, ......
FROM
(SELECT event_date,hash_uid AS uc1,sum(et.float_params{ 'amount' }) AS value, count(1) AS cnt, value*cnt AS multiple
FROM tob_apps_all et GLOBAL ANY LEFT JOIN
(SELECT hash_uid AS join_key,int_profiles{ '$ab_time_34' }*1000 AS first_time
FROM users_unique_all
WHERE app_id = 10000000 AND last_active_date >= '2022-07-19' AND first_time is NOT null) upt
ON et.hash_uid=upt.join_key
WHERE (查詢條件)
GROUP BY uc1,event_date)
GROUP BY event_date;

數據量2300W,查詢時間由7秒->0.008秒。當然這種方式,需要維護額外的數據構建任務。總的思路就是不要讓 ClickHouse 實時去 JOIN。

圖片

3.1.2 使用 IN 代替 JOIN

JOIN 需要基于內存構建 hash table 且需要存儲右表全部的數據,然后再去匹配左表的數據。而 IN 查詢會對右表的全部數據構建 hash set,但是不需要匹配左表的數據,且不需要回寫數據到 block。

比如:

SELECT event_date, count()
FROM tob_apps_all et global any INNER JOIN
(SELECT hash_uid AS join_key
FROM users_unique_all
WHERE app_id = 10000000
AND last_active_date >= '2022-01-01') upt
ON et.hash_uid = upt.join_key
WHERE app_id = 10000000
AND event_date >= '2022-01-01'
AND event_date <= '2022-08-02'
GROUP BY event_date

可以改成如下形式:

SELECT event_date,
count()
FROM tob_apps_all
WHERE app_id = 10000000
AND event_date >= '2022-01-01'
AND event_date <= '2022-08-02'
AND hash_uid global IN
(SELECT hash_uid
FROM users_unique_all
WHERE (tea_app_id = 10000000)
AND (last_active_date >= '2022-01-01') )
GROUP BY event_date

如果需要從右表提取出屬性到外層進行計算,則不能使用 IN 來代替 JOIN。

相同的條件下,上面的測試 SQL,由 JOIN 時的16秒優化到了 IN 查詢時的11秒。

圖片

?

3.2 更快的 JOIN

3.2.1 優先本地 JOIN

數據預先相同規則分區

也就是 Colocate JOIN。優先將需要關聯的表按照相同的規則進行分布,查詢時就不需要分布式的 JOIN。

SELECT 
et.os_name,
ut.device_id AS user_device_id
FROM tob_apps_all AS et
ANY LEFT JOIN
(
SELECT
device_id,
hash_uid
FROM users_unique_all
WHERE (tea_app_id = 268411) AND (last_active_date >= '2022-08-06')
) AS ut ON et.hash_uid = ut.hash_uid
WHERE (tea_app_id = 268411)
AND (event = 'app_launch')
AND (event_date = '2022-08-06')
settings distributed_perfect_shard=1

比如事件表 tob_apps_all 和用戶表 users_unique_all 都是按照用戶 ID 來分 shard 存儲的,相同的用戶的兩個表的數據都在同一個 shard 上,因此這兩個表的 JOIN 就不需要分布式 JOIN 了。

distributed_perfect_shard 這個 settings key 是字節內部 ClickHouse 支持的,設置過這個參數,指定執行計劃時就不會再執行分布式 JOIN 了。

基本執行過程:

  1. 一個 ClickHouse 節點作為 Coordinator 節點,分發查詢。在每個節點上執行 sql(tob_apps_all、users_unique_all替換成本地表)。
  2. 每個節點都執行1中分發的本地表 join 的 SQL(這一步不再分發右表全量的數據)。
  3. 數據再回傳到 coordinator 節點,然后返回給 client。
數據冗余存儲

如果一個表的數據量比較小,可以不分 shard 存儲,每個 shard 都存儲全量的數據,例如我們的業務對象表。查詢時,不需要分布式 JOIN,直接在本地進行 JOIN 即可。

SELECT count()
FROM tob_apps_all AS et
ANY LEFT JOIN
(
SELECT item_id
FROM items_all
WHERE (tea_app_id = 268411)
) AS it ON et.item_id = it.item_id
WHERE (tea_app_id = 268411)
AND (event = 'app_launch')
AND (event_date = '2022-08-06')
settings distributed_perfect_shard=1

例如這個 SQL,items_all 表每個 shard 都存儲同樣的數據,這樣也可以避免分布式 JOIN 帶來的查詢放大和全表數據分發問題。

3.2.2 更少的數據

不論是分布式 JOIN 還是本地 JOIN,都需要盡量讓少的數據參與 JOIN,既能提升查詢速度也能減少資源消耗。

SQL 下推

ClickHouse 對 SQL 的下推做的不太好,有些復雜的 SQL 下推會失效。因此,我們手動對 SQL 做了下推,目前正在測試基于查詢優化器來幫助實現下推優化,以便讓 SQL 更加簡潔。

下推的 SQL:

SELECT 
et.os_name,
ut.device_id AS user_device_id
FROM tob_apps_all AS et
ANY LEFT JOIN
(
SELECT
device_id,
hash_uid
FROM users_unique_all
WHERE (tea_app_id = 268411)
AND (last_active_date >= '2022-08-06'
AND 用戶屬性條件 1 OR 用戶屬性條件 2)
) AS ut ON et.hash_uid = ut.hash_uid
WHERE (tea_app_id = 268411)
AND (event = 'app_launch')
AND (event_date = '2022-08-06')
settings distributed_perfect_shard=1

對應的不下推的 SQL:

SELECT 
et.os_name,
ut.device_id AS user_device_id
FROM tob_apps_all AS et
ANY LEFT JOIN
(
SELECT
device_id,
hash_uid
FROM rangers.users_unique_all
WHERE (tea_app_id = 268411)
AND (last_active_date >= '2022-08-06')
) AS ut ON et.hash_uid = ut.hash_uid
WHERE (tea_app_id = 268411)
AND (event = 'app_launch')
AND (event_date = '2022-08-06')
AND (ut.用戶屬性條件 1 OR ut.用戶屬性條件 2)
settings distributed_perfect_shard=1

可以看到,不下推的 SQL 更加簡潔,直接基于 JOIN 過后的寬表進行過濾。但是 ClickHouse 可能會將不滿足條件的 users_unique_all 數據也進行 JOIN。

我們使用中有一個復雜的 case,用戶表過濾條件不下推有1千萬+,SQL 執行了3000秒依然執行超時,而做了下推之后60秒內就執行成功了。

圖片

3.2.3 Clickhouse 引擎層優化

一個 SQL 實際在 Clickhouse 如何執行,對 SQL 的執行時間和資源消耗至關重要。社區版的 Clickhouse 在執行模型和 SQL 優化器上還要改進的空間,尤其是復雜 SQL 以及多 JOIN 的場景下。

執行模型優化

社區版的 Clickhouse 目前還是一個兩階段執行的執行模型。第一階段,Coordinator 在收到查詢后,將請求發送給對應的 Worker 節點。第二階段,Worker 節點完成計算,Coordinator 在收到各 Worker 節點的數據后進行匯聚和處理,并將處理后的結果返回。

圖片

有以下幾個問題:

  1. 第二階段的計算比較復雜時,Coordinator 的節點計算壓力大,容易成為瓶頸。
  2. 不支持 shuffle join,hash join 時右表為大表時構建慢,容易 OOM。
  3. 對復雜查詢的支持不友好。

字節跳動 ClickHouse 團隊為了解決上述問題,改進了執行模型,參考其他的分布式數據庫引擎(例如 Presto 等),將一個復雜的 Query 按數據交換情況切分成多個 Stage,各 Stage 之間則通過 Exchange 完成數據交換。根據 Stage 依賴關系定義拓撲結構,產生 DAG 圖,并根據 DAG 圖調度 Stage。例如兩表 JOIN,會先調度左右表讀取 Stage,之后再調度 JOIN 這個 Stage, JOIN 的 Stage 依賴于左右表的 Stage。

圖片

舉個例子

SELECT 
et.os_name,
ut.device_id AS user_device_id,
dt.hash_did AS device_hashid
FROM tob_apps_all AS et
GLOBAL ANY LEFT JOIN
(
SELECT
device_id,
hash_uid
FROM users_unique_all
WHERE (tea_app_id = 268411) AND (last_active_date >= '2022-08-06')
) AS ut ON et.hash_uid = ut.hash_uid
GLOBAL ANY LEFT JOIN
(
SELECT
device_id,
hash_did
FROM devices_all
WHERE (tea_app_id = 268411) AND (last_active_date >= '2022-08-06')
) AS dt ON et.device_id = dt.device_id
WHERE (tea_app_id = 268411) AND (event = 'app_launch') AND (event_date = '2022-08-06')
LIMIT 10

Stage執行模型基本過程(可能的):

  1. 讀取 tob_apps_all 數據,按照 join key(hash_uid)進行 shuffle,數據分發到每個節點。這是一個Stage。
  2. 讀取 users_unique_all 數據,按照 join key(hash_uid)進行 shuffle,數據分發到每個節點。這是一個 Stage。
  3. 上述兩個表的數據,在每個節點上的數據進行本地JOIN,然后再按照 join key(device_id) 進行 shuffle。這是一個 Stage。
  4. 讀取 devices_all 數據,按照 join key(device_id)進行 shuffle,這是一個Stage。
  5. 第3步、第4步的數據,相同 join key(device_id) 的數據都在同一個節點上,然后進行本地JOIN,這是一個 Stage。
  6. 匯總數據,返回 limit 10 的數據。這是一個 Stage。

統計效果如下:

圖片

查詢優化器

有了上面的 stage 的執行模型,可以靈活調整 SQL 的執行順序,字節跳動 Clickhouse 團隊自研了查詢優化器,根據優化規則(基于規則和代價預估)對 SQL 的執行計劃進行轉換,一個執行計劃經過優化規則后會變成另外一個執行計劃,能夠準確的選擇出一條效率最高的執行路徑,然后構建 Stage 的 DAG 圖,大幅度降低查詢時間。

下圖描述了整個查詢的執行流程,從 SQL parse 到執行期間所有內容全部進行了重新實現(其中紫色模塊),構建了一套完整的且規范的查詢優化器。

圖片

還是上面的三表 JOIN 的例子,可能的一個執行過程是:

  1. 查詢優化器發現 users_unique_all 表與 tob_apps_all 表的分 shard 規則一樣(基于用戶 ID ),所以就不會先對表按 join key 進行 shuffle,users_unique 與 tob_apps 直接基于本地表 JOIN,然后再按照 join key(device_id)進行 shuffle。這是一個 Stage。
  2. 查詢優化器根據規則或者代價預估決定設備表 devices_all 是需要 broadcast join 還是 shuffle join。
  1. 如果 broadcast join:在一個節點查到全部的 device 數據,然后分發到其他節點。這是一個 Stage。
  2. 如果 shuffle join:在每個節點對 device 數據按照 join key(device_id) 進行 shuffle。這是一個 Stage。
  1. 匯總數據,返回 limit 10 的數據。這是一個 Stage。

效果:

可以看到,查詢優化器能優化典型的復雜的 SQL 的執行效率,縮短執行時間。

圖片

4. 總結

ClickHouse 最為擅長的領域是一個大寬表來進行查詢,多表 JOIN 時Clickhouse 性能表現不佳。作為業內領先的用戶分析與運營平臺,火山引擎增長分析 DataFinder 基于海量數據做到了復雜指標能夠秒級查詢。本文介紹了我們是如何優化 Clickhouse JOIN 查詢的。

主要有以下幾個方面:

  1. 減少參與 JOIN 的表以及數據量。
  2. 優先使用本地 JOIN,避免分布式 JOIN 帶來的性能損耗。
  3. 優化本地 JOIN,優先使用內存進行 JOIN。
  4. 優化分布式 JOIN 的執行邏輯,依托于字節跳動對 ClickHouse 的深度定制化。
責任編輯:未麗燕 來源: 字節跳動技術團隊
相關推薦

2022-12-07 08:31:45

ClickHouse并行計算數據

2021-04-14 14:31:37

私有云veStack系統

2021-09-16 10:47:09

數字化

2022-05-13 07:26:28

策略模式設計模式

2022-06-30 09:50:15

火山引擎ByteHouse

2021-08-31 16:17:50

數字化

2023-10-19 14:55:22

火山引擎擁塞控制算法

2021-09-16 14:30:02

數字化

2023-09-15 14:24:54

ByteHouseClickHouse開源

2025-05-20 08:35:00

2022-08-04 18:23:28

屏幕共享卡頓流暢度

2021-11-11 21:35:48

數字化
點贊
收藏

51CTO技術棧公眾號

亚洲影视一区二区| 不用播放器成人网| 国产午夜福利100集发布| 无码国产伦一区二区三区视频 | 日本少妇久久久| 久久久伦理片| 亚洲图片有声小说| 国产一区二区三区免费不卡| 草莓视频18免费观看| 亚洲成av人电影| 亚洲精品动漫100p| 国产又黄又猛的视频| 超碰91在线观看| 国产亚洲精品bt天堂精选| 国产精品一区二区三区免费视频| 玖玖爱免费视频| 一本一道久久a久久| 欧美性xxxxxxxxx| 91成人在线视频观看| 日本高清视频免费观看| 韩国成人精品a∨在线观看| 韩国国内大量揄拍精品视频| 国精品人伦一区二区三区蜜桃| 99a精品视频在线观看| 欧美日韩国产综合草草| 欧美日韩激情视频在线观看| 黄网站app在线观看| 99亚偷拍自图区亚洲| 国产欧美精品xxxx另类| 国产成人一级片| 激情久久中文字幕| 日韩在线视频播放| 欧美图片一区二区| 午夜久久av| 7777精品伊人久久久大香线蕉最新版| 浮妇高潮喷白浆视频| 伊人手机在线| 亚洲人精品一区| 亚洲最新在线| 高清性色生活片在线观看| aaa亚洲精品| 99se婷婷在线视频观看| 国产毛片久久久久| 精品一二三四区| 国产精品网址在线| 最近中文字幕免费观看| 亚洲中字黄色| 午夜美女久久久久爽久久| 婷婷社区五月天| 99久久国产综合精品成人影院| 一区二区三区动漫| 日本丰满少妇裸体自慰| 欧美日韩一区二区三区四区不卡| 精品久久人人做人人爰| 亚洲乱妇老熟女爽到高潮的片 | 国产欧美日韩一区二区三区| 国产三级第一页| 国产精品影视天天线| 91精品久久久久久久久青青 | 波多野结衣家庭教师| 国产精品久久久久无码av| 中文国产亚洲喷潮| 欧美午夜激情影院| 久久亚洲成人| 日韩亚洲欧美成人| 亚洲一二三精品| 我不卡影院28| 色综合男人天堂| 国产无遮挡裸体免费视频| 亚洲福利国产| 日本伊人精品一区二区三区介绍| 国产精品xxxxxx| 韩国v欧美v日本v亚洲v| 97人摸人人澡人人人超一碰| 日本成人动漫在线观看| 久久久久久久久久久久久久久99| 日本一区美女| 菠萝蜜视频国产在线播放| 亚洲精品国产无天堂网2021 | 欧洲亚洲一区二区| 国产在线中文字幕| 亚洲丝袜精品丝袜在线| 中文字幕精品在线播放| av漫画网站在线观看| 欧美性感美女h网站在线观看免费| 熟妇人妻无乱码中文字幕真矢织江| 另类一区二区| 亚洲成人激情在线| 国产jk精品白丝av在线观看| 亚洲精品国产成人影院| 性色av一区二区三区红粉影视| 日本少妇毛茸茸高潮| 日韩国产欧美在线视频| 99re6热在线精品视频播放速度| 无码国产精品96久久久久| 国产精品色哟哟| 欧美无砖专区免费| 欧美日韩五码| 欧美va在线播放| 中文字幕人妻一区二区三区| 国产精品一区二区99| 按摩亚洲人久久| 国产成人亚洲精品自产在线 | 97自拍视频| 日本精品一区二区在线观看| 中文字幕精品一区| 97在线国产视频| 两个人看的在线视频www| 欧美日韩国产综合久久| 国产精品无码永久免费不卡| 在线看片不卡| 国产精品久久久久7777婷婷| 国产综合视频在线| 中文字幕日韩av资源站| 精品少妇人妻av免费久久洗澡| 亚洲狼人综合| 亚洲精品大尺度| 神马午夜精品91| 三级在线观看一区二区| 国产高清在线精品一区二区三区| 大地资源中文在线观看免费版| 亚洲第一av色| 久久久久久久久久毛片| 一本色道久久综合狠狠躁的番外| 久久影视电视剧免费网站清宫辞电视| 国产在线观看99| 日韩av在线发布| 九九99久久| 乱人伦中文视频在线| 色嗨嗨av一区二区三区| 日韩Av无码精品| 欧美777四色影| 日韩美女视频免费在线观看| 熟妇人妻系列aⅴ无码专区友真希| 自拍偷在线精品自拍偷无码专区| 国产三级日本三级在线播放| 亚洲天堂日韩在线| 日韩在线视频二区| 亚洲视频在线免费播放| 日本一区二区成人| 成人免费观看视频在线观看| 亚洲人成亚洲精品| 热久久这里只有精品| av女名字大全列表| 精品国产乱码久久久久久虫虫漫画 | 精品国产丝袜高跟鞋| 欧美日韩国产美女| 日韩精品久久久久久久的张开腿让| 久久久蜜桃一区二区人| 5566中文字幕一区二区| 在线免费观看污| 日韩免费视频一区| 久久久久久免费观看| 国产一区二区三区在线观看免费视频 | 亚洲xxx在线| 亚洲精选视频免费看| 少妇性l交大片7724com| 欧美区一区二| 国产精品有限公司| www在线看| 亚洲韩国青草视频| 欧美精品一二三四区| 国产视频一区在线观看| 日韩在线综合网| 精品国产午夜| 成人福利网站在线观看| 尤物视频在线看| 亚洲精品久久久久| 色网站在线播放| 国产肉丝袜一区二区| 91高清国产视频| 午夜精品免费| 久久久久久久久久久久久久久久av| 丝袜在线观看| 丝袜亚洲另类欧美综合| 午夜精品久久久久久| 欧美熟妇精品一区二区| 99精品欧美| 国产精品视频入口| 婷婷午夜社区一区| 一区二区欧美亚洲| 亚洲av少妇一区二区在线观看| 五月婷婷欧美视频| 天天舔天天操天天干| 国产精品亚洲专一区二区三区| 日韩视频免费播放| 精品理论电影| 亚洲资源在线看| 最近高清中文在线字幕在线观看1| 在线视频欧美日韩精品| 日本免费精品视频| 亚洲欧美日本韩国| 一级黄色片国产| 亚洲精品偷拍| 永久免费精品视频网站| 久久精品亚洲成在人线av网址| 国产成人综合精品| 国产中文字幕在线观看| 日韩欧美www| 五月激情丁香网| 亚洲少妇中出一区| 日韩精品无码一区二区三区久久久 | 26uuu亚洲婷婷狠狠天堂| 日日鲁鲁鲁夜夜爽爽狠狠视频97 | 另类专区欧美制服同性| 三级在线电影| 日韩女优制服丝袜电影| 最近中文字幕免费在线观看| 精品国产精品三级精品av网址| 翔田千里88av中文字幕| 久久久久成人黄色影片| 99riav国产精品视频| 美女脱光内衣内裤视频久久影院| 妞干网在线视频观看| 精品国产91乱码一区二区三区四区 | mm131国产精品| 亚洲国产一区二区三区a毛片 | av网站免费在线看| 成人亚洲一区二区一| 中文字幕永久有效| 性8sex亚洲区入口| eeuss中文| 亚洲另类春色校园小说| 成人亲热视频网站| 超薄肉色丝袜脚交一区二区| 国内精品在线一区| 国产写真视频在线观看| 伊人久久久久久久久久| 日韩大片b站免费观看直播| 亚洲精品在线观| 亚洲国产视频一区二区三区| 欧美精品乱码久久久久久按摩| 男女视频免费看| 一区二区三区在线影院| 人妻人人澡人人添人人爽| 久久先锋影音av| 色婷婷狠狠18禁久久| 国产美女娇喘av呻吟久久| 992kp快乐看片永久免费网址| 免费日韩精品中文字幕视频在线| 欧美一级免费播放| 黄色日韩精品| 欧美男女爱爱视频| 影音先锋亚洲一区| 欧美又粗又长又爽做受| 欧美精品网站| 色噜噜国产精品视频一区二区 | 人与动物性xxxx| 99久久婷婷国产综合精品| 熟女人妻一区二区三区免费看| 蜜臀a∨国产成人精品| 国产理论在线播放| 蜜臀91精品一区二区三区| 污色网站在线观看| 开心九九激情九九欧美日韩精美视频电影 | 亚乱亚乱亚洲乱妇| 色噜噜狠狠狠综合曰曰曰| 欧美午夜电影一区二区三区| 中文字幕综合在线| 免费网站看v片在线a| 久久天天躁狠狠躁夜夜av| 精品欧美色视频网站在线观看| 欧美精品一区二区免费| 香蕉成人app免费看片| 欧美精品www| 忘忧草在线日韩www影院| 日韩av电影免费观看高清| 电影一区电影二区| 91在线国产电影| 亚洲国产高清在线观看| 51国产成人精品午夜福中文下载| 成人精品毛片| 久久久www免费人成黑人精品| 色婷婷狠狠五月综合天色拍| 欧美三级中文字幕在线观看| 小日子的在线观看免费第8集| 国产伦精品一区二区三区视频青涩| 日本xxxx黄色| 国产福利一区二区| 天天摸天天舔天天操| 黄页网站大全一区二区| 四虎永久免费观看| 亚洲国产精品av| 青青草原在线免费观看| 亚洲视频免费在线观看| www.毛片.com| 欧美日韩免费观看一区二区三区| 亚洲av无码国产精品永久一区| 日韩国产激情在线| 毛片在线看片| 5252色成人免费视频| 亚洲天堂电影| 51精品国产人成在线观看| 综合伊思人在钱三区| 国产一二三四五| 国产精品永久| 少妇高潮一69aⅹ| 国产视频一区二区在线| 欧美 日韩 国产 一区二区三区| 亚洲国产欧美在线| 丁香社区五月天| 欧美videofree性高清杂交| av在线免费一区| 最近2019中文免费高清视频观看www99 | 亚洲人成网7777777国产| 91亚洲天堂| 国产精品三级久久久久久电影| 91成人噜噜噜在线播放| 亚洲国产精品一区二区第一页 | 8050国产精品久久久久久| 秋霞国产精品| 国外成人在线视频网站| 国产精品久久久久久| 日本精品一区在线观看| 国产成人精品影院| 国产又粗又猛又爽又黄的视频四季| 亚洲欧美区自拍先锋| 亚洲天堂网视频| 国产亚洲精品久久久久久| 成年人国产在线观看| 91视频88av| 成人一区不卡| 国产成人精品无码播放| 成人成人成人在线视频| 清纯粉嫩极品夜夜嗨av| 91精品国产综合久久久久久漫画 | 久久精品99国产| aaa亚洲精品一二三区| 国产精品成人网站| 欧美在线观看一二区| 天堂a√中文在线| 国内精品400部情侣激情| 久久久久黄色| 亚洲精品成人久久久998| 日韩精品成人一区二区在线| 精品国产免费久久久久久婷婷| 亚洲人成在线播放网站岛国| 一级黄色片视频| 中文字幕在线看视频国产欧美在线看完整 | 911福利视频| 国产精品色呦呦| 一二三四区视频| 日韩亚洲第一页| 成人av色网站| 在线观看欧美激情| 精品一区二区三区免费播放 | 亚洲精品v日韩精品| 国产成人精品一区二三区四区五区| 久久精品美女视频网站 | 国产麻豆日韩| 亚洲精选91| 精品无码在线视频| 欧美性xxxx极品hd满灌| 久久久久久久久亚洲精品| 欧美一区二区三区精品电影| 怕怕欧美视频免费大全| 各处沟厕大尺度偷拍女厕嘘嘘| www国产精品av| 无码任你躁久久久久久久| 亚洲韩国青草视频| 日韩久久一区二区三区| 日韩在线三区| 日本成人在线视频网站| 国产精品精品软件男同| 欧美成人三级电影在线| sis001亚洲原创区| 成人91视频| 亚洲综合国产| 极品蜜桃臀肥臀-x88av| 777色狠狠一区二区三区| 黄色羞羞视频在线观看| 91入口在线观看| 午夜国产欧美理论在线播放| 亚洲av永久无码精品| 欧美性色xo影院| 91精彩在线视频| 99在线看视频| 日韩高清国产一区在线| 污污的视频在线免费观看| 337p日本欧洲亚洲大胆精品| 午夜无码国产理论在线| 日韩视频在线免费播放| 成人av综合在线| 91麻豆精品在线| 久久人人爽人人爽人人片亚洲| 久久精品66| 中文字幕第88页| 亚洲精品成人a在线观看| 嫩草影院一区二区| 日本精品久久久久影院| 91久久高清国语自产拍| 又黄又色的网站| 欧美色精品在线视频| 在线观看三级视频| 久久精品美女| 国产精品一二三四区| 怡红院av久久久久久久| 欧美国产精品va在线观看| av一区二区在线观看| 一边摸一边做爽的视频17国产|