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

解析 Greenplum 數據庫的排序算法

開發 前端
標準快速排序在處理字符串的時候,平均時間復雜度是 N*logN,當字符串擁有相同的前綴時,快速排序仍然需要花費大量的時間去比較這些字符串的相同前綴,而多鍵排序避免了對前綴的重復比較,只使用必要的非前綴字符確定排序。

Sort 節點概覽

排序的樸素含義是將一個數據集按照某種特定的排序方式進行排列的算法,最常見的排列方式是數值順序和字典序。

排序算法的應用非常廣泛,主要分為了兩類:

  • 內排序:在內存中完成的排序,常見的有插入排序、快速排序、堆排序、基數排序等
  • 外排序:數據集過大,內存中無法全部存放,需要借助外存的排序,常見的有歸并排序的各種變形

gpdb 的排序節點會根據查詢計劃中的排序鍵對指定的元組進行排序,根據排序的數據量和其他的一些性質,gpdb 會選擇不同的排序算法:

  • 如果排序節點的工作內存可以容納所有的元組時,排序節點使用快速排序或者堆排序
  • 堆排序主要用于 TopK 查詢,即只需要輸出排序后元組的前 K 個,例如 Sort 節點之上還存在 Limit 節點

如果工作內存無法容納所有的元組,則使用基于歸并排序的外排序算法。

排序節點除了本身對元組排序的功能外,在 gpdb 中的應用也廣泛,查詢優化器還會根據代價選擇基于排序的聚集節點 Group Agg 和連接節點 Merge Join。

此外,Group By,Distinct 等 sql 關鍵字也和排序息息相關。

TupleSort

TupleSort 是 gpdb 各種排序功能的底層實現,各種需要排序的模塊都會使用調用 TupleSort 對元組進行排序。
TupleSort 使用的排序算法如下所示:

排序算法

狀態描述

快速排序

元組集合沒有超過內存容量

堆排序

元組集合沒有超過內存容量,并且是 TopK 查詢

歸并排序(替換選擇+多階段歸并)

元組集合大小超過內存容量

其中快速排序和堆排序都是標準的內存排序算法。

快速排序

快速排序(Quick Sort)是最常見的內存排序算法,由 Tony Hoare 在 1959 年發明。

快速排序的三個步驟:

挑選基準值,從數據集中挑選出一個基準元素,一般稱為 Pivot

分割:將所有比 pivot 小的數據放到 pivot 之前,將所有比 pivot 大的數據放到 pivot 之后

遞歸子序列:遞歸的將小于 pivot 的子序列大于 pivot 的子序列分別進行排序

圖片


圖片

gpdb 中對于快速排序的實現如下:

代碼位置:https://github.com/greenplum-db/gpdb/blob/main/src/backend/utils/sort/gen_qsort_tuple.pl

圖片

堆排序

堆排序也是內存中一種常用的排序算法,堆是一種完全二叉樹

最大堆:對于每個節點,其值大于左右子節點的值

最小堆:對于每個節點,其值小于左右子節點的值

圖片


堆排序算法:

建立最大堆,數組中的最大元素在堆頂

取出堆頂元素,插入到數組中,更新堆

重復第二步,直到堆大小為 0

原始的數組的排列:

圖片

開始建堆:

圖片

進行排序:

圖片

gpdb 中也有對堆排序的實現:

代碼位置:https://github.com/greenplum-db/gpdb/blob/main/src/backend/utils/sort/tuplesort.c#L3525

圖片

外部歸并排序

基于外存的歸并排序主要分為了兩個階段:

  • 分割階段:將原始待排序數據分成若干個順串
  • 合并階段:將所有的小順串合并為包含所有數據的大順串

順串的定義:由于要排序的數據集過大,無法全部在內存中排序,因此只能選擇部分數據在內存中排序,將排好序的部分數據稱為順串

圖片


替換選擇算法

分割階段可以線性掃描一遍數據,當達到內存大小閾值的時候,在內存中排序,生成一個順串。然后再重復的取出原始數據到內存中排序,生成順串,直到原始數據被取完。

這樣生成的順串大小,實際上不會超過內存的大小。如果順串越小,在合并的時候,讀取外存的次數就越多,我們的排序算法的效率就越低。

