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

你好奇過 MySQL 內部臨時表存了什么嗎?

數據庫 MySQL
SQL 語句執行過程中 MySQL 自行創建的是內部臨時表,explain 輸出結果的 Extra 列出現了 Using temporary 就說明 SQL 語句執行時使用了內部臨時表。

MySQL 臨時表分為兩種:外部臨時表、內部臨時表。用戶通過 CREATE TEMPORARY TABLE 創建的是外部臨時表。SQL 語句執行過程中 MySQL 自行創建的是內部臨時表,explain 輸出結果的 Extra 列出現了 Using temporary 就說明 SQL 語句執行時使用了內部臨時表。

為了描述方便,本文后續內容中臨時表和內部臨時表意思一樣,都表示 SQL 語句執行過程中 MySQL 自行創建的臨時表。

本文內容基于 MySQL 5.7.35 源碼。

1、 準備工作

本文使用了 2 個示例表:t_recbuf、t_internal_tmp_table,2 個表的結構完全一樣,以下列出 t_recbuf 的表結構:

CREATE TABLE `t_recbuf` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`i1` int(10) unsigned DEFAULT '0',
`str1` varchar(32) DEFAULT '',
`str2` varchar(255) DEFAULT '',
`c1` char(11) DEFAULT '',
`e1` enum('北京','上海','廣州','深圳','天津','杭州','成都','重慶','蘇州','南京','洽爾濱','沈陽','長春','廈門','福州','南昌','泉州','德清','長沙','武漢') DEFAULT '北京',
`s1` set('吃','喝','玩','樂','衣','食','住','行','前后','左右','上下','里外','遠近','長短','黑白','水星','金星','地球','火星','木星','土星','天王星','海王星','冥王星') DEFAULT '',
`bit1` bit(8) DEFAULT b'0',
`bit2` bit(17) DEFAULT b'0',
`blob1` blob,
`d1` decimal(10,2) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2001 DEFAULT CHARSET=utf8;

2、哪些場景會用到臨時表?

MySQL 使用臨時表的場景很多,下面列舉出部分場景:

  • order by 和 group by 字段不一樣。
  • join 語句中,order by 或 group by 字段不屬于執行計劃中第一個表。
  • 包含 distinct 關鍵字的聚合函數,例如:count(distinct i1)、sum(distinct i1) 等。
  • 使用 union 或 union distinct 關鍵字的 SQL 語句。
  • 派生表(explain 輸出結果的 select_type 列的值為 DERIVED)。
  • 子查詢半連接物化(把子查詢結果存到臨時表,然后和主查詢進行 join 連接)。
  • 子查詢物化(除半連接物化之外的場景,如不相關子查詢,半連接重復值消除等)。
  • insert ... select 語句的源表和目標表是同一個表,例如:insert into t_recbuf(i1, str1) select i1, str1 from t_recbuf)。

以上羅列的場景以官方文檔為基礎,做了些改動。

大家不用糾結于是不是記住了上面這些場景,確定 SQL 語句是否使用了臨時表,查看執行計劃是最方便快捷的方法,只要 explain 輸出結果的 Extra 列出現了 Using temporary 那就是用了臨時表。

3、 臨時表用哪種存儲引擎?

MySQL 臨時表可以選擇 3 種存儲引擎:MEMORY、MyISAM、InnoDB。MEMORY 是內存引擎,數據和索引都存放在內存中;MyISAM、InnoDB 是磁盤存儲引擎,數據和索引都存放在磁盤中。

SQL 執行過程中,如果需要使用臨時表,MySQL 默認使用 MEMORY 存儲引擎。

有 2 種情況會影響 MySQL 的默認行為,以下 2 種情況滿足其中任何一種,臨時表就會使用 MyISAM 或 InnoDB 存儲引擎。

情況 1,寫入臨時表的字段中包含大對象(BLOB)字段。

關于哪些類型的字段屬于大對象,可以看看這篇文章:MySQL 大對象(BLOB)和字符串的分身術。

情況 2,系統變量 big_tables 的值為 ON,表示如果要使用臨時表,就一定要用 MyISAM 或 InnoDB 存儲引擎。

