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

MySQL 怎么用索引實現 Group By?

數據庫 MySQL
本文我們一起來探尋 MySQL 使用索引實現 group by 的過程,使用臨時表實現 group by 會單獨用一篇文章來介紹。

我們用 explain 分析包含 group by 的 select 語句時,從輸出結果的 Extra 列經常可以看到 Using temporary; Using filesort。看到這個,我們就知道 MySQL 使用了臨時表來實現 group by。

使用臨時表實現 group by,成本高,執行慢。如果能夠利用索引中記錄已經排好序的特性,使用索引來實現 group by,那就是鳥槍換炮了。

本文我們一起來探尋 MySQL 使用索引實現 group by 的過程,使用臨時表實現 group by 會單獨用一篇文章來介紹。

本文內容基于 MySQL 5.7.35 源碼。

1、 引言

使用索引實現 group by,最簡單的方式,大概就是這樣了:

  • 存儲引擎按順序一條一條讀取記錄,返回給 server 層。
  • server 層判斷記錄是否符合 where 條件。
  • server 層對符合條件的記錄進行聚合函數邏輯處理。

這種實現方式被稱為緊湊索引掃描。

緊湊索引掃描會對滿足 where 條件的所有記錄進行聚合函數處理,而對于 min()、max() 來說,實際需要的只有每個分組中聚合函數字段值最小或最大的那條記錄。

如果 server 層能直接從存儲引擎讀取到每個分組中聚合函數需要的那條記錄,而不必讀取每個分組中的所有記錄進行聚合函數處理,是不是就可以節省很多時間了?

是的,這種只讀取分組中部分記錄實現 group by 的方式,被稱為松散索引掃描。

為了方便描述,本文在需要的時候會以具體 SQL 作為示例說明,示例 SQL 的表結構如下:

CREATE TABLE `t_group_by` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`i1` int(10) unsigned DEFAULT '0',
`c1` char(11) DEFAULT '',
`e1` enum('北京','上海','廣州','深圳','天津','杭州','成都','重慶','蘇州','南京','洽爾濱','沈陽','長春','廈門','福州','南昌','泉州','德清','長沙','武漢') DEFAULT '北京',
`d1` decimal(10,2) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_e1_i1` (`e1`,`i1`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;1.2.3.4.5.6.7.8.9.

2、 緊湊索引掃描

group by 字段包含在索引中,并且滿足索引最左匹配原則,server 層就可以順序讀取索引中的記錄實現 group by,而不需要借助臨時表。

緊湊索引掃描中的緊湊,表示 server 層從存儲引擎讀取記錄時,以索引范圍掃描或全索引掃描方式,按順序一條一條讀取記錄,不會跳過中間的某條記錄,示意圖如下:

緊湊索引掃描

接下來,我們以 avg() 為例介紹緊湊索引掃描的執行過程,示例 SQL 如下:

select
e1, avg(i1) as t
from t_group_by
where d1 > 5452415
group by e11.2.3.4.5.

詞法分析 & 語法分析階段,avg(i1) 被解析為 Item_sum_avg 類,以下是該類的實例屬性的其中 3 個:

  • sum,保存分組求和結果。
  • count,保存分組計數。
  • args,avg() 函數的參數,avg() 只能有一個參數。args[0] 為 i1 字段對應的 Item_field 類實例。

Item_sum_avg

avg() 只有一個參數,為什么參數屬性名是 args?

Item_sum_avg 類的實例屬性 args 是從父類 Item_sum 繼承得到的。

Item_sum_count 類(count() 對應的類)的實例屬性 args 也是從父類 Item_sum 繼承的,count() 可以有多個參數,所以,用 args 來表示聚合函數的參數。

查詢準備階段(prepare 階段),i1 字段對應的 Item_field 類實例會關聯到表 t_group_by 的 i1 字段。

Item_sum_avg

執行階段,server 層從存儲引擎讀取到一條記錄之后,判斷記錄是否符合 where 條件(d1 > 5452415)。

記錄不符合 where 條件,繼續讀取下一條記錄。

記錄符合 where 條件,進行聚合函數邏輯處理。

如果當前記錄的分組前綴(示例 SQL 中 group by 的 e1 字段值)和上一條記錄的分組前綴不一樣,說明需要結束上一個分組,并開啟新分組。

  • 結束上一個分組:通過 sum / count 計算得到分組平均值(即 avg(i1) 的結果),把分組前綴及分組平均值發送給客戶端。
  • 開啟新分組:Item_sum_avg 類的實例屬性 sum、count 清零,當前記錄的 e1 字段值作為新分組前綴,然后,新分組進行分組求和(sum 加上 i1 字段值)、分組計數(count 加 1)。

如果當前記錄的分組前綴和上一條記錄的分組前綴一樣,說明還是同一個分組,只需要進行分組求和、分組計數,不需要計算平均值。

分組求和、分組計數代碼如下:

bool Item_sum_avg::add()
{
// 分組求和
if (Item_sum_sum::add())
return TRUE;
// 分組計數(字段值不為 NULL 才進行計數)
if (!aggr->arg_is_null(true))
count++;
return FALSE;
}1.2.3.4.5.6.7.8.9.10.

只有字段值不為 NULL,分組計數(count)才會加 1。

了解 avg() 之后,count()、sum() 也就明白了。count()、sum() 和 avg() 的執行過程基本一樣,不同之處在于:

  • count() 對應的類 Item_sum_count 只有 count 屬性,只需要進行分組計數,不需要分組求和、計算平均值。
  • sum() 對應的類 Item_sum_sum 只有 sum 屬性,只需要進行分組求和,不需要分組計數、計算平均值。

3、 松散索引掃描

松散索引掃描,從存儲引擎讀取分組記錄時,會跳著讀,讀取分組前綴之后,直接通過分組前綴(group by 字段的值)定位到分組中符合 where 條件的第一條或最后一條記錄,而不需要讀取分組的所有記錄,然后就接著讀取下一個分組的分組前綴,這樣可以減少 select 語句執行過程中需要讀取的記錄數,從而比緊湊索引掃描更快(有例外情況,后面會介紹)。

松散索引掃描

如果 select 語句執行過程中使用了松散索引掃描實現 group by,explain 輸出結果的 Extra 列會顯示 Using index for group-by。

松散索引掃描用于 min()、max(),可以減少需要讀取的記錄數;用于 count(distinct)、sum(distinct)、avg(distinct) ,可以對記錄去重,避免使用臨時表去重。

我們以 min() 為例介紹松散索引掃描的執行過程,示例 SQL 如下:

select
e1, min(i1)
from t_group_by
group by e11.2.3.4.

詞法分析 & 語法分析階段,min(i1) 被解析為 Item_sum_min 類,以下是該類的實例屬性的其中 2 個:

  • value,該屬性類型為 Item_cache,Item_cache 子類的實例屬性 value 保存分組最小值(分組記錄中 i1 字段的最小值)。
  • args,min() 函數的參數,args[0] 為 i1 字段對應的 Item_field 類實例。

Item_sum_min

查詢準備階段,i1 字段對應的 Item_field 類實例會關聯到表 t_group_by 的 i1 字段。

Item_sum_min

執行階段,讀取分組最小值的過程分為兩步:

  • 讀取分組前綴(示例 SQL 中 group by 的 e1 字段值),從存儲引擎讀取分組的第一條記錄,得到分組前綴。
  • 根據分組前綴讀取分組最小值(分組記錄中 i1 字段的最小值),用前面得到的分組前綴限定索引掃描范圍,從存儲引擎讀取分組中 i1 字段的最小值,保存到 value 屬性中。

讀取分組最小值

4、 兩種索引掃描怎么選?

松散索引掃描雖然具備提升 select 語句執行效率的能力,但只有在適用的場景下才能發揮它的威力,因此,它的使用需要滿足以下條件:

條件 1,select 語句只能是單表查詢,不能是連接查詢。

條件 2,group by 字段必須滿足索引的最左匹配原則。例如:表中有一個索引包含 c1, c2, c3 三個字段,group by c1, c2 滿足最左匹配原則。

條件 3,如果 select 字段列表中包含聚合函數,聚合函數必須滿足這些條件:

  • 所有聚合函數的參數都必須是同一個字段。
  • 聚合函數字段必須是索引中的字段,并且 group by 字段 + 聚合函數字段也必須滿足索引最左匹配原則。
  • 聚合函數要么是 min()、max() 中的 1 ~ 2 個;要么是 count(distinct)、sum(distinct)、avg(distinct) 中的 1 ~ 3個。

松散索引掃描中,兩類聚合函數不能同時存在,因為它們對于分組前綴處理邏輯不一樣。在讀取數據時,min()、max() 用 group by 字段值作為分組前綴;count(distinct)、sum(distinct)、avg(distinct) 用 group by 字段值 + 聚合函數中的字段值作為分組前綴。

條件 4,索引中所有字段必須是全字段索引,不能是前綴索引。

例如:有個字段 c1 varchar(20),索引中該字段為 index(c1(10)),這樣的索引就不能用于松散索引掃描。

滿足以上條件,還只是站在了使用松散索引掃描的門外,想要登堂入室,還必須進行成本評估。

如果松散索引掃描的成本比緊湊索引掃描的成本低,自然就要用松散索引掃描來提升 select 語句的執行效率了。

(1) 松散索引掃描成本更高怎么辦?

松散索引掃描成本比緊湊索引掃描成本更高時,如果 select 語句中的聚合函數是 min()、max() 中的 1 ~ 2 個,就會使用緊湊索引掃描。

松散索引掃描自帶去重功能,不需要借助臨時表,和包含 distinct 關鍵字的聚合函數天生更匹配。緊湊索引掃描則需要借助臨時表對記錄進行去重。

如果聚合函數是 count(distinct)、sum(distinct)、avg(distinct) 中的 1 ~ 3 個,雖然緊湊索引掃描讀取記錄成本更低,但必須使用臨時表對記錄去重,這樣一來,緊湊索引掃描讀取數據 + 臨時表去重的成本就比松散索引掃描成本更高了。

這就很尷尬了,兩種方式各有優缺點,兩難之下,MySQL 要怎么辦?

兩難之下,最好的選擇就是找到第三個選項。為此,MySQL 祭出了一個大招,既要和緊湊索引掃描一樣順序讀取數據,又要用松散索引掃描自帶的去重能力。如果用了這個大招,在 explain 輸出結果的 Extra 列可以看到 Using index for group-by (scanning)。

MySQL 把緊湊索引掃描中使用的順序讀取記錄嵌入到松散索引掃描的邏輯里,當評估緊湊索引掃描成本比松散索引掃描低時,對于包含 distinct 關鍵字的聚合函數,就會用順序讀取記錄代替跳著讀取記錄,并且在順序讀取記錄的過程中完成記錄去重。

對于松散索引掃描的這個變種,到寫完本文為止,我還沒有在哪里看到官方有正式的命名,為了方便記憶,估且把它命名為順序松散索引掃描吧。

順序松散索引掃描

(2) 為什么松散索引掃描會比緊湊索引掃描成本高?

緊湊索引掃描,存儲引擎按順序一條一條讀取記錄,返回給 server 層,server 層判斷記錄是否符合 where 條件,然后對符合條件的記錄進行聚合函數邏輯處理。

松散索引掃描,對于每個分組,都會從存儲引擎讀取兩次數據,第一次是讀取分組的第一條記錄,得到分組前綴;第二次是根據分組前綴讀取分組中索引掃描范圍的第一條或最后一條記錄。

如果分組中的記錄數量多,第二次讀取記錄時,能跳過的記錄就多,節省的成本就多,松散索引掃描就會比緊湊索引掃描更快。

如果分組中的記錄數量少,第二次讀取記錄時,能跳過的記錄就少,每個分組讀取兩次記錄增加的成本超過了跳過記錄節省的成本,松散索引掃描就會比緊湊索引掃描更慢。

5、 總結

引言小節,介紹了 MySQL 實現 group by 的兩種索引掃描方式:緊湊索引掃描、松散索引掃描。

緊湊索引掃描小節,以 avg() 為例介紹了緊湊索引掃描的執行過程,avg() 在詞法分析 & 語法分析階段會被解析為 Item_sum_avg 類。該類的實例屬性 sum、count、args 分別用于保存分組求和結果、分組計數、avg() 函數的參數。

在執行階段,通過把 avg() 字段值累加到 sum 屬性進行分組求和;對 count 屬性進行自增實現分組計數;通過 sum / count 計算得到分組平均值。

Item_sum_count、Item_sum_sum、Item_sum_avg、Item_sum_min、Item_sum_max 類的實例屬性 args 都繼承自父類 Item_sum,用于保存聚合函數參數,count() 支持多個參數,所以,參數的屬性名為 args 而不是 arg。

松散索引掃描小節,以 min() 為例介紹了松散索引掃描的執行過程,執行階段,分為兩步讀取分組最小值:讀取分組前綴,根據分組前綴讀取分組最小值。

兩種索引掃描怎么選? 小節,介紹了使用松散索引掃描必須滿足的一系列條件。

當松散索引掃描比緊湊索引掃描成本高時,min()、max() 會選擇用緊湊索引掃描,MySQL 為 count(distinct)、sum(distinct)、avg(distinct) 引入松散索引掃描的變種,順序讀取索引記錄(和緊湊索引掃描一樣)+ 松散索引掃描自帶的記錄去重功能,避免了使用臨時表對記錄去重。

還介紹了松散索引掃描比緊湊索引掃描的成本高,是因為分組中記錄數量少時,兩次讀取存儲引擎數據增加的成本超過了跳著讀取索引記錄節省的成本。

本文轉載自微信公眾號「一樹一溪」,可以通過以下二維碼關注。轉載本文請聯系一樹一溪公眾號。

責任編輯:姜華 來源: 一樹一溪
相關推薦

2009-03-25 09:00:11

Group By排序MySQL

2020-12-09 10:10:24

MySQL數據庫算法

2017-01-26 20:48:14

MySQL復制MySQL程序壓縮

2010-05-25 15:12:22

MySQL分頁

2018-04-09 14:25:06

數據庫MySQL索引

2010-11-25 11:51:53

MySQL查詢行號

2010-10-08 16:20:35

MySQL語句

2011-07-11 15:03:36

MySQL索引數據結構

2009-08-14 11:24:10

MySQL全文檢索MySQL Like索

2015-10-30 15:55:43

MySQL

2020-09-28 15:34:38

ElasticSear索引MySQL

2020-05-14 11:19:19

降序索引子集

2018-01-18 16:10:42

數據庫MySQLOracle

2020-12-04 06:35:20

TCPUDP阿里

2022-08-30 19:11:12

Docker虛擬化技術

2021-04-29 08:29:48

MySQL數據庫GROUP_CONCA

2022-04-26 09:44:03

group byExtraMySQL

2011-03-31 13:51:54

MySQL索引

2022-08-11 08:03:43

隊列

2017-11-27 13:39:29

Python大數據搜索引擎
點贊
收藏

51CTO技術棧公眾號

色综合久久久久综合体| 国产精品v欧美精品v日本精品动漫| 五月激情丁香一区二区三区| 欧美日韩精品久久| 在线观看日韩一区二区| 欧美aa国产视频| 亚洲女成人图区| 污污网站在线观看视频| 7777kkk亚洲综合欧美网站| 久久久久久久久伊人| 成人网欧美在线视频| 欧美成人精品欧美一级乱黄| 手机在线电影一区| 精品国产制服丝袜高跟| 欧美久久一级| 久久久久久久9999| 国产在线观看不卡| 国产精品乱码一区二区三区软件 | 在线国产精品播放| 蜜桃视频在线一区| 亚洲中无吗在线| 色综合久久久久久久久| 在线观看日韩羞羞视频| 视频污在线观看| 久久精品二区亚洲w码| 91成人在线播放| 99久久婷婷国产综合| 免费成人网www| 精品国产123| 日本福利视频在线| 国产亚洲人成网站在线观看| 久久精品一二三区| 国产精品毛片久久久久久久av| 激情综合激情| 久久精品久久久久久| 中文字幕国产专区| 日韩欧美久久| 91精品国产91久久综合桃花| 亚洲黄色av网址| 乡村艳史在线观看| 亚洲午夜精品在线| 18视频在线观看娇喘| 国产精品麻豆一区二区三区| 99久久久无码国产精品| 99久久综合狠狠综合久久止| 国产精品久久久久久无人区| 蜜桃在线一区二区三区| 国产精品高潮呻吟久久av野狼| 自拍偷拍欧美亚洲| 国内精品美女在线观看| 九九热这里只有精品6| 青青操在线播放| www.四虎精品| 中文字幕人妻丝袜乱一区三区| 99精品欧美| 97国产精品视频| 日韩av电影网| 亚洲精品日韩久久| 91成人在线观看国产| 久久精品国产亚洲av麻豆色欲 | 国产十六处破外女视频| 午夜影院欧美| 久久国产加勒比精品无码| 久久久久久久久久97| 亚洲高清资源在线观看| 美日韩丰满少妇在线观看| 青娱乐国产在线视频| 亚洲手机视频| 欧美性受xxxx白人性爽| 黄瓜视频在线免费观看| 秋霞av亚洲一区二区三| 国产日韩欧美自拍| www日本在线| 成人av在线播放网址| 精品在线观看一区二区| 成人影视在线播放| 中文字幕一区二区三区在线不卡| 自拍偷拍视频在线| 高清在线视频不卡| 欧美午夜精品久久久| 奇米精品一区二区三区| 免费电影一区| 天天干,天天干| 美女视频一区在线观看| 成人精品在线观看| 亚洲免费一级片| 97se狠狠狠综合亚洲狠狠| 欧美国产综合视频| 天堂中文а√在线| 亚洲国产另类精品专区| 成人一级片网站| 粉嫩av一区二区三区四区五区| 69久久夜色精品国产69蝌蚪网| www.四虎精品| 欧美日韩在线二区| 久久好看免费视频| 国产精品久久久久久久久久久久久久久久久 | 亚洲精品视频91| 久久综合九色综合欧美98| 正在播放国产精品| 秋霞伦理一区| 欧美一区二区视频观看视频| a视频免费观看| 香蕉久久网站| 日本高清不卡在线| 成人福利小视频| 日韩一级特黄| 国产精品久久久久蜜臀| 欧美成人精品xxx| 亚洲va在线观看| 国产一区二区伦理片| 欧美国产综合视频| 黄色美女视频在线观看| 欧美影视一区在线| 国产精品无码一区二区三| 91欧美在线| 日本久久久久久久| 风流老熟女一区二区三区| 国产欧美一区二区三区鸳鸯浴 | 国产第一页浮力| 亚洲激情专区| 亚洲va欧美va在线观看| 岛国视频免费在线观看| 亚洲第一搞黄网站| 91欧美一区二区三区| 国产精品嫩模av在线| 久久久免费观看| 精品久久人妻av中文字幕| 国产精品欧美极品| 东京热加勒比无码少妇| 风间由美中文字幕在线看视频国产欧美 | 95av在线视频| 日本三级视频在线播放| 色国产综合视频| 日韩片在线观看| 亚洲欧洲午夜| 懂色一区二区三区av片| 3d玉蒲团在线观看| 538在线一区二区精品国产| 欧美日韩生活片| 日韩国产高清在线| 日韩电影大全在线观看| 国产日韩电影| 亚洲欧美日韩国产成人| 在线观看日本网站| 久久久一区二区三区捆绑**| 欧美国产激情视频| 视频小说一区二区| 欧美一级片久久久久久久| 天堂在线观看视频| 岛国av一区二区三区| 日韩av无码一区二区三区不卡| 欧美视频官网| 国产精品久久7| 超碰在线网站| 日韩av中文在线| 久久人妻免费视频| 国产欧美精品一区二区三区四区| 免费高清在线观看免费| 蜜臀91精品国产高清在线观看| 国产91九色视频| 国产高清美女一级毛片久久| 欧美性一区二区| 小嫩苞一区二区三区| 国产麻豆日韩欧美久久| 国产二区视频在线| 天海翼精品一区二区三区| 日韩美女av在线免费观看| 国产成人一区二区三区影院在线| 波多野结衣欧美| 色综合色综合网色综合| 人妻一区二区三区免费| 精品福利樱桃av导航| 一区二区黄色片| 毛片不卡一区二区| 欧美 日韩 国产精品| 欧美日韩另类图片| 国产精品精品一区二区三区午夜版 | 精品精品国产高清a毛片牛牛| 国产波霸爆乳一区二区| 国产成人精品午夜视频免费| 黄色片网址在线观看| 免费观看久久av| 91精品久久久久久综合乱菊| 毛片网站在线看| 亚洲视频999| 91片黄在线观看喷潮| 亚洲一区二区三区中文字幕在线 | 国产视频aaa| 婷婷成人综合网| 懂色av粉嫩av浪潮av| 国产宾馆实践打屁股91| 国产日韩一区二区在线观看| 99久久夜色精品国产亚洲96| 国产精品一区视频| 精品久久久网| 992tv成人免费影院| 992tv免费直播在线观看| 精品人在线二区三区| 高潮毛片又色又爽免费| 亚洲欧美日韩国产一区二区三区| 熟女丰满老熟女熟妇| 极品少妇一区二区三区精品视频 | 亚洲mv在线看| 都市激情亚洲| 成人性生交大片免费看视频直播 | a毛片在线观看| 亚洲欧美日韩成人| 亚洲18在线看污www麻豆| 国产在线精彩视频| 中国日韩欧美久久久久久久久| 日韩精品在线不卡| 亚洲av无码片一区二区三区 | 三妻四妾的电影电视剧在线观看| 亚洲尤物在线视频观看| 91久久在线观看| 超碰高清在线| 久久久精品一区二区三区| 外国精品视频在线观看 | 男人添女人下面高潮视频| 久久国产成人精品| 区一区二区三区中文字幕| 深夜福利一区二区三区| 国产日韩综合一区二区性色av| 欧美男男tv网站在线播放| 久久97久久97精品免视看| 91在线不卡| 亚洲欧美日韩综合| 天堂av中文字幕| 亚洲成av人片在线观看www| 欧美激情亚洲精品| а√中文在线8| 日韩中文字幕国产| 春暖花开成人亚洲区| 亚洲免费视频在线观看| 神马一区二区三区| 精品国产一区二区亚洲人成毛片| 国产精品久久婷婷| 欧美日韩一二三| 日本久久综合网| 色综合久久综合网97色综合| 日韩欧美高清在线观看| 亚洲成人一区二区在线观看| 欧美日韩大片在线观看| 亚洲美女偷拍久久| 欧美爱爱免费视频| 国产精品久久久久久久久果冻传媒| 无码h肉动漫在线观看| 久久久影视传媒| 扒开jk护士狂揉免费| 久久伊人中文字幕| 免费看污片网站| 欧美激情一区二区三区全黄| 91资源在线播放| 国产精品久久久久桃色tv| 少妇av片在线观看| 亚洲欧洲成人精品av97| 91成人精品一区二区| 国产精品久久影院| 亚洲精品一区二区三区在线播放| 亚洲四区在线观看| 亚洲国产成人精品综合99| 一区二区三区四区激情| 国产香蕉在线视频| 懂色av中文一区二区三区天美 | 看黄网站在线观看| 理论片在线不卡免费观看| 香蕉久久aⅴ一区二区三区| 欧美激情一级精品国产| 日韩电影免费看| 国产精品海角社区在线观看| www.久久久.com| 成人片在线免费看| 网红女主播少妇精品视频| 日韩欧美在线观看强乱免费| 亚洲成av人片一区二区密柚| 中文字幕无码精品亚洲资源网久久| 亚洲精品美女| 中文久久久久久| 国产美女娇喘av呻吟久久| 小毛片在线观看| 亚洲国产成人私人影院tom| 九九热视频在线免费观看| 一级精品视频在线观看宜春院| 国产又爽又黄的视频| 欧美午夜不卡在线观看免费| 国产高清免费av| 亚洲欧美日韩天堂| 97影院秋霞午夜在线观看| 国内精品模特av私拍在线观看| 精品国产第一福利网站| 成人两性免费视频| 欧美在线导航| 精品欧美久久久| 亚洲不卡视频在线观看| 欧美日韩国产a| 蜜臀久久99精品久久久| 国产午夜精品全部视频播放| caopeng在线| 国产成人aa精品一区在线播放 | 在线视频精品| 九九久久久久久| 久久久久亚洲蜜桃| 九九久久免费视频| 欧美三区免费完整视频在线观看| 成人毛片视频免费看| 最近2019中文字幕大全第二页| 成人爽a毛片免费啪啪动漫| 国产精品日韩久久久久| 国产色噜噜噜91在线精品 | 日本高清中文字幕在线| 91精品国产99| 欧美.com| 亚洲在线视频一区二区| 亚洲综合日韩| 久久国产免费视频| 1000精品久久久久久久久| 中文字幕激情小说| 欧美一级高清片在线观看| аⅴ资源新版在线天堂| 欧美一区二三区| 日韩欧美一级| 国产精品久久成人免费观看| 全国精品久久少妇| 三级网站在线免费观看| 午夜欧美在线一二页| av天堂一区二区三区| 视频在线观看99| 主播大秀视频在线观看一区二区| 蜜桃av久久久亚洲精品| 亚洲另类黄色| 人妻 日韩 欧美 综合 制服| 亚洲九九爱视频| 国产精品日韩无码| 日韩中文字幕欧美| 欧美日韩在线精品一区二区三区激情综合 | 国产日韩成人内射视频| 国产精品18hdxxxⅹ在线| 亚洲一区高清| 蜜臀av性久久久久蜜臀aⅴ| 影音先锋制服丝袜| 91福利资源站| 理论在线观看| 国产精品久久久久久超碰| 免费成人网www| 国产成人av影视| 国产日产欧产精品推荐色| 波多野结衣理论片| 一区二区三区美女xx视频| av在线不卡精品| 亚洲国产精品久久久久婷婷老年 | 中文字幕乱视频| 亚洲成人一区在线| 三级网站免费观看| 国内精品伊人久久| 欧美一级一片| 免费黄色特级片| 国产精品视频你懂的| 一区二区美女视频| 久久精品国产69国产精品亚洲| 国产电影一区| 美女av免费观看| 99re这里都是精品| 久久久久久久久久成人| 国产一区二区三区中文| 日本久久一区| 久久男人资源站| 99久久777色| 日韩av图片| 亚洲国产专区校园欧美| 国产精品无码永久免费不卡| 色94色欧美sute亚洲线路一ni| av色图一区| 91传媒在线免费观看| 亚洲免费大片| 黄色片网站免费| 欧美一级日韩不卡播放免费| 嗯啊主人调教在线播放视频| 欧美另类视频在线| 久热成人在线视频| 欧美黑吊大战白妞| 亚洲免费视频网站| 久久精品九色| 97xxxxx| 亚洲人一二三区| 欧美熟女一区二区| 国产精品嫩草影院久久久| 亚洲国产精品综合久久久| 亚州av综合色区无码一区| 欧美私人免费视频| 蜜臀av在线| 亚洲精品国产系列| www.欧美日韩国产在线| 亚洲中文字幕在线观看| 国内揄拍国内精品| 成人在线亚洲| 国产激情视频网站| 欧美欧美欧美欧美首页| 草草在线视频| 2021狠狠干|