所以,如何在分割階段 ,盡量生成盡可能大于內存容量的順串,減少合并階段讀取外存的數量?

可以使用替換選擇算法,替換選擇算法借鑒的是掃雪機模型。

想象有一個環形的跑道,跑道上有積雪,假設最開始時積雪的高度為 h,掃雪機不停地向前鏟雪,同時也有新的雪落在跑道上,新的雪一部分落在了掃雪機的前面,一部分落在了掃雪機的后面。假設雪下的速度和掃雪機鏟雪的速度一致,掃雪機掃了一圈之后,掃雪機前面的高度仍然為 h,后面的高度是 0,這樣就達到了一個動態的平衡。

掃雪機前方和后面的積雪就是一個從 0 - h 的斜坡,也就是說路面積雪量就是下圖中直角三角形的面積,并且可以計算出掃雪機鏟雪的量就是這個三角形的兩倍。

圖片


類比掃雪機模型,跑道上的積雪就是替換選擇算法使用的堆,積雪的量就是內存的大小。

輸出當前最小值,生成順串的過程就是鏟雪的過程。順串的大小就是鏟雪量。

新落下的雪就是新的輸入數據,由于輸入隨機,如果輸入大于等于剛輸出的元素,則被加入到堆中,即被掃雪車清除。如果輸入小于剛輸出的元素,則相當于新雪下在了掃雪車的后方,本次鏟雪(順串)不包含該元素。

因此,順串的長度就是鏟雪量,也就是內存大小(跑道上的積雪)的兩倍。

基于此,替換選擇算法的大致過程如下:

  • 初始化階段,將元組讀取到內存中,并根據排序鍵建立最小堆
  • 取出堆頂元組,寫到順串文件的緩沖區,并記錄這個元組的排序鍵是 lastkey
  • 讀取新的元組,如果排序鍵大于 lastkey,則插入到堆中,重新調整堆的順序
  • 如果新元組的排序鍵小于 lastkey,則插入到堆的末尾,并將堆的大小減一
  • 重復第二步,直至堆的大小變為 0
  • 然后重新建堆,再取出新的元組,重復第二步,生成下一個順串

順串合并
假設順串分布在 K 個文件中,如何高效的比較 K 個文件中的最小值,并將其輸出到外部文件中?
敗者樹算法
輸入每個順串的第一個記錄作為敗者樹的葉子節點,建立初始化敗者樹。

兩兩相比較,父親節點存儲了兩個子節點比較的敗者(節點較大的值);勝利者 (較小者)可以參與更高層的比賽。這樣樹的頂端就是當次比較的冠軍(最小者)

調整敗者樹,當我們把最小者輸入到輸出文件以后,需要從相應的順串取出 一個記錄補上去。補回來的時候,我們就需要調整敗者樹,我們只需要沿著當前 節點的父親節點一直比較到頂端。比較的規則是與父親節點比較,勝者可以參與更高層的比較,一直向上,直到根節點。失敗者留在當前節點。

第一次比較:

圖片


第二次比較:

圖片


合并階段如何減少磁盤讀取次數

多路歸并

兩路歸并,使用兩個輸入文件和兩個輸出文件,每次歸并,順串的長度翻倍,并存儲到輸出文件中。下次歸并,輸出緩沖區和輸出緩沖區的位置互換。

下面是一個兩路歸并的例子,每個輸入文件在初始狀態下有 32 個順串,每次歸并,順串的長度翻倍。

圖片


這樣歸并之后,IO 次數是 64 * 6 = 384 次,每個順串移動了 6 次,有沒有什么更好的辦法,可以使順串的移動次數更少?

多相歸并

Knuth 5.4.2 D 多相歸并排序算法。

初始化階段,N+1 個緩沖區,其中 N 個輸入緩沖區,1 個輸出緩沖區,每一個輸入緩沖區包含若干個順串。

從每個輸入緩沖區選取開頭的順串,組成 N 個順串,并對其進行歸并排序,排序結果寫入輸出緩沖區。此時每個輸入緩沖區順串數減 1,輸出緩沖區順串數加 1。

如果任何一個輸入緩沖區的順串數都大于 0,重復第二步

如果所有緩沖區的順串數和大于 1,選擇順串數為 0 的輸入緩沖區作為新的輸出緩沖區,重復第二步