不過,在 big_tables = ON 的前提下,如果我們能夠非常確定某條 SQL 語句寫入臨時表的數據會很小,MEMORY 存儲引擎完全夠用,可以對單條 SQL 進行特殊處理。

在 SQL 語句中加入 SQL_SMALL_RESULT 提示,告訴 MySQL:我只需要 MEMORY 存儲引擎。SQL_SMALL_RESULT 是這樣用的:

select SQL_SMALL_RESULT * from t_recbuf

前面已經介紹完了 MySQL 怎么選擇內存、磁盤存儲引擎,如果 MySQL 決定了要使用磁盤存儲引擎,用 MyISAM 還是 InnoDB ?

這個選擇很簡單,系統變量 internal_tmp_disk_storage_engine 值為 MyISAM 就選擇 MyISAM 存儲引擎,值為 InnoDB 就使用 InnoDB 存儲引擎。

internal_tmp_disk_storage_engine 的值只能從 MyISAM、InnoDB 中二選一,默認為 InnoDB。

選擇存儲引擎

4、 內存臨時表變磁盤臨時表

MEMORY 存儲引擎表的記錄為固定長度,不支持大對象(BLOB)字段。

變長類型字段(VARCHAR、VARBINARY)也會按照定義時的最大長度存儲,實際上相當于 CHAR、BINARY 字段。

內存臨時表已插入記錄占用的空間,加上即將要插入的記錄占用的空間,如果超過閾值,臨時表的存儲引擎會由內存存儲引擎變為磁盤存儲引擎。

占用內存空間超過閾值

臨時表占用內存空間的閾值,由系統變量 tmp_table_size 和 max_heap_table_size 中較小的那個決定。

tmp_table_size 默認大小為 16M,最小可設置為 1K,最大值是個超級巨大的值。

max_heap_table_size 默認為大小為 16M,最小可設置為 16K,最大值也是超級巨大的值。

得益于 MEMORY 引擎的記錄長度固定,判斷內存臨時表占用的空間是否超過閾值就很簡單了。

臨時表存儲引擎變為磁盤存儲引擎的過程如下:

  • 創建一個 MyISAM 或 InnoDB 臨時表,選擇哪個存儲引擎由 internal_tmp_disk_storage_engine 控制。
  • 把內存臨時表中的所有記錄逐條拷貝到磁盤臨時表。
  • 把原計劃要插入內存臨時表但還沒插入的那條記錄插入磁盤臨時表。
  • 刪除內存臨時表。

創建磁盤臨時表

等內存臨時表寫滿,才知道需要創建磁盤臨時表,這樣成本太高了。如果一開始就知道 SQL 語句執行時需要使用臨時表,并且內存臨時表肯定存不下那么多記錄,我們直接告訴 MySQL 使用磁盤臨時表豈不是能節省很多開銷?

是的,如果我們一開就知道 SQL 語句數據量大會導致使用磁盤臨時表,在 SQL 語句中加上 SQL_BIG_RESULT (MySQL 里把這個叫做 hint),MySQL 為臨時表選擇存儲引擎時,就會直接選擇磁盤存儲引擎。

SQL_BIG_RESULT 是這樣用的:

select
SQL_BIG_RESULT e1, min(i1)
from t_internal_tmp_table
group by e1

如果我們在 SQL 語句中加入了 SQL_BIG_RESULT 提示,查詢優化器按使用磁盤臨時表評估執行成本,也有可能會得出使用磁盤臨時表的成本比對 t_internal_tmp_table 表中的記錄排序之后再進行 group by 的成本更高的結論,就會選擇先對 t_internal_tmp_table 表中的記錄進行排序,然后再對已經排好序的記錄進行 group by 操作,這樣一來內存臨時表和磁盤臨時表都不需要了。

5、寫入哪些字段到臨時表?

從寫入哪些字段到臨時表這個角度看,臨時表可以分為兩類:

  • 為整條 SQL 語句服務的臨時表。
  • 為單個聚合函數服務的臨時表。

