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

深入理解select count(*)底層究竟做了什么

數據庫 MySQL
SELECT COUNT( * ) FROM t是個再常見不過的 SQL 需求了。在 MySQL 的使用規范中,我們一般使用事務引擎 InnoDB 作為(一般業務)表的存儲引擎,在此前提下,COUNT( * )操作的時間復雜度為 O(N),其中 N 為表的行數。

SELECT COUNT( * ) FROM t是個再常見不過的 SQL 需求了。在 MySQL 的使用規范中,我們一般使用事務引擎 InnoDB 作為(一般業務)表的存儲引擎,在此前提下,COUNT( * )操作的時間復雜度為 O(N),其中 N 為表的行數。

而 MyISAM 表中可以快速取到表的行數。這些實踐經驗的背后是怎樣的機制,以及為什么需要/可以是這樣,就是此文想要探討的。

先來看一下概況: MySQL COUNT( * ) 在 2 種存儲引擎中的部分問題:

 

下面就帶著這些問題,以 InnoDB 存儲引擎為主來進行討論。

一、InnoDB 全表 COUNT( * )

主要問題:

執行過程是怎樣的?

如何計算 count?影響 count 結果的因素有哪些?

count 值存在哪里?涉及的數據結構是怎樣的?

為什么 InnoDB 只能通過掃表來實現 count( * )?(見本文***的問題)

全表COUNT( * )作為 table scan 類型操作的一個 case,有什么風險?

COUNT(* )操作是否會像SELECT *一樣可能讀取大字段涉及的溢出頁?

1. 執行框架 – 循環: 讀取 + 計數

1.1 基本結論

全表掃描,一個循環解決問題。

循環內: 先讀取一行,再決定該行是否計入 count。

循環內是一行一行進行計數處理的。

1.2 說明

簡單 SELELCT-SQL 的執行框架,類比 INSERT INTO … SELECT 是同樣的過程。

 

下面會逐步細化如何讀取與計數 ( count++ ) 。

2. 執行過程

引述: 執行過程部分,分為 4 個部分:

  • COUNT( * )前置流程: 從 Client 端發 SQL 語句,到 MySQL-Server端執行 SELECT 之前,為后面的一些闡述做一鋪墊。
  • COUNT( * ) 流程: 簡要給出代碼層面的流程框架及 2 個核心步驟的重點調用棧部分。
  • 讀取一行: 可見性及 row_search_mvcc函數,介紹可見性如何影響 COUNT( * ) 結果。
  • 計數一行: Evaluate_join_record與列是否為空,介紹計數過程如何影響 COUNT( * )結果。

如果讀者希望直接看如何進行 COUNT( * ),那么也可以忽略 (1),而直接跳到 (2) 開始看。

2.1 COUNT( * ) 前置流程回憶 – 從 Client 端發 SQL 到 sub_select 函數

為了使看到的調用過程不太突兀,我們還是先回憶一下如何執行到 sub_select函數這來的:

 

1.MySQL-Client 端發送 SQL 語句,根據 MySQL 通信協議封包發送。

2.Mysql-Server端接收數據包,由協議解析出 command 類型 ( QUERY ) 及 SQL 語句 ( 字符串 ) 。

3.SQL 語句經過解析器解析輸出為 JOIN類的對象,用于結構化地表達該 SQL 語句。 

  1. PS: 這里的 JOIN 結構,不僅僅是純語法結構,而是已經進行了語義處理,粗略地說,匯總了表的列表 (table_list )、目標列的列表 (target_list )、WHERE 條件、子查詢等語法結構。在全表 COUNT( * )-case 中,table_list = [表“t”(別名也是“t”)],target_list = [目標列對象(列名為“COUNT( * )”)],當然這里沒有 WHERE 條件、子查詢等結構。 

4.JOIN對象有 2 個重要的方法: JOIN::optimize(), JOIN::exec(),分別用于進行查詢語句的優化 和 查詢語句的執行。 

  1. join->optimize(),優化階段 (稍后 myisam 下全表 count( * )操作會涉及這里的一點內容)。  
  2. join->exec(),執行階段 ( 重點 ),包含了 InnoDB 下全表count( * ) 操作的執行流程。  

