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

炸!使用 MyBatis 查詢千萬數據量?

運維 數據庫運維
由于現在 ORM 框架的成熟運用,很多小伙伴對于 JDBC 的概念有些薄弱,ORM 框架底層其實是通過 JDBC 操作的 DB。

[[374269]]

本文轉載自微信公眾號「源碼興趣圈」,作者馬稱 。轉載本文請聯系源碼興趣圈公眾號。  

 由于現在 ORM 框架的成熟運用,很多小伙伴對于 JDBC 的概念有些薄弱,ORM 框架底層其實是通過 JDBC 操作的 DB

JDBC(JavaDataBase Connectivity)是 Java 數據庫連接, 說的直白點就是使用 Java 語言操作數據庫

由 SUN 公司提供出一套訪問數據庫的規范 API, 并提供相對應的連接數據庫協議標準, 然后 各廠商根據規范提供一套訪問自家數據庫的 API 接口

文章大數據量操作核心圍繞 JDBC 展開,目錄結構如下:

  • MySQL JDBC 大數據量操作
    • 常規查詢
    • 流式查詢
    • 游標查詢
    • JDBC RowData
    • JDBC 通信原理
  • 流式游標內存分析
    • 單次調用內存使用
    • 并發調用內存使用
  • MyBatis 如何使用流式查詢
  • 結言

MySql JDBC 大數據量操作

整篇文章以大數據量操作為議題,通過開發過程中的需求引出相關知識點

  1. 遷移數據
  2. 導出數據
  3. 批量處理數據

一般而言筆者認為在 Java Web 程序里,能夠被稱為大數據量的,幾十萬到千萬不等,再高的話 Java(WEB 應用)處理就不怎么合適了

舉個例子,現在業務系統需要從 MySQL 數據庫里讀取 500w 數據行進行處理,應該怎么做

  1. 常規查詢,一次性讀取 500w 數據到 JVM 內存中,或者分頁讀取
  2. 流式查詢,建立長連接,利用服務端游標,每次讀取一條加載到 JVM 內存
  3. 游標查詢,和流式一樣,通過 fetchSize 參數,控制一次讀取多少條數據

常規查詢

默認情況下,完整的檢索結果集會將其存儲在內存中。在大多數情況下,這是最有效的操作方式,并且由于 MySQL 網絡協議的設計,因此更易于實現