對于為整條 SQL 語句服務的臨時表,SQL 語句執行過程中,存儲引擎返回給 server 層的字段都需要寫入到臨時表中。寫入到臨時表中的字段內容,可能是字段值,也可能是函數基于字段值計算的結果,以兩個 SQL 為例來說明。

select
e1, count(i1)
from t_internal_tmp_table
group by e1

示例 SQL 1,SQL 執行過程中,MySQL 會把 t_internal_tmp_table 表的 e1 字段值、count(i1) 的計算結果寫入到臨時表。

select 
a.e1, b.c1, count(a.i1) as t
from t_internal_tmp_table as a
inner join t_recbuf as b on a.id = b.id
group by a.e1, b.c1
with rollup

示例 SQL 2,由于 rollup 的存在,不能把聚合函數的計算結果寫入到臨時表,而是要把聚合函數參數中的字段值寫入到臨時表。

SQL 執行過程中,MySQL 會把 t_internal_tmp_table 表的 e1、i1 字段值,t_recbuf 表中的 c1 字段值寫入臨時表。

把 t_internal_tmp_table 和 t_recbuf 兩個表連接查詢得到的記錄全部寫入臨時表之后,再對臨時表中的記錄進行分組(group by)、聚合(count)操作。

對于為單個聚合函數服務的臨時表,SQL 語句執行過程中,只會把聚合函數中的字段寫入到臨時表,以一個 SQL 為例說明。

select
e1, count(distinct i1) as t
from t_internal_tmp_table
group by e1

示例 SQL 3,臨時表只用于為 count(distinct i1) 中的 i1 字段去重,所以臨時表中只會寫入 t_internal_tmp_table 表的 i1 字段值,并且會為臨時表中的 i1 字段建立唯一索引,實現對 i1 字段的去重。

6、為哪些字段建立索引?

MySQL 使用臨時表,可能是為了 group by 分組、聚合,也可能是為了對記錄去重(distinct),還有可能只是為了避免重復執行子查詢而存放子查詢的執行結果。

對于 group by 和 distinct,為了保證臨時表中 group by 的一個分組只有一條記錄,distinct 字段內容相同的記錄只保留一條,臨時表中會為相應的字段創建唯一索引。

非常重要的說明:臨時表中最多只會有一個索引,要么是為 group by 建立的索引,要么是為 distinct 建立的索引。

(1) group by

select
e1, count(i1)
from t_internal_tmp_table
group by e1

這是上一小節(5. 寫入哪些字段到臨時表?)的示例 SQL 1,臨時表中寫入 e1 字段值、count(i1) 的計算結果(每個分組中 i1 字段值不為 NULL 的記錄數量)。

MySQL 為了保證 e1 字段的每個值在臨時表中只有一條記錄,會為 e1 字段建立唯一索引,索引名是 。

臨時表 e1 字段上唯一索引的存在,就是為了保證每個分組中記錄的唯一性,保證唯一性的流程是這樣的:

第 1 步,從 t_internal_tmp_table 表中讀取一條記錄之后,用該記錄的 e1 字段值作為查詢條件,去臨時表中查詢是否有對應的記錄。

第 2 步,如果 e1 字段值對應的記錄在臨時表中已經存在,執行 count(i1) 函數得到當前分組新計數,然后把分組新計數更新到臨時表。

第 3 步,如果 e1 字段值對應的記錄在臨時表中還不存在,執行 count(i1) 函數初始化分組計數,然后把 e1 字段值和分組計數插入到臨時表中。

執行流程示意圖

(2) distinct

select
e1, count(distinct i1) as t
from t_internal_tmp_table
group by e1

這是上一小節(5. 寫入哪些字段到臨時表?)的示例 SQL 3,和示例 SQL 1 不一樣的地方是 count() 函數多了個 distinct,表示統計每個分組中,不同的 i1 字段值的數量(不包含 NULL)。

臨時表中寫入的字段只有 i1,為了保證臨時表的每個分組中 i1 字段值是唯一的,MySQL 會為 i1 字段建立唯一索引,索引名是 。

distinct 唯一索引的名字看起來有點詞不達意,源碼中說以后會改成 。

保證每個分組中 i1 字段的唯一性,執行流程是這樣的:

前奏,寫入數據到臨時表之前,MySQL 就已經讀取了 t_internal_tmp_table 表中的所記錄,并且已經按照 e1 字段排好了序。

第 1 步,讀取已經排好序的一條記錄,把 i1 字段值寫入到臨時表中(i1 字段值為 NULL 則不寫入)。

如果寫入成功,說明臨時表中還沒有該 i1 字段值對應的記錄。

如果寫入失敗,說明臨時表中已經有該 i1 字段值對應的記錄了,此時,寫入失敗的錯誤會被忽略,因為這正是我們想要的結果:對 i1 字段值去重。

插入操作直接利用了唯一索引中記錄不能重復的特性,雖然有點簡單粗暴,但也方便快捷。

第 2 步,判斷第 1 步讀取到的記錄的 e1 字段值和上一條記錄的 e1 字段值是否一樣。

如果一樣,說明是同一個分組,回到第 1 步繼續執行,寫入當前分組中下一條記錄的 i1 字段值到臨時表。

如果不一樣,說明當前分組結束,進入第 3 步處理分組結束邏輯。

第 3 步,獲取臨時表中的記錄數量,也就是分組中 i1 字段值不為 NULL 并且已經去重的數量,發送給客戶端。

這里獲取臨時表中的記錄數量很方便,不需要掃描臨時表中所有記錄進行計數,而是直接讀取臨時表的統計信息(stats.records)。

第 4 步,分組數據發送給客戶端之后,清空臨時表中的所有記錄,為下一個分組寫入 i1 字段值到臨時表做準備。

執行流程示意圖

(3) hash 字段

為 group by、distinct 字段建立唯一索引,能夠保證臨時表中記錄的唯一性,看起來已經很完美了。

不過,世間事總有例外,存儲引擎對于索引中的字段數量、單個字段長度、索引記錄長度都是有限制的,一旦超過限制創建索引就會失敗,也就不能為 group by、distinct 字段建立唯一索引了。

存儲引擎限制

不能為 group by、distinct 字段建立唯一索引,那怎么保證這兩種情況下記錄的唯一性?

別急,你永遠可以相信 MySQL 有大招。

如果因為超限問題,不能為 group by、distinct 字段建立唯一索引,MySQL 會在臨時表中增加一個哈希字段(字段名 ),并為這個字段建立非唯一索引(因為不同內容計算得到的哈希值有可能重復)。

字段值可能存在重復,那怎么保證臨時表中記錄的唯一性?流程是這樣的:

第 1 步,插入記錄到臨時表之前,計算 字段值,計算過程是這樣的:

計算 group by、distinct 每一個字段的哈希值

所有字段哈希值再經過計算得到的結果,作為 字段值。

第 2 步,用第 1 步中計算出來的 字段值作為查詢條件,到臨時表中查找記錄。

第 3 步,如果在臨時表中沒有找到記錄,說明記錄不存在,執行插入操作。

第 4 步,如果在臨時表中找到了記錄,把記錄讀取出來(存到 table->record[1] 中)。

這時候還不能說明 group by、distinct 字段對應的記錄在表中就是存在的,因為哈希值有可能重復。

第 5 步,把 group by 或 distinct 中的字段逐個和第 4 步讀出來的記錄中對應的字段進行比較。

如果有任何一個字段值不相等,說明 group by、distinct 字段對應的記錄在臨時表中不存在,執行插入操作。

如果所有字段值都相等,才能說明 group by、distinct 字段對應的記錄在臨時表中已經存在。

對于 group by,更新臨時表中對應的記錄;對于 distinct,準備要插入的記錄就可以忽略了,不需要進行插入操作。

group by 執行流程示意圖

distinct 執行流程示意圖

7、 內部臨時表使用情況統計

MySQL 每創建一個臨時表,狀態變量 created_tmp_tables 的值就加 1。

臨時表的存儲引擎由 MEMORY 替換為 MyISAM 或 InnoDB,狀態變量 created_tmp_disk_tables 的值就加 1。

created_tmp_disk_tables 除以 created_tmp_tables 得到的結果越大,說明創建的臨時表中,磁盤臨時表的比例越高。