5.join->exec() 經過若干調用,將調用到sub_select函數來執行簡單 SQL,包括 COUNT( * ) 。

6.END of sub_select 。

2.2 COUNT( * ) 流程 ( 于 sub_select 函數中 )

上層的流程與代碼是比較簡單的,集中在 sub_select 函數中,其中 2 類函數分別對應于前面”執行框架”部分所述的 2 個步驟 – 讀取、計數。先給出結論如下:

1.  讀取一行:從相對頂層的 sub_select 函數經過一番調用,最終所有分支將調用到 row_search_mvcc 函數中,該函數就是用于從 InnoDB 存儲引擎所存儲的B+-tree結構中讀取一行到內存中的一個 buf (uchar * ) 中,待后續處理使用。

2.  這里會涉及行鎖的獲取、MVCC 及行可見性的問題。當然對 于 SELECT COUNT( * ) 這類快照讀而言,只會涉及 MVCC 及其可見性,而不涉及行鎖。詳情可跳至“可見性與 row_search_mvcc 函數”部分。

3.  計數一行: 代碼層面,將會在 evaluate_join_record函數中對所讀取的行進行評估,看其是否應當計入 count中 ( 即是否要count++ )。

簡單來說,COUNT(arg) 本身為 MySQL 的函數操作,對于一行來說,若括號內的參數 arg ( 某列或整行 )的值若不是 NULL,則 count++,否則對該行不予計數。詳情可跳至“ Evaluate_join_record 與列是否為空”部分。

這兩個階段對 COUNT( * )結果的影響如下: (兩層過濾)

 

SQL 層流程框架相關代碼摘要如下:

 

Q: 代碼層面,***步驟(讀取一行)有 2 個分支,為什么?

A:從 InnoDB 接口層面考慮,分為 “讀***行” 和 “讀下一行”,是 2 個不同的執行過程,讀***行需要找到一個 ( cursor ) 位置并做一些初始化工作讓后續的過程可遞歸。

正如我們如果用腳本/程序來進行逐行的掃表操作,實現上就會涉及下面 2 個 SQL: 

  1. // SELECT id FROM t LIMIT 1; OR SELECT MIN(id)-1 FROM t; -> $last_id// SELECT id FROM t WHERE id > $last_id LIMIT 1; 

具體涉及到此例的代碼,SQL 層到存儲引擎層的調用關系,讀取階段的調用棧如下:(供參考)

 

我們可以看到,無論是哪一個分支的讀取,最終都殊途同歸于 row_search_mvcc函數。

以上是對 LOOP 中的代碼做一些簡要的說明,下面來看 row_search_mvcc與 evaluate_join_record 如何輸出最終的 count 結果。

2.3 行可見性及 row_search_mvcc 函數

這里我們主要通過一組 case 和幾個問題來看行可見性對 COUNT( * ) 的影響。

 

Q:對于SELECT COUNT( * ) FROM t或者SELECT MIN(id) FROM t操作,***次的讀行操作讀到的是表 t 中 ( B+ 樹最左葉節點 page 內 ) 的最小記錄嗎?( ha_index_first 為何也調用 row_search_mvcc 來獲取最小 key 值?)

A:不一定。即使是MIN ( id ) 也不一定就讀取的是 id 最小的那一行,因為也同樣有行可見性的問題,實際上 index_read 取到的是 當前事務內語句可見的最小 index 記錄。這也反映了前面提到的 join_read_first 與 join_read_next “殊途同歸”到 row_search_mvcc 是理所應當的。

Q:針對圖中***一問,如果事務 X 是 RU ( Read-Uncommitted ) 隔離級別,且 C-Insert ( 100 ) 的完成是在 X-count( * )執行過程中 ( 僅掃描到 5 或 10 這條記錄 ) 完成的,那么 X-count( * ) 在事務 C-Insert ( 100 ) 完成后,能否在之后的讀取過程中看到 100 這條記錄呢?