如果所有緩沖區的順串數和為 1,那么這個順串就是排序好的數據集,算法結束

圖片

TupleSort 代碼邏輯

TupleSort 是排序節點的核心,算法主要分為了四個階段:
第一階段
初始化 TupleSort,調用函數 tuplesort_begin_common,生成 Tuplesortstate,Tuplesortstate 用于描述排序的狀態等信息。
其中 status 字段表示當前狀態機的信息

狀態

狀態描述

TSS_INITIAL

未超出工作內存限制,使用內存數組存儲排序元組

TSS_BOUNDED

觸發TopK排序,使用最小值堆存儲待排序元組

TSS_BUILDRUNS

超出工作內存,使用文件存儲待排序元組

TSS_SORTEDINMEM

基于內排序,元組排序完成

TSS_SORTEDONTAPE

外排序完成,排序后元組存儲在文件中

TSS_FINALMERGE

外排序還差最后一步歸并

狀態轉換圖:

圖片


TupleSortstate 中其他的一些重要字段:

類型

字段

說明

TupSortStatus

status

TupleSort狀態機當前狀態

int

nKeys

排序鍵的個數

bool

randomAccess

排序后的元組是否需要隨機訪問,比如反向讀取

bool

bounded

是否是TopK查詢

int

bound

TopK查詢中K的值

int64

availMem

節點目前可用內存

int64

allowedMem

節點工作內存

int

maxTapes

總緩沖區個數

int

tapeRange

輸入緩沖區個數

第二階段
插入元組,每次調用函數 puttuple_common,根據當前 TupleSortstate 的狀態,將元組插入到不同的位置

  • 對于 TSS_INITIAL 狀態,會將元組存儲到內存的 memtuples 中,如果滿足 TopK 的排序條件,會轉為堆排序算法,狀態切換為 TSS_BOUNDED
  • TSS_BOUNDED 狀態:插入到堆中
  • TSS_BUILDRUNS 狀態:外排序算法,基于替換選擇算法,如果元組大于等于堆頂元組,插入當前元組到堆,否則是其他的順串,將其放到 memtuples 末尾

第三階段
調用 tuplesort_performsort 執行實際的排序操作,仍然根據狀態機,選擇不同的排序策略。

  • TSS_INITIAL:所有數據都在內存中,直接執行快速排序,結束后將狀態設置為 TSS_SORTEDINMEM
  • TSS_BOUNDED:所有數據仍然在內存中,執行堆排序,結束后將狀態設置為 TSS_SORTEDINMEM
  • TSS_BUILDRUNS:執行多相歸并排序,函數 mergeruns 負責對順串進行歸并

第四階段
負責輸出排序后的元組,在排序完成后,每次調用 tuplesort_gettuple_common 獲取排序后的元組。
還是會根據不同的狀態選擇不同的策略。

  • TSS_SORTEDINMEM:元組是在內存中排序的,元組本身也在內存中,直接從 memtuples 中獲取即可
  • TSS_SORTEDONTAPE:元組通過歸并排序完成,存儲在外部文件中,因此元組需要從文件中讀取
  • TSS_FINALMERGE:元組存儲在文件中,每個文件有且僅有一個順串,在輸出元組的時候需要進行合并

單鍵排序

gpdb 的排序支持單鍵和多鍵排序兩種,其中單鍵排序基于 TupleSort 接口,多鍵排序基于 TupleSort_mk 接口,排序節點也是標準的執行器三部曲 ExecInitSort、ExecSort、ExecEndSort,但是由于 TupleSort 和 TupleSort_mk 已經封裝了完善的排序邏輯,因此三部曲的邏輯就比較簡單了。

ExecInitSort

初始化的時候,調用 ExecInitSort 方法,主要負責初始化 SortState 結構體。

類型

字段

說明

ScanState

ss

查詢狀態信息

bool

randomAccess

排序后的元組是否需要隨機訪問

bool

bounded

是否是TopK查詢

int64

bound

TopK查詢中K的值

bool

sort_Done

排序步驟是否完成

GenericTupStore*

tuplesortstate

根據排序算法類型,指向Tuplesortstate或者Tuplesortstate_mk

bool

delayEagerFree

某個Segment的排序節點輸出最后一條元組后是否可以提前釋放內存