減少內存臨時表轉換為磁盤臨時表,有兩種可能的優化方案:

降低內存臨時表轉換為磁盤臨時表的比例:修改系統變量 tmp_table_size 和 max_heap_table_size 的值,讓臨時表可以使用更多的內存,減少這種轉換。

強制臨時表使用磁盤存儲引擎:如果業務類型比較特殊,臨時表的數據不可避免的會很大,加大臨時表占用內存的閾值效果不明顯的情況下,把系統變量 big_tables 的值設置為 ON,強制內部臨時表使用磁盤存儲引擎,可以避免不必要的內存臨時表轉換為磁盤臨時表。

8、 總結

第 2 小節,列出了 MySQL 使用臨時表的部分場景,這些場景反正也記不住,就不用記了,了解下就好。理解了臨時表的用途和 SQL 語句的執行過程,大體上也能推斷出來是否會用到臨時表,再結合 explain 查看執行計劃就能知道結果了。

第 3 小節,介紹了臨時表的默認存儲引擎為 MEMORY,如果寫入臨時表的字段包含大對象(BLOB)字段,或者系統變量 big_tables 的值為 ON,會根據系統變量 internal_tmp_disk_storage_engine 的值選擇使用 MyISAM 或 InnoDB 作為臨時表的存儲引擎。

第 4 小節,介紹了內存臨時表占用空間超過 tmp_table_size 和 max_heap_table_size 中較小的那個值時,會把內存臨時表替換為磁盤臨時表。如果想要指定單條 SQL 語句直接使用磁盤臨時表,可以在 SQL 語句中加入 SQL_BIG_RESULT 提示。

第 5 小節,介紹了臨時表中會寫入哪些字段。對于 group by,臨時表中會寫入存儲引擎返回給 server 層的所有字段,寫入臨時表的字段內容,可能是字段值,也可能是聚合函數基于字段值計算的結果;對于 distinct,臨時表中會寫入聚合函數中的字段。

第 6 小節,介紹了臨時表中會為 group by、distinct 字段建立唯一索引,如果 group by 或 distinct 索引字段數量、單個字段長度、索引記錄長度超過了限制,就不建立唯一索引了,會在臨時表中增加一個名為 的字段,并在該字段上建立非唯一索引。

第 7 小節,介紹了 2 個系統變量 created_tmp_tables、created_tmp_disk_tables 可以用于查看 MySQL 臨時表的使用情況,以及可以通過調整 tmp_table_size、max_heap_table_size、big_tables 這 3 個系統變量,減少或避免內存臨時表轉換為磁盤臨時表。

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

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

2022-06-21 15:38:54

MySQLSQL臨時表

2025-07-10 00:00:00

2015-11-11 14:25:26

2010-11-24 10:05:20

mysql創建臨時表

2024-10-17 16:17:21

MySQL臨時表數據庫

2010-11-22 15:19:28

Mysql臨時表

2010-10-13 16:25:44

MySQL臨時表

2010-05-17 16:31:48

Mysql臨時表

2010-10-15 11:27:21

Mysql臨時表

2010-05-19 09:01:14

MySQL臨時表

2018-01-10 13:40:03

數據庫MySQL表設計

2020-12-29 08:47:45

緩沖SQL磁盤

2010-05-31 15:49:29

MySQL臨時表

2023-02-21 17:06:49

硬件軟件系統

2011-04-13 13:56:52

Oracle臨時表

2021-05-06 08:28:04

mq中間件消息中間件

2010-09-16 17:56:31

SQL server臨

2010-09-16 15:03:10

SQL Server臨

2011-09-02 14:45:43

Oracle臨時表SQL Server臨

2020-10-29 09:10:06

MySQL
點贊
收藏

51CTO技術棧公眾號