A:MySQL 采取”讀到什么就是什么”的策略,即X-count( * )在后面可以讀到 100 這條記錄。

2.4 evaluate_join_record 與列是否為空

Q:某一行如何計入 count?

A:兩種情況會將所讀的行計入 count:

1、如果 COUNT 函數中的參數是某列,則會判斷所讀行中該列定義是否 Nullable以及該列的值是否為 NULL;若兩者均為是,則不會計入 count,否則將計入 count。

  • e.g. SELECT COUNT(col_name) FROM t
  • col_name可以是主鍵、唯一鍵、非唯一鍵、非索引字段

2、如果 COUNT 中帶有 * ,則會判斷這部分的整行是否為 NULL,如果判斷參數為 NULL,則忽略該行,否則 count++。

  • e.g-1. SELECT COUNT(*) FROM t
  • e.g-2. SELECT COUNT(B.*) FROM A LEFT JOIN B ON A.id = B.id

Q: 特別地,對于 SELECT COUNT(id) FROM t,其中 id 字段是表 t 的主鍵,則如何?

A:效果上等價于 COUNT( * )。因為無論是 COUNT( * ),還是 COUNT ( pk_col ) 都是因為有主鍵從而充分斷定索取數據不為 NULL,這類 COUNT 表達式可以用于獲取當前可見的表行數。

Q: 用戶層面對 InnoDB COUNT( * ) 的優化操作問題

A:這個問題是業界熟悉的一個問題,掃描非空唯一鍵可得到表行數,但所涉及的字節數可能會少很多(在表的行長與主鍵、唯一鍵的長度相差較多時),相對的 IO 代價小很多。

相關調用棧參考如下:

 

二、數據結構:

Q:count 值存儲在哪個內存變量里?

A:SQL 解析后,存儲于表達 COUNT( * ) 這一項中,((Item_sum_count*)item_sum)->count

如下圖所示回顧我們之前“COUNT( * )前置流程”部分提到的 JOIN 結構。

 

即 SQL 解析器為每個 SQL 語句進行結構化,將其放在一個 JOIN 對象 ( join ) 中來表達。在該對象中創建并填充了一個列表 result_field_list 用于存放結果列,列表中每個元素則是一個結果列的 ( Item_result_field*) 對象 ( 指針 ) 。

在 COUNT( * )-case 中,結果列列表只包含一個元素,( Item_sum_count: public Item_result_field ) 類型對象 ( name = “COUNT( * )”),其中該類所特有的成員變量 count即為所求。

三、MyISAM 全表 COUNT( * )

由于 MyISAM引擎并不常用于實際業務中,僅做簡要描述如下:

  1. MyISAM-COUNT( * ) 操作是 O(1) 時間復雜度的操作。
  2. 每張MyISAM表中存放了一個 meta 信息-count 值,在內存中與文件中各有一份,內存中的 count 變量值通過讀取文件中的 count 值來進行初始化。
  3. SELECT COUNT( * ) FROM t 會直接讀取內存中的表 t 對應的 count 變量值。
  4. 內存中的 count 值與文件中的 count 值由寫操作來進行更新,其一致性由表級鎖來保證。
  5. 表級鎖保證的寫入串行化使得,同一時刻所有用戶線程的讀操作要么被鎖,要么只會看到一種數據狀態。

四、幾個問題

Q:MyISAM 與 InnoDB 在 COUNT( * ) 操作的執行過程在哪里開始分道揚鑣?

  • 共性:共性存在于 SQL 層,即 SQL 解析之后的數據結構是一致的,count 變量都是存在于作為結果列的 Item_sum_count 類型對象中;返回給客戶端的過程也類似 – 對該 count 變量進行賦值并經由 MySQL 通信協議返回給客戶端。
  • 區別:InnoDB 的 count 值計算是在 SQL 執行階段進行的;而 MyISAM表本身在內存中有一份包含了表 row_count 值的 meta 信息,在 SQL 優化階段通過存儲引擎的標記給優化器一個 hint,表明該表所用的存儲引擎保存了精確行數,可以直接獲取到,無需再進入執行器。

 