ExecSort

ExecSort 負責傳遞元組給下層節點排序,并將排好序的數據返回給上層節點。
ExecSort 的第一次調用會讀取所有的元組并傳遞給 TupleSort 排序。

/*
* Scan the subplan and feed all the tuples to tuplesort.
*/

for (;;)
{
slot = ExecProcNode(outerNode);

if (TupIsNull(slot))
break;

tuplesort_puttupleslot(tuplesortstate, slot);
}

SIMPLE_FAULT_INJECTOR("execsort_before_sorting");

/*
* Complete the sort.
*/
tuplesort_performsort(tuplesortstate);

后續每次調用 ExecSort,都會返回排序后的元組。

SO1_printf("ExecSort: %s\n",
"retrieving tuple from tuplesort");

/*
* Get the first or next tuple from tuplesort. Returns NULL if no more
* tuples. Note that we only rely on slot tuple remaining valid until the
* next fetch from the tuplesort.
*/
slot = node->ss.ps.ps_ResultTupleSlot;
(void) tuplesort_gettupleslot(tuplesortstate,
ScanDirectionIsForward(dir),
false, slot, NULL);


ExecEndSort

ExecEndSort 的邏輯比較簡單,主要就是清理掃描和排序結果,以及清理外排序的臨時文件。

/* clean out the tuple table */
ExecClearTuple(node->ss.ss_ScanTupleSlot);

/* must drop pointer to sort result tuple */
ExecClearTuple(node->ss.ps.ps_ResultTupleSlot);

if (node->tuplesortstate != NULL)
{
/*
* Save stats like in ExecSortExplainEnd, so that we can display
* them later in EXPLAIN ANALYZE.
*/
tuplesort_finalize_stats(node->tuplesortstate,
&node->sortstats);
if (node->ss.ps.instrument)
{
node->ss.ps.instrument->workfileCreated = (node->sortstats.spaceType == SORT_SPACE_TYPE_DISK);
node->ss.ps.instrument->workmemused = node->sortstats.workmemused;
node->ss.ps.instrument->execmemused = node->sortstats.execmemused;
}

tuplesort_end((Tuplesortstate *) node->tuplesortstate);
node->tuplesortstate = NULL;
}


多鍵排序

gpdb 中特有的排序方式,針對具有相同前綴的字符串排序的優化。

多鍵排序算法又被稱為三路基數排序,融合了快速排序和基數排序的排序算法,主要的優勢在于對具有相同前綴的字符串進行更高效的排序。

多鍵排序的流程和單鍵排序的三部曲類似,但底層基于 TupleSort_mk 接口。

標準快速排序在處理字符串的時候,平均時間復雜度是 N*logN,當字符串擁有相同的前綴時,快速排序仍然需要花費大量的時間去比較這些字符串的相同前綴,而多鍵排序避免了對前綴的重復比較,只使用必要的非前綴字符確定排序。

在現實世界中,具有相同前綴的字符串的場景還是很多的,例如很多的 URL 都以 http:// 開頭,每個具體的站點都有自己特定的前綴,例如 https://www.baidu.com。

下面是一個多鍵排序的示例:

圖片


注意:從 postgres12 開始,已經自帶了多鍵排序,因此目前 gpdb 當中已經刪除了對應的 tuplesort_mk 的邏輯。

責任編輯:武曉燕 來源: roseduan寫字的地方
相關推薦

2011-08-22 09:55:30

SQL Server 排序

2021-01-08 05:27:49

數據庫拉鏈表存儲

2011-03-07 15:54:30

2011-03-17 17:06:38

數據庫發展方向

2011-08-02 15:04:49

2010-07-01 11:14:36

SQL Server

2023-09-26 22:22:30

選擇排序Python

2009-08-11 17:30:46

2010-05-13 14:14:45

2009-10-29 17:03:42

2010-04-06 11:30:09

Oracle 數據庫

2011-04-02 14:38:42

SQL數據庫算法

2010-05-11 18:14:52

Mysql數據庫編碼

2022-01-08 20:03:20

數據庫特點架構

2009-06-30 15:02:41

磁盤排序Oracle數據庫性能

2010-07-21 10:27:49

SQL Server

2010-06-18 12:45:20

SQL Server數

2011-05-24 13:06:14