九一亚洲精品| 精品国产乱码一区二区三| 蜜桃精品噜噜噜成人av| 91九色最新地址| 国产又粗又硬又长| 人妻视频一区二区三区| 日本成人超碰在线观看| 欧美成人免费一级人片100| 在线看黄色的网站| 日韩精品免费观看视频| 亚洲欧美激情视频在线观看一区二区三区| 国产98在线|日韩| 成人毛片18女人毛片| 日韩大片在线| 亚洲第一中文字幕| 色婷婷成人在线| 国产盗摄精品一区二区酒店| 久久免费电影网| 91青青草免费观看| 国产三级理论片| 亚洲三级国产| 日韩中文字幕视频| 丝袜美腿中文字幕| 亚洲日本va中文字幕| 欧美亚男人的天堂| 116极品美女午夜一级| 黄色网页在线看| 国产午夜精品久久久久久久| 国产伦精品一区二区三| 国产99久久久久久免费看| 亚洲高清自拍| 久久亚洲欧美日韩精品专区| www色com| 欧美猛男做受videos| 精品国产乱码久久久久久闺蜜| 91淫黄看大片| 在线观看日韩羞羞视频| 五月婷婷综合网| 国产97在线亚洲| 久久久久无码国产精品| 欧美激情电影| 一本色道久久综合亚洲精品小说| 欧类av怡春院| julia中文字幕一区二区99在线| 777xxx欧美| 中文字幕第80页| 桃花岛成人影院| 色综合久久久久综合99| 一本一本大道香蕉久在线精品 | 日本欧美大码aⅴ在线播放| 欧美激情在线一区| 久久精品黄色片| 国产精品久久久久久影院8一贰佰| 亚洲欧洲美洲在线综合| 欧美老熟妇乱大交xxxxx| 色吊丝一区二区| 亚洲成人a级网| 亚洲精品第二页| 1204国产成人精品视频| 91精品国产欧美一区二区成人| www.亚洲高清| 欧洲亚洲精品| 69久久夜色精品国产69蝌蚪网| 日韩中文字幕a| 欧美成人黄色| 欧美一三区三区四区免费在线看| 亚洲精品mv在线观看| 激情不卡一区二区三区视频在线 | 丰满大乳国产精品| 成a人片亚洲日本久久| 精品国产乱码一区二区三区四区 | 中文字幕欧美日韩在线| 五月天免费网站| 伊人久久大香线| 欧美激情在线播放| 黄色在线视频网址| 美女一区二区三区在线观看| 成人亚洲激情网| 丁香六月天婷婷| 久久久青草青青国产亚洲免观| 日韩在线电影一区| 久久五月精品| 午夜伊人狠狠久久| 国产欧美高清在线| 日韩伦理一区二区| 欧美大肚乱孕交hd孕妇| 五月开心播播网| 日韩精品欧美| 久久久久久成人精品| 在线观看亚洲欧美| 久久99精品国产麻豆婷婷| av资源站久久亚洲| 国产免费av在线| 亚洲精品免费视频| 精品欧美一区免费观看α√| jizzyou欧美16| 欧美一区二区黄色| 中文字幕一区二区人妻在线不卡| 日韩欧美一区二区三区免费看| 欧美黑人视频一区| 天天射天天干天天| 国产jizzjizz一区二区| 无码免费一区二区三区免费播放 | 国产系列在线观看| 一区二区成人在线视频| 免费高清在线观看免费| 成人日韩视频| 亚洲人成在线观| 青青草成人免费| 日韩国产欧美视频| 国产一区二区高清不卡| 秋霞午夜理伦电影在线观看| 精品国产91久久久| 国产精品嫩草影视| 不卡在线一区二区| 91禁外国网站| www.日韩高清| 亚洲国产精品传媒在线观看| 久久人人爽人人爽人人av| 男人天堂久久| 亚洲毛片一区二区| 日本三级片在线观看| 精品亚洲免费视频| 日韩性感在线| 在线人成日本视频| 亚洲电影成人av99爱色| 2021亚洲天堂| 久草热8精品视频在线观看| 秋霞在线观看一区二区三区| 8x8ⅹ拨牐拨牐拨牐在线观看| 9191久久久久久久久久久| 精品无人区无码乱码毛片国产| 狠色狠色综合久久| 2014国产精品| 国产麻豆xxxvideo实拍| 色yeye免费人成网站在线观看| 在线观看av一区| 朝桐光av一区二区三区| 国内揄拍国内精品久久| 国产欧美在线看| 91高清在线| 91福利小视频| 88久久精品无码一区二区毛片| 9色精品在线| 精品日本一区二区| 99re6在线精品视频免费播放| 精品va天堂亚洲国产| 久久精品一级片| 国产成人无遮挡在线视频| 亚洲免费视频播放| 久久久久毛片免费观看| 美女啪啪无遮挡免费久久网站| 国产又大又黄的视频| 国产精品久久久久婷婷二区次| 国产aaaaa毛片| 国产麻豆精品久久| 国产精品精品视频一区二区三区| 二人午夜免费观看在线视频| 欧美系列一区二区| 萌白酱视频在线| 国产精品一区免费在线观看| 免费极品av一视觉盛宴| 国产精品高清一区二区| 欧美激情一区二区久久久| 欧美在线 | 亚洲| 欧美日韩一区二区免费视频| 免费在线观看你懂的| 日韩在线a电影| 亚洲砖区区免费| 欧州一区二区三区| 97婷婷涩涩精品一区| 免费黄色片在线观看| 欧美午夜在线一二页| 娇小11一12╳yⅹ╳毛片| 国产一区在线观看视频| 成人性做爰片免费视频| 精品国产导航| 国产精品美女呻吟| av色综合久久天堂av色综合在| 欧美本精品男人aⅴ天堂| 日产亚洲一区二区三区| 久久色视频免费观看| 久久婷五月综合| 欧美性久久久| 日本成人三级电影网站| 精品伊人久久| 91精品国产一区| 91在线视频| 精品日韩欧美在线| 少妇一级淫片日本| 亚洲韩国精品一区| 亚洲最大成人综合网| 国产激情精品久久久第一区二区| 浮妇高潮喷白浆视频| 久久日文中文字幕乱码| 国产精品国产亚洲精品看不卡15| 欧美香蕉视频| 欧美黄色三级网站| 风间由美一区| 亚洲精品国产精品自产a区红杏吧 亚洲精品国产精品乱码不99按摩 亚洲精品国产精品久久清纯直播 亚洲精品国产精品国自产在线 | 国产女主播喷水视频在线观看| 亚洲欧美电影院| 国产黄片一区二区三区| 国产成人av电影在线| 亚洲 欧美 另类人妖| 亚洲国产专区| 中文字幕在线乱| 精品久久成人| 精品国产日本| 日本免费一区二区视频| 国产精品视频成人| 午夜欧美激情| 欧美激情xxxxx| 日本三级视频在线观看| 亚洲人成免费电影| 日本黄色免费视频| 日韩一级大片在线观看| 亚洲精品国产精品乱码视色| 精品国产91久久久| 久久久久久久黄色| 综合分类小说区另类春色亚洲小说欧美| 偷拍女澡堂一区二区三区| 国产电影精品久久禁18| 91国内在线播放| 日韩极品在线观看| 69堂免费视频| 悠悠资源网久久精品| 在线视频一二三区| 天堂美国久久| 亚洲欧美日韩在线综合| 精品国产欧美日韩| 久久综合毛片| 天海翼亚洲一区二区三区| 动漫精品视频| 在线综合色站| 91久久精品www人人做人人爽| 国产乱子精品一区二区在线观看| 国产不卡精品视男人的天堂| 热色播在线视频| 久久久久久久久久久国产| 色yeye免费人成网站在线观看| 久久亚洲精品成人| av大大超碰在线| 另类美女黄大片| 国产在线激情| 欧美成年人视频| 怡红院av在线| 欧美激情一级二级| 人在线成免费视频| 国产91精品高潮白浆喷水| 亚洲午夜天堂| 国产mv免费观看入口亚洲| 91福利精品在线观看| 国产精品偷伦免费视频观看的| 欧美成人一二区| 亚洲自拍av在线| 97品白浆高清久久久久久| 成人精品水蜜桃| 综合激情网...| 久久精品国产第一区二区三区最新章节 | 国产女主播一区二区| 国内毛片久久| 乱一区二区三区在线播放| 视频一区中文| 亚洲一区二区三区加勒比| 亚洲成人精选| 男人添女人荫蒂免费视频| 在线视频日韩| 天堂社区在线视频| 韩国成人在线视频| 国产精品一区二区在线免费观看| 99精品国产视频| 你懂得视频在线观看| 亚洲码国产岛国毛片在线| 一级aaa毛片| 在线日韩国产精品| 国产精品午夜福利| 亚洲精品mp4| 日韩成人影视| 97国产精品免费视频| 欧亚一区二区| 97久草视频| 女厕嘘嘘一区二区在线播放 | 日韩午夜av电影| 日韩毛片在线一区二区毛片| 色悠悠国产精品| 国产精品探花在线| 国产成人精品在线播放| 精品国产一区二| 欧美日韩日本网| 亚洲一级淫片| 日本熟妇人妻xxxxx| 国产精品小仙女| 久久久久久久久久久久久久久| 亚洲日本乱码在线观看| 午夜婷婷在线观看| 欧美一级专区免费大片| 国产youjizz在线| 欧美国产日韩一区二区在线观看| 美女网站视频一区| 成人自拍爱视频| 91综合在线| 日本不卡在线观看视频| 国产精一区二区三区| 一区二区伦理片| 亚洲高清免费一级二级三级| 在线免费观看视频网站| 日韩av综合网站| 在线h片观看| 国产精品自产拍在线观| 清纯唯美亚洲经典中文字幕| 日韩不卡一二区| 免费视频最近日韩| 久久人人爽人人爽人人片| 一区二区三区资源| 亚洲天堂avav| 亚洲欧洲激情在线| 麻豆mv在线看| 国产精品一区在线观看| 一区二区免费不卡在线| 久久久久国产一区| 久久精品欧美一区二区三区不卡| 国产在线观看成人| 日韩亚洲欧美在线| 精品视频在线一区二区| 国产精品极品美女粉嫩高清在线| 日韩成人av在线资源| 国产一二三在线视频| 国产经典欧美精品| 国产午夜精品理论片| 欧美日韩在线三区| 成人免费在线视频网| 欧美又大又粗又长| 色吊丝一区二区| 国产视频九色蝌蚪| 成人av在线资源网站| 久久精品欧美一区二区| 日韩免费视频线观看| 18视频在线观看| 亚洲自拍偷拍区| 午夜久久tv| 久久久久久久穴| 亚洲成人手机在线| 日韩在线观看视频一区二区三区 | 久久机热这里只有精品| 日韩欧美一区二区不卡| 亚洲无线看天堂av| 97人人模人人爽人人喊38tv| 欧美1区2区3区| 亚洲国产欧美日韩在线| 一区二区三区在线高清| 精品久久久无码中文字幕| 美女啪啪无遮挡免费久久网站| 日韩精品免费视频一区二区三区| 成人手机视频在线| 国产一区美女在线| 久久国产精品波多野结衣| 欧美不卡视频一区| 免费v片在线观看| 欧美久久电影| 美日韩一区二区三区| 91gao视频| 国产毛片毛片毛片毛片毛片| 亚洲一区日韩在线| 国产性生交xxxxx免费| 久久久精品免费观看| 久久精品99北条麻妃| 日韩日本欧美亚洲| 国产不卡精品| 欧美男女爱爱视频| 国产夜色精品一区二区av| 伊人久久国产精品| 欧美成人午夜影院| 黄色欧美在线| chinese少妇国语对白| 国产精品电影院| 亚洲精品无遮挡| 国产97色在线| 在线看片不卡| 国产高清自拍视频| 欧美日韩精品系列| 欧美1234区| 日本精品二区| 国产精品一二三四区| 久久99国产综合精品免费| www国产精品视频| 红杏成人性视频免费看| 久久黄色免费看| 亚洲精品成人少妇| 三级在线观看| 91免费国产网站| 免费欧美在线| 老熟妇高潮一区二区三区| 亚洲精品国产精品久久清纯直播| 久久xxx视频| 亚洲国产精品成人天堂| 国产精品视频第一区| 手机看片国产1024| 国产日韩专区在线| 亚洲免费婷婷|