Q:InnoDB 中為何無法向 MyISAM 一樣維護住一個 row_count 變量?

A:從 MVCC 機制與行可見性問題中可得到原因,每個事務所看到的行可能是不一樣的,其 count( * )結果也可能是不同的;反過來看,則是 MySQL-Server 端無法在同一時刻對所有用戶線程提供一個統一的讀視圖,也就無法提供一個統一的 count 值。 

  1. PS: 對于多個訪問 MySQL 的用戶線程 ( COUNT( * ) ) 而言,決定它們各自的結果的因素有幾個: 
  • 一組事務執行前的數據狀態(初始數據狀態)。
  • 有時間重疊的事務們的執行序列 (操作時序,事務理論表明 并發事務操作的可串行化是正確性的必要條件)。
  • 事務們各自的隔離級別(每個操作的輸入)。

其中 1、2 對于 Server 而言都是全局或者說可控的,只有 3 是每個用戶線程中事務所獨有的屬性,這是 Server 端不可控的因素,因此 Server 端也就對每個 COUNT( * ) 結果不可控了。

Q:InnoDB-COUNT( * ) 屬 table scan 操作,是否會將現有 Buffer Pool 中其它用戶線程所需熱點頁從 LRU-list 中擠占掉,從而其它用戶線程還需從磁盤 load一次,突然加重 IO 消耗,可能對現有請求造成阻塞?

A:MySQL 有這樣的優化策略,將掃表操作所 load的 page 放在 LRU-list 的 oung/old 的交界處 ( LRU 尾部約 3/8 處 )。這樣用戶線程所需的熱點頁仍然在 LRU-list-young 區域,而掃表操作不斷 load 的頁則會不斷沖刷old區域的頁,這部分的頁本身就是被認為非熱點的頁,因此也相對符合邏輯。 

  1. PS: 個人認為還有一種類似的優化思路,是限定掃描操作所使用的 Buffer Pool 的大小為 O(1) 級別,但這樣做需要付出額外的內存管理成本。 

Q:InnoDB-COUNT( * ) 是否會像 SELECT * FROM t 那樣讀取存儲大字段的溢出頁(如果存在)?

A:否。因為 InnoDB-COUNT( * ) 只需要數行數,而每一行的主鍵肯定不是 NULL,因此只需要讀主鍵索引頁內的行數據,而無需讀取額外的溢出頁。 

  1. blog.didiyun.com/index.php/2019/01/08/mysql-count/  
責任編輯:龐桂玉 來源: 今日頭條
相關推薦

2022-11-04 09:43:05

Java線程

2020-08-10 18:03:54

Cache存儲器CPU

2020-03-26 16:40:07

MySQL索引數據庫

2020-03-17 08:36:22

數據庫存儲Mysql

2023-04-28 08:53:09

2016-12-08 15:36:59

HashMap數據結構hash函數

2010-06-01 15:25:27

JavaCLASSPATH

2020-07-21 08:26:08

SpringSecurity過濾器

2022-11-11 10:48:55

AQS源碼架構

2009-09-25 09:14:35

Hibernate日志

2021-02-17 11:25:33

前端JavaScriptthis

2023-10-19 11:12:15

Netty代碼

2013-09-22 14:57:19

AtWood

2017-08-15 13:05:58

Serverless架構開發運維

2025-05-06 00:43:00

MySQL日志文件MIXED 3

2017-01-10 08:48:21

2020-09-23 10:00:26

Redis數據庫命令

2025-06-05 05:51:33

2024-02-21 21:14:20

編程語言開發Golang

2019-06-25 10:32:19

UDP編程通信
點贊
收藏

51CTO技術棧公眾號