數據庫設計敏捷

2011-03-02 17:09:20

2011-08-22 16:08:46

IOS開發數據庫
點贊
收藏

51CTO技術棧公眾號

欧美性x x x| 成人福利电影精品一区二区在线观看| 久久伊99综合婷婷久久伊| 国产一区二区三区三区在线观看| 亚洲精品日韩av| 自拍视频一区二区| 免费黄网在线观看| 亚洲国产国产| 亚洲国产成人porn| 91探花福利精品国产自产在线| 精品人妻少妇嫩草av无码| 妞干网在线观看视频| 午夜诱惑痒痒网| 国产偷拍一区二区| 精品香蕉视频| 欧美日韩国产精品一区二区三区四区 | 免费看一级大黄情大片| 国产色在线视频| 一区二区福利| 亚洲国产精品小视频| 女女百合国产免费网站| 国产一区二区在线视频聊天 | 亚洲成人教育av| 中文字幕av久久| 国产精品无码免费播放| 91麻豆精品国产91久久久平台| 色综合色综合色综合色综合色综合| 成人av资源网| 国产一级中文字幕| 在线综合色站| 亚洲免费在线观看| 91九色国产在线| 日韩人妻精品中文字幕| 沈樵精品国产成av片| 色妹子一区二区| 日本高清视频一区二区三区| av毛片在线免费观看| www.久久国产| 免费在线毛片网站| 久久久99精品免费观看| 热99在线视频| 欧美 日本 国产| 午夜欧美巨大性欧美巨大| 91在线观看一区二区| 26uuu久久噜噜噜噜| 国产黄色网址在线观看| 东京久久高清| 色综合久久综合| 成人性免费视频| 欧美人与牲禽动交com| 国产精选一区二区三区| 国模私拍视频一区| 中文字幕免费高清| 色999久久久精品人人澡69| 综合分类小说区另类春色亚洲小说欧美| 91久久中文字幕| 在线观看国产精品入口男同| 久久精品青草| 亚洲成人av片| 国产免费无码一区二区| 在线观看爽视频| 一区二区中文字幕在线| 亚洲精品一区二| 亚洲成人精品女人久久久| 免费久久99精品国产自在现线| 中日韩美女免费视频网址在线观看 | 亚洲电影成人| 亚洲美女视频网| 免费看污污网站| 国产网红在线观看| 国产精品视频线看| 国产视频精品网| 亚洲一区中文字幕永久在线| 久久精品国产77777蜜臀| 久久人人爽人人| 日韩 欧美 综合| 国产日产一区 | 一级片视频免费观看| 啦啦啦中文在线观看日本| 亚洲一区在线视频观看| 视频一区二区三| 少妇人妻偷人精品一区二区| 久久国产麻豆精品| 久久免费视频观看| 久久久久久久福利| 99久久久久| 亚洲一级片在线看| 91n在线视频| 天堂一区二区三区四区| 在线国产成人影院| 国产欧美1区2区3区| 99国精产品一二二线| 免费av网站观看| 久久激五月天综合精品| 亚洲专区在线视频| 婷婷开心激情网| 国产欧美日韩卡一| 无码人妻精品一区二区三区99v| 久久国产精品高清一区二区三区| 国产成人午夜电影网| 国产精品久久久亚洲| 成人毛片18女人毛片| 日韩电影在线观看一区| 午夜精品久久久久久久99热| 九九热精品免费视频| 亚洲不卡av不卡一区二区| 久久久久久中文| 久久久一区二区三区四区| 美女网站久久| 国产suv精品一区二区三区88区| 国产精品7777777| 麻豆精品在线播放| 久久99久久99精品蜜柚传媒| 亚洲av成人精品毛片| 成人禁用看黄a在线| 色视频一区二区三区| 国产理论电影在线| 欧美精品在线观看一区二区| 婷婷激情四射五月天| 亚洲精品一区二区三区在线| 在线成人免费网站| 特黄一区二区三区| 免费看污污网站| 国产免费不卡| 福利微拍一区二区| 久久综合在线观看| 国产精品一区二区精品| 欧美人伦禁忌dvd放荡欲情| 中文字幕天天干| 欧美wwwsss9999| 亚洲欧美日韩天堂| 五月天婷婷网站| 性色一区二区三区| 成人女人免费毛片| 婷婷五月综合久久中文字幕| 亚洲色图都市小说| 成人性生活视频免费看| 激情综合五月| 精品播放一区二区| 亚洲天堂网一区二区| 红桃视频国产一区| 日本午夜精品理论片a级appf发布| www.黄色av| 久久综合九色综合欧美亚洲| 国内自拍中文字幕| www.久久草.com| 日韩欧美国产三级电影视频| 欧美肉大捧一进一出免费视频| 日韩aaa久久蜜桃av| 欧美激情第一页xxx| 4438国产精品一区二区| av激情亚洲男人天堂| 亚洲二区三区四区| 九九热线视频只有这里最精品| 精品在线小视频| 一起操在线播放| 久久99精品久久久| 欧美性视频在线播放| 四虎国产精品成人免费影视| 日韩在线高清视频| 日本熟妇色xxxxx日本免费看| 国产白丝精品91爽爽久久| 欧美成人一区二区在线| 国产视频一区二区| 一本大道久久a久久综合婷婷| 中文字幕在线观看的网站| 日韩午夜精品| 日韩aⅴ视频一区二区三区| av网站在线看| 91久久久免费一区二区| 亚洲午夜精品久久久久久高潮| 欧美三级网页| 国产免费成人av| 天天干天天做天天操| 亚洲成人av一区二区三区| 91最新在线免费观看| 97超碰在线资源| 91精品福利| 91亚色免费| 天堂а√在线官网| 欧美日韩色婷婷| 亚洲av无码一区二区三区人 | 欧美日韩在线成人| 日韩视频一二区| 伊人亚洲福利一区二区三区| 亚洲中文一区二区三区| 一个色妞综合视频在线观看| 99re精彩视频| 欧美激情成人在线| 国产精品最新在线观看| 色操视频在线| 日韩一区二区三区高清免费看看| 在线观看日本中文字幕| 久久99九九99精品| 国产精品999视频| 午夜日韩影院| 日韩av手机在线| 91麻豆免费在线视频| 日韩精品中文字幕在线播放| 91亚洲国产成人精品一区| 亚洲成av人综合在线观看| 久久发布国产伦子伦精品| 国产精品久久777777毛茸茸| 国产精品.com| 国精产品一区一区三区四川| 九九精品在线视频| av网站免费大全| 亚洲精品亚洲人成人网在线播放| 色婷婷精品久久二区二区密| 蜜桃视频一区二区三区在线观看| 欧美一区二区三区四区五区六区| 亚洲国产天堂| 日本欧美精品在线| 欧美hdxxx| 久久久精品日本| 国产喷水福利在线视频| 欧美日韩中文字幕日韩欧美| 中文字幕丰满孑伦无码专区| 国产在线一区二区综合免费视频| 超碰在线免费观看97| 亚洲素人在线| 国产 高清 精品 在线 a | 在线精品国精品国产尤物884a| 中文字幕狠狠干| 国产成人亚洲精品青草天美| 亚洲一区二区三区四区五区xx| 日本不卡电影| 成人欧美在线观看| 天堂va在线| 精品国产一区二区三区久久久狼| 精品久久久久一区二区三区 | 免费人成在线观看网站| 色av一区二区| 狠狠躁夜夜躁人人爽天天高潮| 亚洲激情综合网| 屁屁影院国产第一页| 国产酒店精品激情| 亚洲综合123| 精品一二三四在线| 99在线免费视频观看| 欧美日韩导航| 国产嫩草一区二区三区在线观看| 午夜精品在线| 高清视频一区| 91精品国产乱码久久久竹菊| 51国产成人精品午夜福中文下载| 高清久久一区| 亚洲永久免费观看| 美女久久精品| 俄罗斯精品一区二区三区| 亚洲视频国产| 国产精品对白刺激久久久| 亚洲一二av| 国产在线资源一区| 国产在线播放精品| 久久精品欧美| 国内精品久久久久久久影视简单| 日本一区高清在线视频| 日本精品黄色| 成人短视频在线看| p色视频免费在线观看| 国产探花一区二区| 成人国产一区二区| 91成人噜噜噜在线播放| 国产精品免费一区二区三区在线观看 | 日本韩国欧美在线观看| 亚洲一区免费| 校园春色 亚洲色图| 韩日av一区二区| 黑人无套内谢中国美女| 成人黄色一级视频| 精品少妇一区二区三区免费观| 久久九九99视频| 你懂得在线观看| 亚洲午夜激情网站| 久久精品国产成人av| 中文字幕一区二区三| 中文字幕天堂av| 久久99热狠狠色一区二区| 日韩精品aaa| 成人污视频在线观看| 日韩av一卡二卡三卡| 日日骚欧美日韩| 日韩成人av免费| 成人av免费在线观看| 精品少妇人妻一区二区黑料社区| 国产精品水嫩水嫩| 久久精品国产亚洲AV熟女| 欧美韩日一区二区三区四区| 丝袜美腿小色网| 中文字幕在线不卡| 久久久精品国产sm调教网站| 色综合久久中文字幕| 国产又粗又猛又色又| 亚洲福利视频网| yjizz视频网站在线播放| 久久69精品久久久久久久电影好| 乱人伦视频在线| 97视频在线观看视频免费视频 | 青青青在线免费观看| 亚洲电影一区二区三区| 国产成人av免费| 色综合天天性综合| 午夜久久久久久久久久| 国产一区二区激情| 大桥未久在线视频| 午夜精品一区二区三区在线视| 亚洲成人不卡| 99在线视频首页| 波多野结衣在线播放一区| www.日本三级| 亚洲视频久久| jizzzz日本| 久久亚洲综合色一区二区三区| 欧美xxxx精品| 亚洲欧美自拍偷拍色图| 国产做受高潮漫动| 91精品国产高清一区二区三区| 中文字幕久久久久| 欧美怡红院视频| 亚洲网站免费观看| 亚洲欧美日韩精品| 阿v视频在线| 99中文视频在线| 综合在线视频| 日韩精品福利片午夜免费观看| 免费精品视频在线| 久久精品国产亚洲av久| 亚欧色一区w666天堂| 精品国产av 无码一区二区三区| 中文字幕最新精品| 三上悠亚激情av一区二区三区| 国产在线一区二区三区播放| 国产一区二区三区四区三区四| 成年网站免费在线观看| 国产成人高清视频| 波多野结衣在线网址| 欧美日韩视频第一区| 久久国产精品网站| 美女欧美视频在线观看免费| 久久久久久高潮国产精品视| 国产免费av国片精品草莓男男| 手机看片福利永久国产日韩| 久久午夜电影| 国产欧美激情视频| 国产精品视频观看| 中文字幕人妻一区二区三区视频 | 91中文字精品一区二区| 午夜欧美在线| 在线观看中文av| 一区二区三区欧美久久| 精品国产黄色片| 欧美福利小视频| 超碰在线亚洲| 欧美一区二区三区精美影视| 一区二区动漫| 丰满少妇高潮一区二区| 91久久精品国产91性色tv| 国产日本在线| 欧美激情精品久久久久久变态| 天堂av一区| 久操网在线观看| 91视视频在线观看入口直接观看www | 中文字幕中文字幕在线一区 | 亚洲国产精品影视| 国产九九视频一区二区三区| 国产亚洲精品久久777777| 亚洲福利视频免费观看| 成人动漫一区| 一区二区三区欧美在线| 中国女人久久久| 免费在线观看你懂的| 欧美性猛交xxxx乱大交退制版| 永久免费av在线| 91久久极品少妇xxxxⅹ软件| 亚洲福利专区| 国产又大又粗又爽的毛片| 欧美久久久久久蜜桃| 丰满大乳少妇在线观看网站| 久久精品国产精品国产精品污 | 亚洲图片一区二区| 婷婷在线观看视频| 国产精品日日做人人爱| 中文无码久久精品| 在线免费看黄色片| 欧美性猛交一区二区三区精品| 在线免费观看污| 欧美日韩精品免费观看| 欧美精品三级| 亚洲av无码成人精品国产 | 亚洲国产av一区二区| 欧美性受xxxx白人性爽| 99久久精品费精品国产| 喷水视频在线观看| 欧美裸体bbwbbwbbw| 漫画在线观看av| 久久最新免费视频| 久久婷婷国产综合精品青草| 99国产精品久久久久99打野战| 欧美在线欧美在线|