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

使用uuid作為數據庫主鍵,被技術總監懟了一頓!

運維 數據庫運維
本篇文章主要從實際程序實例出發,討論了三種主鍵ID生成方案的性能差異, 鑒于筆者才疏學淺,可能也有理解不到位的地方,歡迎網友們批評指出!

[[392375]]

本文轉載自微信公眾號「Java極客技術」,作者鴨血粉絲。轉載本文請聯系Java極客技術公眾號。  

 一、摘要

在日常開發中,數據庫中主鍵id的生成方案,主要有三種

數據庫自增ID

采用隨機數生成不重復的ID

采用jdk提供的uuid

對于這三種方案,我發現在數據量少的情況下,沒有特別的差異,但是當單表的數據量達到百萬級以上時候,他們的性能有著顯著的區別,光說理論不行,還得看實際程序測試,今天小編就帶著大家一探究竟!

二、程序實例

首先,我們在本地數據庫中創建三張單表tb_uuid_1、tb_uuid_2、tb_uuid_3,同時設置tb_uuid_1表的主鍵為自增長模式,腳本如下:

  1. CREATE TABLE `tb_uuid_1` ( 
  2.   `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, 
  3.   `namevarchar(20) DEFAULT NULL
  4.   PRIMARY KEY (`id`) 
  5. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='主鍵ID自增長'
  1. CREATE TABLE `tb_uuid_2` ( 
  2.   `id` bigint(20) unsigned NOT NULL
  3.   `namevarchar(20) DEFAULT NULL
  4.   PRIMARY KEY (`id`) 
  5. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='主鍵ID隨機數生成'
  1. CREATE TABLE `tb_uuid_3` ( 
  2.   `id` varchar(50)  NOT NULL
  3.   `namevarchar(20) DEFAULT NULL
  4.   PRIMARY KEY (`id`) 
  5. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='主鍵采用uuid生成'

下面,我們采用Springboot + mybatis來實現插入測試。

2.1、數據庫自增

以數據庫自增為例,首先編寫好各種實體、數據持久層操作,方便后續進行測試

  1. /** 
  2.  * 表實體 
  3.  */ 
  4. public class UUID1 implements Serializable { 
  5.  
  6.     private Long id; 
  7.  
  8.     private String name
  9.    
  10.   //省略set、get 
  1. /** 
  2.  * 數據持久層操作 
  3.  */ 
  4. public interface UUID1Mapper { 
  5.  
  6.     /** 
  7.      * 自增長插入 
  8.      * @param uuid1 
  9.      */ 
  10.     @Insert("INSERT INTO tb_uuid_1(name) VALUES(#{name})"
  11.     void insert(UUID1 uuid1); 
  1. /** 
  2.  * 自增ID,單元測試 
  3.  */ 
  4. @Test 
  5. public void testInsert1(){ 
  6.     long start = System.currentTimeMillis(); 
  7.     for (int i = 0; i < 1000000; i++) { 
  8.         uuid1Mapper.insert(new UUID1().setName("張三")); 
  9.     } 
  10.     long end = System.currentTimeMillis(); 
  11.     System.out.println("花費時間:" +  (end - start)); 

2.2、采用隨機數生成ID

這里,我們采用twitter的雪花算法來實現隨機數ID的生成,工具類如下:

  1. public class SnowflakeIdWorker { 
  2.  
  3.     private static SnowflakeIdWorker instance = new SnowflakeIdWorker(0,0); 
  4.  
  5.     /** 
  6.      * 開始時間截 (2015-01-01) 
  7.      */ 
  8.     private final long twepoch = 1420041600000L; 
  9.     /** 
  10.      * 機器id所占的位數 
  11.      */ 
  12.     private final long workerIdBits = 5L; 
  13.     /** 
  14.      * 數據標識id所占的位數 
  15.      */ 
  16.     private final long datacenterIdBits = 5L; 
  17.     /** 
  18.      * 支持的最大機器id,結果是31 (這個移位算法可以很快的計算出幾位二進制數所能表示的最大十進制數) 
  19.      */ 
  20.     private final long maxWorkerId = -1L ^ (-1L << workerIdBits); 
  21.     /** 
  22.      * 支持的最大數據標識id,結果是31 
  23.      */ 
  24.     private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); 
  25.     /** 
  26.      * 序列在id中占的位數 
  27.      */ 
  28.     private final long sequenceBits = 12L; 
  29.     /** 
  30.      * 機器ID向左移12位 
  31.      */ 
  32.     private final long workerIdShift = sequenceBits; 
  33.     /** 
  34.      * 數據標識id向左移17位(12+5) 
  35.      */ 
  36.     private final long datacenterIdShift = sequenceBits + workerIdBits; 
  37.     /** 
  38.      * 時間截向左移22位(5+5+12) 
  39.      */ 
  40.     private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; 
  41.     /** 
  42.      * 生成序列的掩碼,這里為4095 (0b111111111111=0xfff=4095) 
  43.      */ 
  44.     private final long sequenceMask = -1L ^ (-1L << sequenceBits); 
  45.     /** 
  46.      * 工作機器ID(0~31) 
  47.      */ 
  48.     private long workerId; 
  49.     /** 
  50.      * 數據中心ID(0~31) 
  51.      */ 
  52.     private long datacenterId; 
  53.     /** 
  54.      * 毫秒內序列(0~4095) 
  55.      */ 
  56.     private long sequence = 0L; 
  57.     /** 
  58.      * 上次生成ID的時間截 
  59.      */ 
  60.     private long lastTimestamp = -1L; 
  61.     /** 
  62.      * 構造函數 
  63.      * @param workerId     工作ID (0~31) 
  64.      * @param datacenterId 數據中心ID (0~31) 
  65.      */ 
  66.     public SnowflakeIdWorker(long workerId, long datacenterId) { 
  67.         if (workerId > maxWorkerId || workerId < 0) { 
  68.             throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); 
  69.         } 
  70.         if (datacenterId > maxDatacenterId || datacenterId < 0) { 
  71.             throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); 
  72.         } 
  73.         this.workerId = workerId; 
  74.         this.datacenterId = datacenterId; 
  75.     } 
  76.     /** 
  77.      * 獲得下一個ID (該方法是線程安全的) 
  78.      * @return SnowflakeId 
  79.      */ 
  80.     public synchronized long nextId() { 
  81.         long timestamp = timeGen(); 
  82.         // 如果當前時間小于上一次ID生成的時間戳,說明系統時鐘回退過這個時候應當拋出異常 
  83.         if (timestamp < lastTimestamp) { 
  84.             throw new RuntimeException( 
  85.                     String.format("Clock moved backwards.  Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); 
  86.         } 
  87.         // 如果是同一時間生成的,則進行毫秒內序列 
  88.         if (lastTimestamp == timestamp) { 
  89.             sequence = (sequence + 1) & sequenceMask; 
  90.             // 毫秒內序列溢出 
  91.             if (sequence == 0) { 
  92.                 //阻塞到下一個毫秒,獲得新的時間戳 
  93.                 timestamp = tilNextMillis(lastTimestamp); 
  94.             } 
  95.         } 
  96.         // 時間戳改變,毫秒內序列重置 
  97.         else { 
  98.             sequence = 0L; 
  99.         } 
  100.         // 上次生成ID的時間截 
  101.         lastTimestamp = timestamp
  102.         // 移位并通過或運算拼到一起組成64位的ID 
  103.         return ((timestamp - twepoch) << timestampLeftShift) // 
  104.                 | (datacenterId << datacenterIdShift) // 
  105.                 | (workerId << workerIdShift) // 
  106.                 | sequence
  107.     } 
  108.     /** 
  109.      * 阻塞到下一個毫秒,直到獲得新的時間戳 
  110.      * @param lastTimestamp 上次生成ID的時間截 
  111.      * @return 當前時間戳 
  112.      */ 
  113.     protected long tilNextMillis(long lastTimestamp) { 
  114.         long timestamp = timeGen(); 
  115.         while (timestamp <= lastTimestamp) { 
  116.             timestamp = timeGen(); 
  117.         } 
  118.         return timestamp
  119.     } 
  120.     /** 
  121.      * 返回以毫秒為單位的當前時間 
  122.      * @return 當前時間(毫秒) 
  123.      */ 
  124.     protected long timeGen() { 
  125.         return System.currentTimeMillis(); 
  126.     } 
  127.  
  128.     public static SnowflakeIdWorker getInstance(){ 
  129.         return instance; 
  130.     } 
  131.  
  132.  
  133.     public static void main(String[] args) throws InterruptedException { 
  134.         SnowflakeIdWorker idWorker = SnowflakeIdWorker.getInstance(); 
  135.         for (int i = 0; i < 10; i++) { 
  136.             long id = idWorker.nextId(); 
  137.             Thread.sleep(1); 
  138.             System.out.println(id); 
  139.         } 
  140.     } 

其他的操作,與上面類似。

2.3、uuid

同樣的,uuid的生成,我們事先也可以將工具類編寫好:

  1. public class UUIDGenerator { 
  2.  
  3.     /** 
  4.      * 獲取uuid 
  5.      * @return 
  6.      */ 
  7.     public static String getUUID(){ 
  8.         return UUID.randomUUID().toString(); 
  9.     } 

最后的單元測試,代碼如下:

  1. @RunWith(SpringRunner.class) 
  2. @SpringBootTest() 
  3. public class UUID1Test { 
  4.  
  5.     private static final Integer MAX_COUNT = 1000000; 
  6.  
  7.     @Autowired 
  8.     private UUID1Mapper uuid1Mapper; 
  9.  
  10.     @Autowired 
  11.     private UUID2Mapper uuid2Mapper; 
  12.  
  13.     @Autowired 
  14.     private UUID3Mapper uuid3Mapper; 
  15.  
  16.     /** 
  17.      * 測試自增ID耗時 
  18.      */ 
  19.     @Test 
  20.     public void testInsert1(){ 
  21.         long start = System.currentTimeMillis(); 
  22.         for (int i = 0; i < MAX_COUNT; i++) { 
  23.             uuid1Mapper.insert(new UUID1().setName("張三")); 
  24.         } 
  25.         long end = System.currentTimeMillis(); 
  26.         System.out.println("自增ID,花費時間:" +  (end - start)); 
  27.     } 
  28.  
  29.     /** 
  30.      * 測試采用雪花算法生產的隨機數ID耗時 
  31.      */ 
  32.     @Test 
  33.     public void testInsert2(){ 
  34.         long start = System.currentTimeMillis(); 
  35.         for (int i = 0; i < MAX_COUNT; i++) { 
  36.             long id = SnowflakeIdWorker.getInstance().nextId(); 
  37.             uuid2Mapper.insert(new UUID2().setId(id).setName("張三")); 
  38.         } 
  39.         long end = System.currentTimeMillis(); 
  40.         System.out.println("花費時間:" +  (end - start)); 
  41.     } 
  42.  
  43.     /** 
  44.      * 測試采用UUID生成的ID耗時 
  45.      */ 
  46.     @Test 
  47.     public void testInsert3(){ 
  48.         long start = System.currentTimeMillis(); 
  49.         for (int i = 0; i < MAX_COUNT; i++) { 
  50.             String id = UUIDGenerator.getUUID(); 
  51.             uuid3Mapper.insert(new UUID3().setId(id).setName("張三")); 
  52.         } 
  53.         long end = System.currentTimeMillis(); 
  54.         System.out.println("花費時間:" +  (end - start)); 
  55.     } 

三、性能測試

程序環境搭建完成之后,啥也不說了,直接擼起袖子,將單元測試跑起來!

首先測試一下,插入100萬數據的情況下,三者直接的耗時結果如下:

在原有的數據量上,我們繼續插入30萬條數據,三者耗時結果如下:

可以看出在數據量 100W 左右的時候,uuid的插入效率墊底,隨著插入的數據量增長,uuid 生成的ID插入呈直線下降!

時間占用量總體效率排名為:自增ID > 雪花算法生成的ID >> uuid生成的ID。

在數據量較大的情況下,為什么uuid生成的ID遠不如自增ID呢?

關于這點,我們可以從 mysql 主鍵存儲的內部結構來進行分析。

3.1、自增ID內部結構

自增的主鍵的值是順序的,所以 Innodb 把每一條記錄都存儲在一條記錄的后面。

當達到頁面的最大填充因子時候(innodb默認的最大填充因子是頁大小的15/16,會留出1/16的空間留作以后的修改),會進行如下操作:

  • 下一條記錄就會寫入新的頁中,一旦數據按照這種順序的方式加載,主鍵頁就會近乎于順序的記錄填滿,提升了頁面的最大填充率,不會有頁的浪費
  • 新插入的行一定會在原有的最大數據行下一行,mysql定位和尋址很快,不會為計算新行的位置而做出額外的消耗

3.2、使用uuid的索引內部結構

uuid相對順序的自增id來說是毫無規律可言的,新行的值不一定要比之前的主鍵的值要大,所以innodb無法做到總是把新行插入到索引的最后,而是需要為新行尋找新的合適的位置從而來分配新的空間。

這個過程需要做很多額外的操作,數據的毫無順序會導致數據分布散亂,將會導致以下的問題:

  • 寫入的目標頁很可能已經刷新到磁盤上并且從緩存上移除,或者還沒有被加載到緩存中,innodb在插入之前不得不先找到并從磁盤讀取目標頁到內存中,這將導致大量的隨機IO
  • 因為寫入是亂序的,innodb不得不頻繁的做頁分裂操作,以便為新的行分配空間,頁分裂導致移動大量的數據,一次插入最少需要修改三個頁以上
  • 由于頻繁的頁分裂,頁會變得稀疏并被不規則的填充,最終會導致數據會有碎片

在把值載入到聚簇索引(innodb默認的索引類型)以后,有時候會需要做一次OPTIMEIZE TABLE來重建表并優化頁的填充,這將又需要一定的時間消耗。

因此,在選擇主鍵ID生成方案的時候,盡可能別采用uuid的方式來生成主鍵ID,隨著數據量越大,插入性能會越低!

四、總結

在實際使用過程中,推薦使用主鍵自增ID和雪花算法生成的隨機ID。

但是使用自增ID也有缺點:

1、別人一旦爬取你的數據庫,就可以根據數據庫的自增id獲取到你的業務增長信息,很容易進行數據竊取。2、其次,對于高并發的負載,innodb在按主鍵進行插入的時候會造成明顯的鎖爭用,主鍵的上界會成為爭搶的熱點,因為所有的插入都發生在這里,并發插入會導致間隙鎖競爭。

總結起來,如果業務量小,推薦采用自增ID,如果業務量大,推薦采用雪花算法生成的隨機ID。

本篇文章主要從實際程序實例出發,討論了三種主鍵ID生成方案的性能差異, 鑒于筆者才疏學淺,可能也有理解不到位的地方,歡迎網友們批評指出!

 

責任編輯:武曉燕 來源: Java極客技術
相關推薦

2021-05-12 07:32:58

數據庫C3P0項目

2025-08-27 02:00:00

2023-08-28 12:07:06

UUIDMySQL

2024-08-12 00:00:00

NPMCTOJavaScrip

2021-02-09 16:31:30

物聯網年夜飯餐飲

2021-12-17 07:30:42

排序算法效率

2024-06-05 10:21:30

2020-08-31 11:20:53

MySQLuuidid

2019-08-20 08:36:15

混淆堆棧Android

2019-11-21 13:59:20

網絡攻擊攻擊成本網絡安全

2022-03-22 09:00:00

數據庫SingleStor技術

2023-10-10 11:18:42

Spring數據庫

2021-05-18 09:39:19

互聯網操作系統Go

2015-05-07 10:02:47

庫克蘋果

2018-04-12 17:00:07

云計算燒烤SaaS

2024-07-17 09:16:58

2022-03-30 09:30:00

數據庫地理空間查詢SQL

2019-07-26 15:45:50

技術經理項目管理

2020-02-24 08:00:30

刪庫跑路判刑

2011-07-25 18:11:47

SQL Server數復合主鍵
點贊
收藏

51CTO技術棧公眾號

国产精品va无码一区二区三区| 国产精品久久久久久9999| 亚洲三区在线播放| 日本中文字幕一区| 久久成年人视频| 中文成人无字幕乱码精品区| 素人一区二区三区| 一级做a爱片久久| 免费影院在线观看一区| 国产又粗又猛又爽| 国产精品亚洲综合色区韩国| 日韩中文字幕第一页| 久久久久久久人妻无码中文字幕爆| 国产精欧美一区二区三区蓝颜男同| 中文字幕视频一区| 久久久久se| 国产精品国产三级国产aⅴ| 一本久道综合久久精品| www.亚洲成人| 国产精品扒开腿做爽爽| 午夜视频一区二区在线观看| 色哟哟日韩精品| 97av中文字幕| 国产精品无码2021在线观看| 国产精品18久久久久久久久久久久| 欧美最猛性xxxx| 免费无遮挡无码永久在线观看视频| 久久超碰99| 精品国产在天天线2019| 久久久久久综合网| 国产亚洲一区二区手机在线观看| 午夜精品久久久| 国产日韩欧美大片| 在线a人片免费观看视频| 97超碰欧美中文字幕| 91黄在线观看| 91精品国自产| 麻豆久久精品| 538国产精品一区二区在线| 2018天天弄| 婷婷亚洲五月| 日韩在线免费av| 法国空姐电影在线观看| 日韩欧美国产大片| 亚洲国产欧美在线成人app| wwwxxx色| 一级毛片精品毛片| 欧美tickling挠脚心丨vk| 一级 黄 色 片一| 国产精品白丝久久av网站| 欧美三级电影网| 中文字幕在线观看第三页| 不卡福利视频| 日韩欧美极品在线观看| 亚洲自偷自拍熟女另类| 国产乱码午夜在线视频| 亚洲成a人片在线观看中文| 男人天堂av片| 538在线观看| 香蕉久久一区二区不卡无毒影院| 久久人人爽人人爽人人av| 黄色成人在线网| 亚洲大片精品永久免费| 成年人看的毛片| 国产99在线观看| 婷婷国产在线综合| 久久精品一区二| 日日av拍夜夜添久久免费| 欧洲生活片亚洲生活在线观看| 无码无遮挡又大又爽又黄的视频| 欧美性猛交xxx高清大费中文| 日本精品一区二区三区高清| 成人中文字幕av| 日本免费成人| 日韩欧美www| 国产午夜在线一区二区三区| 亚洲色图美女| 神马国产精品影院av| 黄色香蕉视频在线观看| 欧美精品综合| 欧美性在线观看| 亚洲精品91天天久久人人| 精品一区二区三区在线观看| 99re热精品| 亚洲色大成网站www| 国产欧美一区二区三区在线看蜜臀| 伊人久久大香线蕉精品| 牛牛电影国产一区二区| 色噜噜狠狠成人网p站| 天天看片天天操| 红杏aⅴ成人免费视频| 亚洲三级 欧美三级| 国产67194| av不卡在线| 国产免费亚洲高清| 欧美亚洲精品在线观看| 欧美国产欧美亚州国产日韩mv天天看完整 | 日韩午夜在线播放| 欧美熟妇精品黑人巨大一二三区| 欧美电影免费播放| 国产91成人在在线播放| 国产口爆吞精一区二区| 91在线视频18| 四虎影院一区二区| av资源亚洲| 欧美一区二区黄色| 在线不卡av电影| 欧美视频一区| 国产精品男人的天堂| 日本黄色三级视频| 自拍偷拍亚洲激情| 欧美 日韩精品| 日韩中文字幕在线一区| 尤物yw午夜国产精品视频| 免费观看一级视频| 狠狠色丁香婷综合久久| 蜜桃传媒视频麻豆第一区免费观看 | 国产精品2区| 亚洲欧美另类国产| 日本免费一二三区| 国产精品亚洲专一区二区三区| 欧美性bbwbbwbbwhd| 91福利区在线观看| 日韩欧美视频在线| 亚洲 欧美 国产 另类| 国产精品一二| 国严精品久久久久久亚洲影视| 最爽无遮挡行房视频在线| 欧美日韩一级片网站| 成年人免费观看视频网站| 亚洲特色特黄| 91免费版黄色| huan性巨大欧美| 欧美精品自拍偷拍| 国产视频123区| 日韩中文字幕一区二区三区| 麻豆久久久av免费| 国产不卡123| 亚洲精品动漫100p| 欧美成人一区二区三区高清| 韩日欧美一区二区三区| 在线观看一区欧美| 成人国产激情在线| 这里精品视频免费| 中文字幕二区三区| 亚洲国产精品激情在线观看| 九九九在线观看视频| 国产精品手机在线播放| 日韩av免费看| 裸体xxxx视频在线| 91成人在线免费观看| 中文字幕第4页| 日产国产欧美视频一区精品| 日韩精品久久久| 97欧美成人| 在线看福利67194| 亚洲一级在线播放| 亚洲欧美怡红院| 亚洲第一色av| 欧美视频四区| 久99久在线| 中文字幕在线看片| 一本色道久久88亚洲综合88| 中文字幕av无码一区二区三区| 中文字幕五月欧美| 无码人妻丰满熟妇区毛片蜜桃精品 | 日本免费观看视| 91美女在线视频| 日本熟妇人妻中出| 99久久亚洲精品| 风间由美久久久| 欧美aa在线| 在线精品视频视频中文字幕| 国产伦一区二区| 亚洲一线二线三线视频| 30一40一50老女人毛片| 麻豆国产欧美一区二区三区| 欧美aaa在线观看| 久久香蕉精品香蕉| 国产精品久久久久久久久久久新郎| 秋霞a级毛片在线看| 欧美成va人片在线观看| 国产精品美女久久久久av爽| 中文字幕二三区不卡| 五月六月丁香婷婷| 99精品免费视频| 亚洲春色在线| 99re91这里只有精品| 秋霞av国产精品一区| 快射视频在线观看| 日韩成人高清在线| 国产免费高清av| 欧美日韩性视频| 日韩在线观看免| 99精品桃花视频在线观看| 小泽玛利亚视频在线观看| 欧美日韩精品| 性欧美.com| 国产精品xxx在线观看| 国产精品老女人精品视频| 成人影音在线| 视频在线观看99| 青梅竹马是消防员在线| 91精品国产一区二区| 国产91精品看黄网站在线观看| 亚洲资源在线观看| 成人黄色短视频| 久久婷婷国产综合国色天香| 中文字幕avav| 麻豆中文一区二区| 免费观看日韩毛片| 亚洲手机在线| 青青草综合视频| 日韩1区2区| 裸模一区二区三区免费| 91精品国产自产在线丝袜啪| 国产在线拍揄自揄视频不卡99 | 久久精品亚洲人成影院| 久久综合中文色婷婷| 综合激情网...| 91精品国产综合久久香蕉| 亚洲欧美电影| 97在线免费视频| 欧美性猛片xxxxx免费中国| 久久激情视频久久| 91免费在线| 亚洲欧洲一区二区三区在线观看| 六月丁香综合网| 欧美一区二区在线观看| 亚洲天堂国产精品| 欧美日韩视频在线观看一区二区三区 | 91精品视频播放| 日韩国产一二三区| 国产精品欧美激情在线播放| 欧美大片免费高清观看| 538国产精品视频一区二区| 77thz桃花论族在线观看| 欧美福利在线观看| 蜜桃传媒在线观看免费进入 | 久久成人久久鬼色| 午夜国产一区二区三区| 日韩av一级电影| 欧美少妇性生活视频| 亚洲综合激情| 逼特逼视频在线| 亚洲一区二区三区高清| 久久无码高潮喷水| 三级影片在线观看欧美日韩一区二区 | 中文字幕在线三区| 色综合视频网站| 国产在线拍揄自揄拍视频| 欧美激情精品久久久久| 欧美1234区| 97视频在线观看成人| 中文字幕人成乱码在线观看 | 久久综合九色综合97婷婷女人| 疯狂揉花蒂控制高潮h| 91免费版在线| 日本一道本视频| 亚洲素人一区二区| 久久免费视频精品| 欧美日韩美女在线| 丰满人妻一区二区三区四区| 欧美日韩日本视频| 99热这里只有精品在线| 亚洲成av人片在线观看香蕉| 婷婷综合激情网| 国产亚洲视频中文字幕视频| 欧美极品视频| 久久久天堂国产精品女人| 美女100%一区| 国产在线视频欧美| 高清欧美性猛交xxxx黑人猛| 免费看成人午夜电影| 久久日文中文字幕乱码| 国产爆乳无码一区二区麻豆| av成人国产| 中文字幕在线综合| 成人精品免费网站| 91精品国自产在线| 亚洲精品免费在线| 最新中文字幕一区| 欧美一区二区黄| 午夜视频免费看| 日韩有码在线观看| 999av小视频在线| 国产精品一区二区三区在线播放| 日韩免费成人| 欧美另类视频在线| 最新国产精品| 日本久久久精品视频| 国产一区二区三区国产| 一级做a爰片毛片| 1000部国产精品成人观看| 亚洲精品77777| 欧美精品成人一区二区三区四区| 天天操天天爱天天干| 啊v视频在线一区二区三区| 国产va在线视频| 亚洲xxxx视频| 欧美一级淫片| 国产极品在线视频| 久国产精品韩国三级视频| aaaaa一级片| 悠悠色在线精品| 最好看的日本字幕mv视频大全 | 国产资源在线观看| 欧美精品激情视频| 欧美爱爱视频| 清纯唯美一区二区三区| 亚洲国产第一| 特黄特黄一级片| 国产精品少妇自拍| 国产精品黄色大片| 精品卡一卡二卡三卡四在线| 在线免费观看的av网站| 国产福利精品视频| 久久精品福利| 成人av在线播放观看| 韩国女主播成人在线观看| 欧美偷拍一区二区三区| 欧美日韩国产色视频| 欧美特级特黄aaaaaa在线看| 欧美成人精品h版在线观看| а√天堂资源国产精品| 青青影院一区二区三区四区| 国产欧美大片| www.88av| 午夜精品成人在线视频| www.久久成人| 久久成人精品视频| 欧美日韩国产亚洲沙发| 欧美成人午夜激情在线| 国产精品久久久久久久久久齐齐| 精品久久久久久亚洲| 国语自产精品视频在线看8查询8| 三级性生活视频| 国产精品久久久久婷婷| 亚洲成熟少妇视频在线观看| 亚洲毛片在线看| 丁香六月综合| 欧美三级电影在线播放| 欧美综合二区| 大又大又粗又硬又爽少妇毛片| 欧美小视频在线观看| 色吊丝在线永久观看最新版本| 午夜欧美大片免费观看| 美女视频免费精品| 久久国产亚洲精品无码| 91亚洲精品久久久蜜桃| 久久久久久久久久久久久久av| 亚洲国产一区二区三区在线观看| 丁香影院在线| 狠狠色综合欧美激情| 西西裸体人体做爰大胆久久久| 亚洲乱码国产乱码精品精大量| 日韩欧中文字幕| 黄色av网站在线免费观看| 国产精品福利在线| 久久精品久久久| 亚洲精品一区二区18漫画| 亚洲午夜日本在线观看| 三级在线电影| 国产精品久久久久久网站 | 日本精品一区二区三区高清 久久| 久久亚洲国产精品一区二区| 久久视频精品在线观看| 欧美疯狂性受xxxxx喷水图片| av在线免费播放| 国产综合第一页| 日本特黄久久久高潮| 男人av资源站| 精品国产伦一区二区三区免费| 在线女人免费视频| 亚洲三级一区| 成人免费毛片嘿嘿连载视频| 中文字幕免费在线观看视频| 色偷偷9999www| 97人人澡人人爽91综合色| 日韩a在线播放| 亚洲素人一区二区| 婷婷亚洲一区二区三区| 国产精品成人观看视频国产奇米| 99国产精品免费视频| 日韩精品色哟哟| 欧美a级片免费看| 亚洲精品久久久狠狠狠爱| 国产亚洲欧美日韩美女| 亚洲最大的免费视频网站| 欧美黄网在线观看| 91免费在线视频观看| 亚洲国产日韩欧美一区二区三区| 国产亚洲天堂网| 中文字幕一区二区日韩精品绯色| 精品国产无码一区二区| 91av视频在线| 99久久亚洲精品| 成人网站免费观看| 中文字幕一区二区三区欧美日韩 | 国产一级精品视频|