黄色在线网站| 久久久精品免费看| 超碰成人在线观看| 日韩欧美一区二区在线| 亚洲午夜精品久久| 免费的黄色av| 免费人成在线不卡| 久久久久久久久久婷婷| www亚洲色图| 99re8这里有精品热视频免费| 日韩欧美福利视频| 国产欧美自拍视频| 日本私人网站在线观看| 国产一区二区福利视频| 欧美一区二区视频97| 成人高潮免费视频| 美女毛片一区二区三区四区| 日韩免费观看高清完整版| 97在线免费公开视频| 国产视频中文字幕在线观看| 国产偷v国产偷v亚洲高清| 国产精品久久7| 91高潮大合集爽到抽搐| 亚洲免费中文| 欧美二区乱c黑人| 亚洲a∨无码无在线观看| 欧美重口另类| 欧美白人最猛性xxxxx69交| 欧美婷婷精品激情| 交100部在线观看| 亚洲精品乱码久久久久久久久 | 日本xxxx黄色| 人人草在线视频| 一卡二卡三卡日韩欧美| 亚洲在线播放电影| 成年网站在线| 久久精品在这里| 欧美精品久久| 天堂v视频永久在线播放| 国产成人av一区二区三区在线 | 国产精品女主播av| 欧美性大战久久久久| 欧美熟妇乱码在线一区| 国产成人精品影院| 亚洲一区二区三区sesese| 国产九色91回来了| 日本成人在线电影网| 日韩美女写真福利在线观看| 久久国产视频播放| 一本久久知道综合久久| 午夜精品一区二区三区在线播放| 久久婷婷一区二区| 国产精品多人| 久久久久久久久久久人体| 久久高清无码视频| 亚洲天堂偷拍| 四季av一区二区| 不卡在线视频| 国产精品视频yy9299一区| 日韩中文字幕av在线| 你懂的网站在线| 岛国av在线一区| 国产精品一区二区不卡视频| 蜜臀久久99精品久久久| 不卡视频一二三| 精品免费二区三区三区高中清不卡 | 九色网友自拍视频手机在线| 国产亚洲欧美在线| 亚洲国产精品视频一区| 国产二区三区在线| 亚洲国产日日夜夜| 无码人妻丰满熟妇区五十路百度| 日韩视频网站在线观看| 欧美日韩精品电影| 精产国品一区二区三区| 色婷婷狠狠五月综合天色拍| 一区二区国产精品视频| 懂色av蜜臀av粉嫩av永久| 中文视频一区| 欧美一级黄色网| 中文字幕永久免费视频| 国产精品白丝jk黑袜喷水| 国产精品一区二区你懂得| 三级av在线播放| 一区二区中文字幕在线| 国产自产在线视频| 国产成人精品亚洲日本在线观看| 91精品婷婷国产综合久久性色 | 性欧美xxxx视频在线观看| 少妇高潮av久久久久久| 久久99久久精品| 国产福利久久精品| 国产鲁鲁视频在线观看免费| 亚洲女爱视频在线| 免费黄色福利视频| 96sao精品免费视频观看| 亚洲国产日韩欧美综合久久| 亚洲精品自拍视频在线观看| 一本久久综合| 91色视频在线观看| 精品资源在线看| 一个色综合av| 999精品视频在线| 成人免费在线电影网| 国产一区二区三区直播精品电影| 亚洲av无码一区二区三区在线| 国产日韩精品视频一区二区三区 | 亚洲一级免费在线观看| 成人激情自拍| 久久九九亚洲综合| 尤物视频免费观看| 成人激情综合网站| 一区二区免费在线观看| 92国产精品| 欧美成va人片在线观看| 成人一级片免费看| 亚洲一区日韩在线| 成人欧美一区二区三区视频| 亚洲精品承认| 色婷婷综合五月| 国产a级黄色片| 欧美三级网页| 亚洲字幕一区二区| 在线观看麻豆| 欧美午夜一区二区| 少妇光屁股影院| 影音先锋久久久| 91夜夜未满十八勿入爽爽影院| 黄色av免费在线看| 欧美日韩加勒比精品一区| 337p日本欧洲亚洲大胆张筱雨| 国产精品国产一区| 国产精品视频公开费视频| 日本福利片高清在线观看| 亚洲成av人**亚洲成av**| 欧美国产日韩在线视频| 色婷婷综合网| 国产精品视频免费在线观看| 嫩草在线播放| 色综合激情久久| 受虐m奴xxx在线观看| 亚洲欧美日韩精品一区二区 | 国产美女久久久| 137大胆人体在线观看| 色婷婷av一区二区三区软件| www在线观看免费视频| 欧美亚洲视频| 欧美一区二区三区电影在线观看| 卡通欧美亚洲| 一本一本久久a久久精品牛牛影视| 国产视频1区2区| 久久久噜噜噜久噜久久综合| 毛片av免费在线观看| 精品黄色一级片| 国产精品久久久久久五月尺| 青青青手机在线视频观看| 福利视频一区二区| 亚洲做受高潮无遮挡| 亚洲欧美视频一区二区三区| 欧美日韩国产精品一区二区| 日韩欧美一区二区三区在线观看 | 亚洲成年人专区| 香蕉大人久久国产成人av| 久久成人精品视频| 黄色aaa大片| 粉嫩av一区二区三区免费野| 一级黄色性视频| 久久99热99| 成人在线播放网址| 天堂成人娱乐在线视频免费播放网站| 日本免费在线精品| 在线观看av的网站| 精品美女一区二区三区| 粉嫩aⅴ一区二区三区| 久久美女艺术照精彩视频福利播放| 精品999在线| 国内激情久久| 欧美中日韩免费视频| 成人国产精品久久| 97在线视频观看| 成人免费在线视频网| 在线播放欧美女士性生活| 久久网中文字幕| 国产日产欧美精品一区二区三区| 久久久久久久久久一区| 国内精品久久久久久久影视蜜臀| 免费在线成人av| 伊人久久大香| 欧美一级高清免费播放| 国产淫片在线观看| 日韩精品免费综合视频在线播放| 一区二区的视频| 福利一区福利二区微拍刺激| 视频国产一区二区| 91丨九色丨尤物| 亚洲综合在线一区二区| 久久久精品五月天| 男女啪啪免费观看| 国产精品亚洲二区| 国产精品国色综合久久| 欧美视频免费看| 97在线视频国产| 菠萝菠萝蜜在线视频免费观看| 亚洲精品成人av| a级片在线播放| 在线观看一区不卡| 国产系列精品av| 综合久久综合久久| 老头老太做爰xxx视频| 99在线精品观看| 亚洲免费在线播放视频| 日韩中文字幕不卡| 人体内射精一区二区三区| 日韩影院二区| 青青草原亚洲| 日本天堂一区| 成人午夜影院在线观看| 亚洲精品aa| 国产精品电影网| 亚洲天堂电影| 久久久女女女女999久久| 成人在线观看免费网站| 色系列之999| 国产精品影院在线| 精品视频一区在线视频| 免费看av毛片| 日韩精品一区二区三区在线观看 | 无码aⅴ精品一区二区三区| 亚洲永久精品国产| 欧产日产国产v| 日韩毛片在线免费观看| 亚洲综合第一区| 亚洲国产精品t66y| 色欲狠狠躁天天躁无码中文字幕| 91理论电影在线观看| 捆绑凌虐一区二区三区| 成人精品高清在线| 国产视频精品视频| 成人免费视频国产在线观看| 香蕉在线观看视频| 国产精品66部| 最新国产精品自拍| 高清在线观看日韩| 极品白嫩少妇无套内谢| 粉嫩绯色av一区二区在线观看| 91aaa精品| 国产成人啪免费观看软件 | 日韩精品一区国产| 999日本视频| 亚洲精品观看| 国产精品久久精品视| 日韩伦理一区二区三区| 欧美激情第一页在线观看| 国产精品片aa在线观看| 色女人综合av| 99久久久国产精品美女| 中文字幕综合在线观看| 一区二区三区在线电影| 日本免费a视频| 在线视频免费在线观看一区二区| aaa毛片在线观看| 青青草精品视频| 一级淫片在线观看| 国产精品一区二区三区四区| www.17c.com喷水少妇| 成人app下载| 一级片视频免费看| 18欧美乱大交hd1984| 久草视频免费在线播放| 午夜不卡av免费| 久草热在线观看| 555www色欧美视频| 蜜桃av鲁一鲁一鲁一鲁俄罗斯的| 日韩精品中文在线观看| 在线免费观看黄色网址| 欧美成年人视频| 狼人综合视频| 国产精品丝袜一区二区三区| 国产在线视频欧美一区| 精品91免费| 日韩一区三区| 日韩五码在线观看| 免费欧美日韩国产三级电影| 久久久无码人妻精品无码| 久久久无码精品亚洲日韩按摩| 九九精品视频免费| 欧美日韩国产麻豆| 国产精品视频一二区| 精品丝袜一区二区三区| 日本在线观看www| 91精品国产一区| 四虎精品永久免费| 欧美成人第一区| 欧美日本一区| 亚洲色图久久久| kk眼镜猥琐国模调教系列一区二区| 一级黄色录像毛片| 亚洲电影中文字幕在线观看| 亚洲综合视频在线播放| 亚洲乱码av中文一区二区| 国产激情在线观看| 国产精国产精品| 超碰cao国产精品一区二区| 一区二区不卡在线观看| 久久精品一区二区国产| 成人区人妻精品一区二 | 日韩精品无码一区二区| 欧美色综合影院| 天天干天天爽天天操| 另类图片亚洲另类| 主播大秀视频在线观看一区二区| 精品人伦一区二区三区| 中文字幕午夜精品一区二区三区| 久久久久久久少妇| 97久久精品人人做人人爽| 欧美日韩成人免费观看| 欧美乱妇20p| 成人午夜电影在线观看| 奇米影视亚洲狠狠色| 久久狠狠久久| 精品国产一区二区三区无码| 激情图区综合网| 久久精品色妇熟妇丰满人妻| 欧美在线视频全部完| 丝袜视频国产在线播放| 午夜精品理论片| 国产精品香蕉| 国内精品国产三级国产99| 久久99久久久久| 后入内射无码人妻一区| 日本精品视频一区二区| 婷婷国产在线| 97在线视频国产| 羞羞色国产精品网站| 91丨porny丨探花| 成人美女在线观看| 久久精品亚洲无码| 欧美本精品男人aⅴ天堂| 欧美人体视频xxxxx| 51国偷自产一区二区三区的来源| 亚洲国产精品日韩专区av有中文| 欧美日韩精品区别| 亚洲视频在线一区二区| 91免费视频播放| 毛片精品免费在线观看| 国产区一区二| av日韩在线看| 成人av资源网站| 999这里只有精品| 亚洲欧美一区二区三区久久| 成人开心激情| 中文字幕av日韩精品| 激情六月婷婷综合| 中文字幕手机在线观看| 精品乱人伦小说| 乱人伦视频在线| 欧美亚洲国产免费| 奇米精品一区二区三区在线观看| 91社区视频在线观看| 欧美久久久久免费| 影院在线观看全集免费观看| 国产一区二区不卡视频| 亚洲欧美bt| 精品日韩在线视频| 欧美一级日韩免费不卡| 高端美女服务在线视频播放| 奇米视频888战线精品播放| 麻豆中文一区二区| 免费无遮挡无码永久在线观看视频 | 日韩中文字幕综合| 清纯唯美日韩制服另类| 久久精品国产99久久| 免费不卡av网站| 天天综合天天做天天综合| 免费理论片在线观看播放老| 国产在线精品自拍| 欧美精品综合| 精品少妇一区二区三区免费观| 欧美又粗又大又爽| 污视频网站免费在线观看| 久久婷婷国产综合尤物精品| 麻豆精品精品国产自在97香蕉| 国产十六处破外女视频| 亚洲欧洲激情在线| 国产亚洲久久| 四虎永久在线精品无码视频| 日韩一区在线看| 天堂在线中文资源| 91精品综合久久久久久五月天| 亚洲精品极品| 国产黄a三级三级| 国产视频精品自拍| 国产不卡精品| 亚洲免费av一区二区三区| 亚洲黄色小说网站| 成人亚洲综合天堂| 国产精品对白刺激久久久| 麻豆精品国产传媒mv男同 | 色yeye免费人成网站在线观看| 欧美中文娱乐网|