假設單表 500w 數據量,沒有人會一次性加載到內存中,一般會采用分頁的方式

  1. @SneakyThrows 
  2. @Override 
  3. public void pageQuery() { 
  4.     @Cleanup Connection conn = dataSource.getConnection(); 
  5.     @Cleanup Statement stmt = conn.createStatement(); 
  6.     long start = System.currentTimeMillis(); 
  7.     long offset = 0; 
  8.     int size = 100; 
  9.     while (true) { 
  10.         String sql = String.format("SELECT COLUMN_A, COLUMN_B, COLUMN_C FROM YOU_TABLE LIMIT %s, %s", offset, size); 
  11.         @Cleanup ResultSet rs = stmt.executeQuery(sql); 
  12.         long count = loopResultSet(rs); 
  13.         if (count == 0) break; 
  14.         offset += size
  15.     } 
  16.  
  17.     log.info("  🚀🚀🚀 分頁查詢耗時 :: {} ", System.currentTimeMillis() - start); 

上述方式比較簡單,但是在不考慮 LIMIT 深分頁優化情況下,線上數據庫服務器就涼了,亦或者你能等個幾天時間檢索數據

流式查詢

如果你正在使用具有大量數據行的 ResultSet,并且無法在 JVM 中為其分配所需的內存堆空間,則可以告訴驅動程序從結果流中返回一行

流式查詢有一點需要注意:必須先讀取(或關閉)結果集中的所有行,然后才能對連接發出任何其他查詢,否則將引發異常

使用流式查詢,則要保持對產生結果集的語句所引用的表的并發訪問,因為其 查詢會獨占連接,所以必須盡快處理

  1. @SneakyThrows 
  2. public void streamQuery() { 
  3.     @Cleanup Connection conn = dataSource.getConnection(); 
  4.     @Cleanup Statement stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); 
  5.     stmt.setFetchSize(Integer.MIN_VALUE); 
  6.  
  7.    long start = System.currentTimeMillis(); 
  8.     @Cleanup ResultSet rs = stmt.executeQuery("SELECT COLUMN_A, COLUMN_B, COLUMN_C FROM YOU_TABLE"); 
  9.     loopResultSet(rs); 
  10.     log.info("  🚀🚀🚀 流式查詢耗時 :: {} ", (System.currentTimeMillis() - start) / 1000); 

流式查詢庫表數據量 500w 單次調用時間消耗:≈ 6s

游標查詢

SpringBoot 2.x 版本默認連接池為 HikariPool,連接對象是 HikariProxyConnection,所以下述設置游標方式就不可行了

  1. ((JDBC4Connection) conn).setUseCursorFetch(true); 

需要在數據庫連接信息里拼接 &useCursorFetch=true。其次設置 Statement 每次讀取數據數量,比如一次讀取 1000

  1. @SneakyThrows 
  2. public void cursorQuery() { 
  3.     @Cleanup Connection conn = dataSource.getConnection(); 
  4.     @Cleanup Statement stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); 
  5.     stmt.setFetchSize(1000); 
  6.  
  7.     long start = System.currentTimeMillis(); 
  8.     @Cleanup ResultSet rs = stmt.executeQuery("SELECT COLUMN_A, COLUMN_B, COLUMN_C FROM YOU_TABLE"); 
  9.     loopResultSet(rs); 
  10.     log.info("  🚀🚀🚀 游標查詢耗時 :: {} ", (System.currentTimeMillis() - start) / 1000); 

游標查詢庫表數據量 500w 單次調用時間消耗:≈ 18s

JDBC RowData

上面都使用到了方法 loopResultSet,方法內部只是進行了 while 循環,常規、流式、游標查詢的核心點在于 next 方法

  1. @SneakyThrows 
  2. private Long loopResultSet(ResultSet rs) { 
  3.     while (rs.next()) { 
  4.     // 業務操作 
  5.     } 
  6.     return xx; 

ResultSet.next() 的邏輯是實現類 ResultSetImpl 每次都從 RowData 獲取下一行的數據。RowData 是一個接口,實現關系圖如下

默認情況下 ResultSet 會使用 RowDataStatic 實例,在生成 RowDataStatic 對象時就會把 ResultSet 中所有記錄讀到內存里,之后通過 next() 再一條條從內存中讀

RowDataCursor 的調用為批處理,然后進行內部緩存,流程如下:

  1. 首先會查看自己內部緩沖區是否有數據沒有返回,如果有則返回下一行
  2. 如果都讀取完畢,向 MySQL Server 觸發一個新的請求讀取 fetchSize 數量結果
  3. 并將返回結果緩沖到內部緩沖區,然后返回第一行數據

當采用流式處理時,ResultSet 使用的是 RowDataDynamic 對象,而這個對象 next() 每次調用都會發起 IO 讀取單行數據

總結來說就是,默認的 RowDataStatic 讀取全部數據到客戶端內存中,也就是我們的 JVM;RowDataCursor 一次讀取 fetchSize 行,消費完成再發起請求調用;RowDataDynamic 每次 IO 調用讀取一條數據

JDBC 通信原理

普通查詢

在 JDBC 與 MySQL 服務端的交互是通過 Socket 完成的,對應到網絡編程,可以把 MySQL 當作一個 SocketServer,因此一個完整的請求鏈路應該是:

JDBC 客戶端 -> 客戶端 Socket -> MySQL -> 檢索數據返回 -> MySQL 內核 Socket 緩沖區 -> 網絡 -> 客戶端 Socket Buffer -> JDBC 客戶端

普通查詢的方式在查詢大數據量時,所在 JVM 可能會涼涼,原因如下:

  1. MySQL Server 會將檢索出的 SQL 結果集通過輸出流寫入到內核對應的 Socket Buffer
  2. 內核緩沖區通過 JDBC 發起的 TCP 鏈路進行回傳數據,此時數據會先進入 JDBC 客戶端所在內核緩沖區
  3. JDBC 發起 SQL 操作后,程序會被阻塞在輸入流的 read 操作上,當緩沖區有數據時,程序會被喚醒進而將緩沖區數據讀取到 JVM 內存中
  4. MySQL Server 會不斷發送數據,JDBC 不斷讀取緩沖區數據到 Java 內存中,雖然此時數據已到 JDBC 所在程序本地,但是 JDBC 還沒有對 execute 方法調用處進行響應,因為需要等到對應數據讀取完畢才會返回
  5. 弊端就顯而易見了,如果查詢數據量過大,會不斷經歷 GC,然后就是內存溢出

游標查詢

通過上文得知,游標可以解決普通查詢大數據量的內存溢出問題,但是

小伙伴有沒有思考過這么一個問題,MySQL 不知道客戶端程序何時消費完成,此時另一連接對該表造成 DML 寫入操作應該如何處理?

其實,在我們使用游標查詢時,MySQL 需要建立一個臨時空間來存放需要被讀取的數據,所以不會和 DML 寫入操作產生沖突

但是游標查詢會引發以下現象:

  1. IOPS 飆升,因為需要返回的數據需要寫入到臨時空間中,存在大量的 IO 讀取和寫入,此流程可能會引起其它業務的寫入抖動
  2. 磁盤空間飆升,因為寫入臨時空間的數據是在原表之外的,如果表數據過大,極端情況下可能會導致數據庫磁盤寫滿,這時網絡輸出時沒有變化的。而寫入臨時空間的數據會在 讀取完成或客戶端發起 ResultSet#close 操作時由 MySQL 回收
  3. 客戶端 JDBC 發起 SQL 查詢,可能會有長時間等待 SQL 響應,這段時間為服務端準備數據階段。但是 普通查詢等待時間與游標查詢等待時間原理上是不一致的,前者是一致在讀取網絡緩沖區的數據,沒有響應到業務層面;后者是 MySQL 在準備臨時數據空間,沒有響應到 JDBC
  4. 數據準備完成后,進行到傳輸數據階段,網絡響應開始飆升,IOPS 由"讀寫"轉變為"讀取"

采用游標查詢的方式 通信效率比較低,因為客戶端消費完 fetchSize 行數據,就需要發起請求到服務端請求,在數據庫前期準備階段 IOPS 會非常高,占用大量的磁盤空間以及性能

流式查詢

當客戶端與 MySQL Server 端建立起連接并且交互查詢時,MySQL Server 會通過輸出流將 SQL 結果集返回輸出,也就是 向本地的內核對應的 Socket Buffer 中寫入數據,然后將內核中的數據通過 TCP 鏈路回傳數據到 JDBC 對應的服務器內核緩沖區

  1. JDBC 通過輸入流 read 方法去讀取內核緩沖區數據,因為開啟了流式讀取,每次業務程序接收到的數據只有一條
  2. MySQL 服務端會向 JDBC 代表的客戶端內核源源不斷的輸送數據,直到客戶端請求 Socket 緩沖區滿,這時的 MySQL 服務端會阻塞
  3. 對于 JDBC 客戶端而言,數據每次讀取都是從本機器的內核緩沖區,所以性能會更快一些,一般情況不必擔心本機內核無數據消費(除非 MySQL 服務端傳遞來的數據,在客戶端不做任何業務邏輯,拿到數據直接放棄,會發生客戶端消費比服務端超前的情況)

看起來,流式要比游標的方式更好一些,但是事情往往不像表面上那么簡單

  1. 相對于游標查詢,流式對數據庫的影響時間要更長一些
  2. 另外流式查詢依賴網絡,導致網絡擁塞可能性較大

流式游標內存分析

表數據量:500w

內存查看工具:JDK 自帶 Jvisualvm

設置 JVM 參數:-Xmx512m -Xms512m

單次調用內存使用

流式查詢內存性能報告如下

圖1 數據僅供參考

游標查詢內存性能報告如下

圖2 數據僅供參考

根據內存占用情況來看,游標查詢和流式查詢都 能夠很好的防止 OOM

并發調用內存使用

并發調用:Jmete 1 秒 10 個線程并發調用

流式查詢內存性能報告如下

圖3 數據僅供參考

并發調用對于內存占用情況也很 OK,不存在疊加式增加

流式查詢并發調用時間平均消耗:≈ 55s

游標查詢內存性能報告如下

圖4 數據僅供參考

游標查詢并發調用時間平均消耗:≈ 83s

因為設備限制,以及部分情況只會在極端下產生,所以沒有進行生產、測試多環境驗證,小伙伴感興趣可以自行測試

MyBatis 如何使用流式查詢

上文都是在描述如何使用 JDBC 原生 API 進行查詢,ORM 框架 Mybatis 也針對流式查詢進行了封裝

ResultHandler 接口只包含 handleResult 方法,可以獲取到已轉換后的 Java 實體類

  1. @Slf4j 
  2. @Service 
  3. public class MyBatisStreamService { 
  4.     @Resource 
  5.     private MyBatisStreamMapper myBatisStreamMapper; 
  6.  
  7.     public void mybatisStreamQuery() { 
  8.         long start = System.currentTimeMillis(); 
  9.         myBatisStreamMapper.mybatisStreamQuery(new ResultHandler<YOU_TABLE_DO>() { 
  10.             @Override 
  11.             public void handleResult(ResultContext<? extends YOU_TABLE_DO> resultContext) { } 
  12.         }); 
  13.         log.info("  🚀🚀🚀 MyBatis查詢耗時 :: {} ", System.currentTimeMillis() - start); 
  14.     } 

除了下述注解式的應用方式,也可以使用 .xml 文件的形式

  1. @Mapper 
  2. public interface MyBatisStreamMapper { 
  3.     @Options(resultSetType = ResultSetType.FORWARD_ONLY, fetchSize = Integer.MIN_VALUE) 
  4.     @ResultType(YOU_TABLE_DO.class) 
  5.     @Select("SELECT COLUMN_A, COLUMN_B, COLUMN_C FROM YOU_TABLE"
  6.     void mybatisStreamQuery(ResultHandler<YOU_TABLE_DO> handler); 

Mybatis 流式查詢調用時間消耗:≈ 18s

  1. JDBC 流式與 MyBatis 封裝的流式讀取對比
  2. MyBatis 相對于原生的流式還是慢上了不少,但是考慮到底層的封裝的特性,這點性能還是可以接受的
  3. 從內存占比而言,兩者波動相差無幾

MyBatis 相對于原生 JDBC 更為的方便,因為封裝了回調函數以及序列化對象等特性

兩者具體的使用,可以針對項目實際情況而定,沒有最好的,只有最適合的

結言

流式查詢、游標查詢可以避免 OOM,數據量大可以考慮此方案。但是這兩種方式會占用數據庫連接,使用中不會釋放,所以線上針對大數據量業務用到游標和流式操作,一定要進行并發控制

另外針對 JDBC 原生流式查詢,Mybatis 中也進行了封裝,雖然會慢一些,但是 功能以及代碼的整潔程度會好上不少

作者馬稱,坐標帝都 Java 后端研發,專注高并發、分布式、框架底層源碼等知識分享

 

責任編輯:武曉燕 來源: 源碼興趣圈
相關推薦

2018-07-11 20:07:06

數據庫MySQL索引優化

2022-12-28 08:29:12

CKESRediSearch

2022-10-14 17:24:35

MySQLSQL優化

2022-09-08 09:35:22

數據查詢

2011-04-18 11:13:41

bcp數據導入導出

2018-09-06 16:46:33

數據庫MySQL分頁查詢

2018-06-01 09:42:43

數據Spark規模

2009-12-08 09:21:13

WCF數據量

2025-04-14 08:30:00

架構分庫查詢

2013-11-20 16:29:41

SAP中國商業同略會DVM

2024-01-29 08:45:38

MySQL大數據分頁

2024-01-23 12:56:00

數據庫微服務MySQL

2013-01-11 09:39:56

WLAN3GLTE

2011-03-03 10:32:07

Mongodb億級數據量

2025-10-11 09:33:39

MySQL平滑擴容架構

2009-12-08 15:19:58

WCF大數據量

2022-10-25 07:24:23

數據庫TiDBmysql

2010-07-29 13:30:54

Hibari

2010-12-01 09:18:19

數據庫優化

2015-03-21 06:19:53

數據路由
點贊
收藏

51CTO技術棧公眾號

筱崎爱全乳无删减在线观看 | 黄色成人小视频| 91在线视频网址| 日本国产欧美一区二区三区| av网站免费在线看| yw.尤物在线精品视频| 欧美激情中文字幕| 97超级碰碰| 精品人妻一区二区三区免费看 | 牛人盗摄一区二区三区视频| 少妇无套内谢久久久久| 在线成人激情| 日韩视频一区二区三区| 亚洲人成无码网站久久99热国产| 麻豆影视在线| 韩国v欧美v日本v亚洲v| 国内精品久久影院| 97人妻人人揉人人躁人人| 成人在线观看免费视频| 一区二区免费在线播放| 欧美一区二区视频17c| av中文字幕免费在线观看| 亚洲精品色图| 久久精品99久久久久久久久 | 亚洲欧美日本国产| 一本色道久久综合精品竹菊| 亚洲综合第一| 性感美女福利视频| 国产一区三区三区| 欧美一区二区色| 人妻久久一区二区| 精品日韩免费| 亚洲福利视频在线| 久久久久xxxx| 欧美成a人片在线观看久| 一区二区三区精品视频| 亚洲欧美丝袜| 国产玉足榨精视频在线观看| 国产精品性做久久久久久| 国产91色在线| 男女啊啊啊视频| 午夜精品偷拍| 综合网中文字幕| 少妇特黄一区二区三区| 国产日韩中文在线中文字幕| 91福利在线免费观看| 水蜜桃色314在线观看| 午夜影院免费在线| 亚洲欧洲精品天堂一级 | 国产成人avxxxxx在线看| 亚洲国产精一区二区三区性色| 欧美黄色录像片| 国产一区二区三区三区在线观看 | 日韩福利影视| 欧亚一区二区三区| 白嫩少妇丰满一区二区| brazzers在线观看| 亚洲一区二区精品3399| 国产免费xxx| 国产日产一区二区| 亚洲青青青在线视频| 欧美在线日韩精品| 色在线免费视频| 成人一道本在线| 成人在线观看91| 国产激情无套内精对白视频| 精品中文字幕一区二区| 久久国产亚洲精品无码| 成人福利免费观看| 婷婷综合在线视频| 国内精品久久久久久久久电影网| 亚洲黄在线观看| www.男人天堂| 日本韩国欧美超级黄在线观看| 亚洲成avwww人| 在线xxxxx| 韩国女主播一区二区三区| 亚洲精品在线三区| 成人在线视频免费播放| 在线亚洲a色| 国产亚洲xxx| 成人做爰视频网站| 在线观看免费一区二区| 欧美激情女人20p| 日韩精品一区二区三| 免费中文字幕日韩欧美| 青青久久aⅴ北条麻妃| 久久久精品免费看| a91a精品视频在线观看| 日本高清久久天堂| 中文字幕欧美人妻精品一区蜜臀| 另类专区欧美蜜桃臀第一页| 国产区精品视频| 国产福利免费视频| 成人精品国产一区二区4080| 精品国产一区二区三| 免费看男男www网站入口在线| 国产夜色精品一区二区av| 亚洲看片网站| 欧美色图天堂| 日韩欧美在线看| 热久久久久久久久| 国产厕拍一区| 中文字幕日韩精品在线观看| 超碰97av在线| 五月开心六月丁香综合色啪| www.亚洲天堂| 日韩少妇裸体做爰视频| 日本在线不卡一区| 99久久精品免费看国产一区二区三区| 瑟瑟在线观看| 一区二区三区在线看| 亚洲午夜无码av毛片久久| 国产国产一区| 亚洲福利视频网| 国产精品久久国产精麻豆96堂| 国产一区美女| 国产精品免费一区豆花| 丰满肥臀噗嗤啊x99av| 久久久久成人黄色影片| 免费网站永久免费观看| www.成人在线视频| 亚洲国产精品字幕| 91嫩草丨国产丨精品| 久久精品电影| 国产99在线免费| 色一情一乱一乱一区91av| 国产精品无圣光一区二区| 免费人成自慰网站| 欧美视频在线视频精品| 日韩成人高清在线| 欧美日韩激情在线观看| 美日韩一级片在线观看| 久久综合一区| 男女免费观看在线爽爽爽视频| 在线视频你懂得一区| 91传媒理伦片在线观看| 欧美在线亚洲| 国产精品一区二区三区毛片淫片| 亚洲免费视频网| 国产精品国产a级| 18岁视频在线观看| 欧美韩一区二区| 欧美激情视频在线观看| 亚洲综合精品在线| 国产嫩草影院久久久久| 久久香蕉视频网站| 外国成人毛片| 亚洲视频视频在线| 一区二区三区在线观看av| aaa亚洲精品| 亚洲熟妇无码一区二区三区导航| 精品国产鲁一鲁****| 久久九九热免费视频| 日本三级一区二区三区| 国产亚洲欧美一级| 国产成人av影视| 久久av中文| 日本精品一区二区三区在线| 天天干天天舔天天射| 亚洲成人精品一区| 精品1卡二卡三卡四卡老狼| 91成人免费| 成人免费淫片视频软件| 久操视频在线播放| 91精品蜜臀在线一区尤物| 国产wwwwxxxx| 国产精品一区二区在线播放| 亚洲成年人专区| 精品欧美视频| 欧美放荡办公室videos4k| 不卡视频免费在线观看| 一区二区三区欧美日韩| 中文字幕乱视频| 在线综合亚洲| 日本三级中国三级99人妇网站| 桃子视频成人app| 中文字幕在线亚洲| av中文字幕免费| 午夜精品久久一牛影视| 蜜桃精品成人影片| 日韩精品每日更新| 色综合视频二区偷拍在线| 激情都市亚洲| 在线免费看av不卡| 国产熟女精品视频| 亚洲大片精品永久免费| 国产精品一区二区入口九绯色| 翔田千里一区二区| 午夜欧美一区二区三区免费观看| 日韩三级成人| 久久久综合免费视频| 色鬼7777久久| 欧美日韩的一区二区| 欧美成人免费看| 91伊人久久大香线蕉| 国产又粗又长又大的视频| 91一区在线| 国产精品免费区二区三区观看| av日韩亚洲| 国产一区二区三区视频在线观看| 中文天堂在线播放| 一区二区三区免费观看| 最近日本中文字幕| 美女视频第一区二区三区免费观看网站 | 国产午夜手机精彩视频| 国产一区二区三区在线观看免费视频| 神马午夜伦理影院| 福利电影一区| 国产精品免费网站| 性欧美1819sex性高清大胸| 色综合天天狠狠| 激情高潮到大叫狂喷水| 国产成人午夜99999| 亚洲天堂av线| 伊人精品视频| 日韩高清三级| h视频久久久| 国产成人久久精品| 欧美v亚洲v| 最近中文字幕日韩精品| 天堂av资源网| 欧美精三区欧美精三区| 亚洲 欧美 成人| 亚洲一线二线三线久久久| 在线免费观看视频| av色综合久久天堂av综合| 一区二区三区四区毛片| 久久精品九九| 五十路熟女丰满大屁股| 亚洲国产一区二区在线观看| 欧美精品亚洲精品| 久久精品一级| 国产日本欧美在线观看| 都市激情综合| 午夜精品国产精品大乳美女| av网站大全在线| www.99久久热国产日韩欧美.com| 欧美91精品久久久久国产性生爱| 日韩精品专区在线| 国产免费一区二区三区最新不卡 | 在线观看福利电影| 久久久久国产视频| dj大片免费在线观看| 中文字幕精品国产| 福利在线午夜| 亚洲网站在线播放| 全国男人的天堂网| 91精品国产91久久久久久最新毛片| 一级片在线观看免费| 婷婷夜色潮精品综合在线| 久久久.www| 一区二区三区精品| 久久久久亚洲AV| 一区二区三区免费看视频| 2021亚洲天堂| 亚洲综合精品久久| 国产亚洲自拍av| 亚洲高清在线精品| 日本一区二区网站| 亚洲欧美日韩成人高清在线一区| 大吊一区二区三区| 中文字幕亚洲一区二区av在线| a级黄色免费视频| 国产精品成人一区二区艾草| 少妇高潮惨叫久久久久| 国产精品欧美综合在线| 天天操天天舔天天射| 国产精品蜜臀av| 精品亚洲乱码一区二区| ㊣最新国产の精品bt伙计久久| 国产精品久久久久无码av色戒| 97精品视频在线观看自产线路二| 好吊色视频一区二区三区| 成人av综合在线| av直播在线观看| 国产三级久久久| 亚洲精品天堂网| 亚洲天堂中文字幕| 久热精品在线观看| 亚洲国产一区二区三区| 久久久久久久极品| 91久久精品一区二区| 无码人妻久久一区二区三区| 欧美视频一区在线| 国产夫妻性生活视频| 亚洲第一区中文99精品| 暖暖视频在线免费观看| 日韩在线小视频| 密臀av在线| 秋霞av国产精品一区| 国产精品原创视频| 国产精品久久久久久免费观看| 日韩高清电影免费| 欧美精品二区三区四区免费看视频 | 性久久久久久久久久久| 久久一区二区三区四区| 日本精品久久久久中文| 一区二区三区免费看视频| 国产成人自拍视频在线| 欧美性猛交一区二区三区精品 | 欧美国产免费| 国产主播在线看| 国产在线一区二区综合免费视频| 熟妇高潮一区二区| 久久精品欧美一区二区三区麻豆| 三级黄色免费观看| 欧美日韩黄色大片| 国产精品久久婷婷| 日韩精品视频三区| 国产黄色小视频在线| 欧美性在线视频| 国产精品美女久久久久| 高清国语自产拍免费一区二区三区| 欧美美女在线| 亚洲国产精品无码av| 久久狠狠亚洲综合| 亚洲av综合一区二区| 亚洲免费成人av| 无码人妻黑人中文字幕| 亚洲精品在线观看视频| 色影院视频在线| 青草青草久热精品视频在线观看| 亚洲超碰在线观看| 亚洲精品8mav| 香蕉成人久久| 小毛片在线观看| 亚洲男同性恋视频| 欧美 日韩 精品| 制服丝袜中文字幕一区| 成年人在线观看| 欧美中文字幕在线| 久本草在线中文字幕亚洲| 国产又爽又黄ai换脸| 日韩精品三区四区| 中国毛片在线观看| 亚洲成a人在线观看| 国产精品视频第一页| 精品亚洲aⅴ在线观看| av网站大全在线| 成人黄色av网站| 色88久久久久高潮综合影院| 日本老熟妇毛茸茸| 久久一二三国产| 成人免费看片98欧美| 日韩视频一区在线观看| 黄色在线视频网站| 亚洲xxx自由成熟| 激情亚洲网站| 亚洲天堂成人av| 色综合 综合色| 国产高清视频在线| 国产一区二区在线免费| 亚洲色图网站| av电影中文字幕| 亚洲成人福利片| 欧美拍拍视频| 国产精品视频区| 一区二区三区四区电影| 动漫美女无遮挡免费| 精品久久久久久久大神国产| 欧美老女人性开放| 国产精品美女在线| 一区二区蜜桃| 182在线视频| 欧美三级日韩在线| 91精选在线| 看欧美日韩国产| 精品一区二区日韩| 黄色激情视频在线观看| 亚洲欧洲一区二区三区久久| 成人国产在线| 欧美中文字幕在线观看视频| 99久久精品费精品国产一区二区| 久久久久久在线观看| www.欧美三级电影.com| 超碰成人免费| 丰满少妇在线观看| 亚洲精品一卡二卡| 麻豆导航在线观看| 亚洲一区二区三区sesese| 国产日本精品| 懂色av粉嫩av蜜臀av一区二区三区| 日韩欧美国产精品一区| 欧美不卡高清一区二区三区| 91xxx视频| 久久久九九九九| 亚洲AV午夜精品| 国产精品福利网| 在线看片欧美| 懂色av蜜臀av粉嫩av永久| 日韩精品免费在线视频观看| 国产日韩一区二区三免费高清| jizzjizzxxxx| 一区二区三区在线视频免费| 高清中文字幕一区二区三区| 国产日韩欧美一区二区三区四区| 久久精品国产久精国产| 国产精品久久久久久久妇| 另类色图亚洲色图|