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

為啥不建議MySQL使用Text類型?

數據庫 MySQL
眾所周知,MySQL廣泛應用于互聯網的OLTP(聯機事務處理過程)業務系統中,在大廠開發規范中,經常會看到一條"不建議使用text大字段類型”。

[[351051]]

本文轉載自微信公眾號「三太子敖丙」,作者三太子敖丙 。轉載本文請聯系三太子敖丙公眾號。

前言

眾所周知,MySQL廣泛應用于互聯網的OLTP(聯機事務處理過程)業務系統中,在大廠開發規范中,經常會看到一條"不建議使用text大字段類型”。

下面就從text類型的存儲結構,引發的問題解釋下為什么不建議使用text類型,以及Text改造的建議方法。

背景

寫log表導致DML慢

問題描述

某歪有一個業務系統,使用RDS for MySQL 5.7的高可用版本,配置long_query_time=1s,添加慢查詢告警,我第一反應就是某歪又亂點了。

我通過監控看CPU, QPS,TPS等指標不是很高,最近剛好雙十一全站都在做營銷活動,用戶量稍微有所增加。某歪反饋有些原本不慢的接口變的很慢,影響了正常的業務,需要做一下troubleshooting。

問題分析

我從慢查詢告警,可以看到有一些insert和update語句比較慢,同時告警時段的監控,發現IOPS很高,達到了70MB/s左右,由于RDS的CloundDBA功能不可用,又沒有audit log功能,troubleshooting比較困難,硬著頭皮只能分析binlog了。

配置了max_binlog_size =512MB,在IOPS高的時段里,看下binlog的生成情況。

需要分析為什么binlog寫這么快,最有可能原因就是insert into request_log表上有text類型,request_log表結構如下(demo)

  1. CREATE TABLE request_log (` 
  2.  `id bigint(20) NOT NULL AUTO_INCREMENT,` 
  3.  `log text,`     
  4.  `created_at datetime NOT NULL,` 
  5.  `status tinyint(4) NOT NULL,` 
  6.  `method varchar(10) DEFAULT NULL,` 
  7.  `url varchar(50) DEFAULT NULL,` 
  8.  `update_at datetime DEFAULT NULL,` 
  9.  `running_time tinyint(4) DEFAULT '0',` 
  10.  `user_id bigint(20) DEFAULT NULL,` 
  11.  `type varchar(50) DEFAULT NULL,` 
  12.  `PRIMARY KEY (id)` 
  13. `) ENGINE=InnoDB AUTO_INCREMENT=4229611 DEFAULT CHARSET=utf8` 

分析binlog:

  1. $ mysqlbinlog --no-defaults -v -v --base64-output=DECODE-ROWS mysql-bin.000539|egrep "insert into request_log" 

滿屏幕都是看不清的內容,翻了半天沒翻完。

基本上已經確定是寫入request_log的log字段引起的,導致binlog_cache頻繁的flush,以及binlog過度切換,導致IOPS過高,影響了其他正常的DML操作。

問題解決

跟開發同學溝通后,計劃在下一個版本修復這個問題,不再將request信息寫入表中,寫入到本地日志文件,通過filebeat抽取到es進行查詢,如果只是為了查看日志也可以接入grayLog等日志工具,沒必要寫入數據庫。

文章最后我還會介紹幾個MySQL 我踩過Text相關的坑,這介紹坑之前我先介紹下MySQLText類型。

MySQL中的Text

Text類型

text是一個能夠存儲大量的數據的大對象,有四種類型:TINYTEXT, TEXT, MEDIUMTEXT,LONGTEXT,不同類型存儲的值范圍不同,如下所示

Data Type Storage Required
TINYTEXT L + 1 bytes, where L < 2**8
TEXT L + 2 bytes, where L < 2**16
MEDIUMTEXT L + 3 bytes, where L < 2**24
LONGTEXT L + 4 bytes, where L < 2**32

其中L表是text類型中存儲的實際長度的字節數??梢杂嬎愠鯰EXT類型最大存儲長度2**16-1 = 65535 Bytes。

InnoDB數據頁

Innodb數據頁由以下7個部分組成:

內容 占用大小 說明
File Header 38Bytes 數據文件頭
Page Header 56 Bytes 數據頁頭
Infimun 和 Supermum Records   偽記錄
User Records   用戶數據
Free Space   空閑空間:內部是鏈表結構,記錄被delete后,會加入到free_lru鏈表
Page  Dictionary   頁數據字典:存儲記錄的相對位置記錄,也稱為Slot,內部是一個稀疏目錄
File Trailer 8Bytes 文件尾部:為了檢測頁是否已經完整個的寫入磁盤

說明:File Trailer只有一個FiL_Page_end_lsn部分,占用8字節,前4字節代表該頁的checksum值,最后4字節和File Header中的FIL_PAGE_LSN,一個頁是否發生了Corrupt,是通過File Trailer部分進行檢測,而該部分的檢測會有一定的開銷,用戶可以通過參數innodb_checksums開啟或關閉這個頁完整性的檢測。

從MySQL 5.6開始默認的表存儲引擎是InnoDB,它是面向ROW存儲的,每個page(default page size = 16KB),存儲的行記錄也是有規定的,最多允許存儲16K/2 - 200 = 7992行。

InnoDB的行格式

Innodb支持四種行格式:

行格式 Compact存儲特性 增強的變長列存儲 支持大前綴索引 支持壓縮 支持表空間類型
REDUNDANT No No No No system, file-per-table, general
COMPACT Yes No No No system, file-per-table, general
DYNAMIC Yes Yes Yes No system, file-per-table, general
COMPRESSED Yes Yes Yes Yes file-per-table, general

由于Dynamic是Compact變異而來,結構大同而已,現在默認都是Dynamic格式;COMPRESSED主要是對表和索引數據進行壓縮,一般適用于使用率低的歸檔,備份類的需求,主要介紹下REDUNDANT和COMPACT行格式。

Redundant行格式

這種格式為了兼容舊版本MySQL。

行記錄格式:

Variable-length offset list record_header col1_value col2_value ……. text_value
字段長度偏移列表 記錄頭信息,占48字節 列1數據 列2數據 ……. Text列指針數據

字段長度偏移列表 記錄頭信息,占48字節 列1數據 列2數據 ……. Text列指針數據

具有以下特點:

  • 存儲變長列的前768 Bytes在索引記錄中,剩余的存儲在overflow page中,對于固定長度且超過768 Bytes會被當做變長字段存儲在off-page中。
  • 索引頁中的每條記錄包含一個6 Bytes的頭部,用于鏈接記錄用于行鎖。
  • 聚簇索引的記錄包含用戶定義的所有列。另外還有一個6字節的事務ID(DB_TRX_ID)和一個7字節長度的回滾段指針(Roll pointer)列。
  • 如果創建表沒有顯示指定主鍵,每個聚簇索引行還包括一個6字節的行ID(row ID)字段。
  • 每個二級索引記錄包含了所有定義的主鍵索引列。
  • 一條記錄包含一個指針來指向這條記錄的每個列,如果一條記錄的列的總長度小于128字節,這個指針占用1個字節,否則2個字節。這個指針數組稱為記錄目錄(record directory)。指針指向的區域是這條記錄的數據部分。
  • 固定長度的字符字段比如CHAR(10)通過固定長度的格式存儲,尾部填充空格。
  • 固定長度字段長度大于或者等于768字節將被編碼成變長的字段,存儲在off-page中。
  • 一個SQL的NULL值存儲一個字節或者兩個字節在記錄目錄(record dirictoty)。對于變長字段null值在數據區域占0個字節。對于固定長度的字段,依然存儲固定長度在數據部分,為null值保留固定長度空間允許列從null值更新為非空值而不會引起索引的分裂。
  • 對varchar類型,Redundant行記錄格式同樣不占用任何存儲空間,而CHAR類型的NULL值需要占用空間。

其中變長類型是通過長度 + 數據的方式存儲,不同類型長度是從1到4個字節(L+1 到 L + 4),對于TEXT類型的值需要L Bytes存儲value,同時需要2個字節存儲value的長度。同時Innodb最大行長度規定為65535 Bytes,對于Text類型,只保存9到12字節的指針,數據單獨存在overflow page中。

Compact行格式

這種行格式比redundant格式減少了存儲空間作為代價,但是會增加某些操作的CPU開銷。如果系統workload是受緩存命中率和磁盤速度限制,compact行格式可能更快。如果你的工作負載受CPU速度限制,compact行格式可能更慢,Compact 行格式被所有file format所支持。

行記錄格式:

Variable-length field length list NULL標志位 record_header col1_value col2_value ……. text_value
變長字段長度列表   記錄頭信息- 列1數據 列2數據 ……. Text列指針數據

Compact首部是一個非NULL變長字段長度的列表,并且是按列的順序逆序放置的,若列的長度小于255字節,用1字節表示;若大于255個字節,用2字節表示。變長字段最大不可以超過2字節,這是因為MySQL數據庫中varchar類型最大長度限制為65535,變長字段之后的第二個部分是NULL標志位,表示該行數據是否有NULL值。有則用1表示,該部分所占的字節應該為1字節。

所以在創建表的時候,盡量使用NOT NULL DEFAULT '',如果表中列存儲大量的NULL值,一方面占用空間,另一個方面影響索引列的穩定性。

具有以下特點:

  • 索引的每條記錄包含一個5個字節的頭部,頭部前面可以有一個可變長度的頭部。這個頭部用來將相關連的記錄鏈接在一起,也用于行鎖。
  • 記錄頭部的變長部分包含了一個表示null 值的位向量(bit vector)。如果索引中可以為null的字段數量為N,這個位向量包含 N/8 向上取整的字節數。比例如果有9-16個字段可以為NULL值,這個位向量使用兩個字節。為NULL的列不占用空間,只占用這個位向量中的位。頭部的變長部分還包含了變長字段的長度。每個長度占用一個或者2個字節,這取決了字段的最大長度。如果所有列都可以為null 并且制定了固定長度,記錄頭部就沒有變長部分。
  • 對每個不為NULL的變長字段,記錄頭包含了一個字節或者兩個字節的字段長度。只有當字段存儲在外部的溢出區域或者字段最大長度超過255字節并且實際長度超過127個字節的時候會使用2個字節的記錄頭部。對應外部存儲的字段,兩個字節的長度指明內部存儲部分的長度加上指向外部存儲部分的20個字節的指針。內部部分是768字節,因此這個長度值為 768+20, 20個字節的指針存儲了這個字段的真實長度。
  • NULL不占該部分任何空間,即NULL除了占用NULL標志位,實際存儲不占任何空間。
  • 記錄頭部跟著非空字段的數據部分。
  • 聚簇索引的記錄包含了所以用戶定于的字段。另外還有一個6字節的事務ID列和一個7字節的回滾段指針。
  • 如果沒有定于主鍵索引,則聚簇索引還包括一個6字節的Row ID列。
  • 每個輔助索引記錄包含為群集索引鍵定義的不在輔助索引中的所有主鍵列。如果任何一個主鍵列是可變長度的,那么每個輔助索引的記錄頭都有一個可變長度的部分來記錄它們的長度,即使輔助索引是在固定長度的列上定義的。
  • 固定長度的字符字段比如CHAR(10)通過固定長度的格式存儲,尾部填充空格。
  • 對于變長的字符集,比如uft8mb3和utf8mb4, InnoDB試圖用N字節來存儲 CHAR(N)。如果CHAR(N)列的值的長度超過N字節,列后面的空格減少到最小值。CHAR(N)列值的最大長度是最大字符編碼數 x N。比如utf8mb4字符集的最長編碼為4,則列的最長字節數是 4*N。

Text類型引發的問題

插入text字段導致報錯

創建測試表

  1. [root@barret] [test]>create table user(id bigint not null primary key auto_increment,  
  2.   -> name varchar(20) not null default '' comment '姓名',  
  3.   -> age tinyint not null default 0 comment 'age',  
  4.   -> gender char(1) not null default 'M' comment '性別'
  5.   -> info text not null comment '用戶信息'
  6.   -> create_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創建時間'
  7.   -> update_time datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改時間' 
  8.   -> ); 
  9. Query OK, 0 rows affected (0.04 sec) 

插入測試數據

  1. root@barret] [test]>insert into user(name,age,gender,info) values('moon', 34, 'M', repeat('a',1024*1024*3)); 
  2. ERROR 1406 (22001): Data too long for column 'info' at row 1 
  3. [root@barret] [test]>insert into user(name,age,gender,info) values('sky', 35, 'M', repeat('b',1024*1024*5)); 
  4. ERROR 1301 (HY000): Result of repeat() was larger than max_allowed_packet (4194304) - truncated 

錯誤分析

  1. [root@barret] [test]>select @@max_allowed_packet; 
  2. +----------------------+ 
  3. | @@max_allowed_packet | 
  4. +----------------------+ 
  5. |       4194304 | 
  6. +----------------------+ 
  7. 1 row in set (0.00 sec) 

max_allowed_packet控制communication buffer最大尺寸,當發送的數據包大小超過該值就會報錯,我們都知道,MySQL包括Server層和存儲引擎,它們之間遵循2PC協議,Server層主要處理用戶的請求:連接請求—>SQL語法分析—>語義檢查—>生成執行計劃—>執行計劃—>fetch data;存儲引擎層主要存儲數據,提供數據讀寫接口。

  1. max_allowed_packet=4M,當第一條insert repeat('a',1024*1024*3),數據包Server執行SQL發送數據包到InnoDB層的時候,檢查數據包大小沒有超過限制4M,在InnoDB寫數據時,發現超過了Text的限制導致報錯。第二條insert的數據包大小超過限制4M,Server檢測不通過報錯。 

max_allowed_packet=4M,當第一條insert repeat('a',1024*1024*3),數據包Server執行SQL發送數據包到InnoDB層的時候,檢查數據包大小沒有超過限制4M,在InnoDB寫數據時,發現超過了Text的限制導致報錯。第二條insert的數據包大小超過限制4M,Server檢測不通過報錯。

引用AWS RDS參數組中該參數的描述

增加該參數的大小可以緩解報錯,但是不能徹底的解決問題。

RDS實例被鎖定

背景描述

公司每個月都會做一些營銷活動,有個服務apush活動推送,單獨部署在高可用版的RDS for MySQL 5.7,配置是4C8G 150G磁盤,數據庫里也就4張表,晚上22:00下班走的時候,rds實例數據使用了50G空間,第二天早晨9:30在地鐵上收到釘釘告警短信,提示push服務rds實例由于disk is full被locked with —read-only,開發也反饋,應用日志報了一堆MySQL error。

問題分析

通過DMS登錄到數據庫,看一下那個表最大,發現有張表push_log占用了100G+,看了下表結構,里面有兩個text字段。

  1. request text default '' comment '請求信息'
  2. response text default '' comment '響應信息' 
  3. mysql>show  table status like 'push_log'; 

發現Avg_row_length基本都在150KB左右,Rows = 78w,表的大小約為780000*150KB/1024/1024 = 111.5G。

通過主鍵update也很慢

  1. insert into user(name,age,gender,info) values('thooo', 35, 'M', repeat('c',65535); 
  2. insert into user(name,age,gender,info) values('thooo11', 35, 'M', repeat('d',65535); 
  3. insert into user(name,age,gender,info) select name,age,gender,info from user
  4. Query OK, 6144 rows affected (5.62 sec) 
  5. Records: 6144  Duplicates: 0  Warnings: 0                                         
  6. [root@barret] [test]>select count(*) from user
  7. +----------+ 
  8. count(*) | 
  9. +----------+ 
  10. |    24576 | 
  11. +----------+ 
  12. 1 row in set (0.05 sec) 

做update操作并跟蹤。

  1. mysql> set profiling = 1; 
  2. Query OK, 0 rows affected, 1 warning (0.00 sec) 
  3.  
  4. mysql> update user set info = repeat('f',65535) where id = 11; 
  5. Query OK, 1 row affected (0.28 sec) 
  6. Rows matched: 1  Changed: 1  Warnings: 0 
  7.  
  8. mysql> show profiles; 
  9. +----------+------------+--------------------------------------------------------+ 
  10. | Query_ID | Duration   | Query                                                  | 
  11. +----------+------------+--------------------------------------------------------+ 
  12. |        1 | 0.27874125 | update user set info = repeat('f',65535) where id = 11 | 
  13. +----------+------------+--------------------------------------------------------+ 
  14. 1 row in set, 1 warning (0.00 sec) 
  15.  
  16. mysql> show profile cpu,block io for query 1;   
  17. +----------------------+----------+----------+------------+--------------+---------------+ 
  18. | Status               | Duration | CPU_user | CPU_system | Block_ops_in | Block_ops_out | 
  19. +----------------------+----------+----------+------------+--------------+---------------+ 
  20. | starting             | 0.000124 | 0.000088 |   0.000035 |            0 |             0 | 
  21. | checking permissions | 0.000021 | 0.000014 |   0.000006 |            0 |             0 | 
  22. | Opening tables       | 0.000038 | 0.000026 |   0.000011 |            0 |             0 | 
  23. | init                 | 0.000067 | 0.000049 |   0.000020 |            0 |             0 | 
  24. | System lock          | 0.000076 | 0.000054 |   0.000021 |            0 |             0 | 
  25. | updating             | 0.244906 | 0.000000 |   0.015382 |            0 |         16392 | 
  26. end                  | 0.000036 | 0.000000 |   0.000034 |            0 |             0 | 
  27. | query end            | 0.033040 | 0.000000 |   0.000393 |            0 |           136 | 
  28. | closing tables       | 0.000046 | 0.000000 |   0.000043 |            0 |             0 | 
  29. | freeing items        | 0.000298 | 0.000000 |   0.000053 |            0 |             0 | 
  30. | cleaning up          | 0.000092 | 0.000000 |   0.000092 |            0 |             0 | 
  31. +----------------------+----------+----------+------------+--------------+---------------+ 
  32. 11 rows in set, 1 warning (0.00 sec) 

可以看到主要耗時在updating這一步,IO輸出次數16392次,在并發的表上通過id做update,也會變得很慢。

group_concat也會導致查詢報錯

在業務開發當中,經常有類似這樣的需求,需要根據每個省份可以定點醫保單位名稱,通常實現如下:

  1. select group_concat(dru_name) from t_drugstore group by province; 

其中內置group_concat返回一個聚合的string,最大長度由參數group_concat_max_len(Maximum allowed result length in bytes for the GROUP_CONCAT())決定,默認是1024,一般都太短了,開發要求改長一點,例如1024000。

當group_concat返回的結果集的大小超過max_allowed_packet限制的時候,程序會報錯,這一點要額外注意。

MySQL內置的log表

MySQL中的日志表mysql.general_log和mysql.slow_log,如果開啟審計audit功能,同時log_output=TABLE,就會有mysql.audit_log表,結構跟mysql.general_log大同小異。

分別看一下他們的表結構

  1. CREATE TABLE `general_log` ( 
  2.   `event_time` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), 
  3.   `user_host` mediumtext NOT NULL
  4.   `thread_id` bigint(21) unsigned NOT NULL
  5.   `server_id` int(10) unsigned NOT NULL
  6.   `command_type` varchar(64) NOT NULL
  7.   `argument` mediumblob NOT NULL 
  8. ) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='General log' 
  1. CREATE TABLE `slow_log` ( 
  2.   `start_time` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), 
  3.   `user_host` mediumtext NOT NULL
  4.   `query_time` time(6) NOT NULL
  5.   `lock_time` time(6) NOT NULL
  6.   `rows_sent` int(11) NOT NULL
  7.   `rows_examined` int(11) NOT NULL
  8.   `db` varchar(512) NOT NULL
  9.   `last_insert_id` int(11) NOT NULL
  10.   `insert_id` int(11) NOT NULL
  11.   `server_id` int(10) unsigned NOT NULL
  12.   `sql_text` mediumblob NOT NULL
  13.   `thread_id` bigint(21) unsigned NOT NULL 
  14. ) ENGINE=CSV DEFAULT CHARSET=utf8 COMMENT='Slow log' 

mysql.general_log記錄的是經過MySQL Server處理的所有的SQL,包括后端和用戶的,insert比較頻繁,同時argument mediumblob NOT NULL,對MySQL Server性能有影響的,一般我們在dev環境為了跟蹤排查問題,可以開啟general_log,Production環境禁止開啟general_log,可以開啟audit_log,它是在general_log的基礎上做了一些filter,比如我只需要業務賬號發起的所有的SQL,這個很有用的,很多時候需要分析某一段時間內哪個SQL的QPS,TPS比較高。

mysql.slow_log記錄的是執行超過long_query_time的所有SQL,如果遵循MySQL開發規范,slow query不會太多,但是開啟了log_queries_not_using_indexes=ON就會有好多full table scan的SQL被記錄,這時slow_log表會很大,對于RDS來說,一般只保留一天的數據,在頻繁insert into slow_log的時候,做truncate table slow_log去清理slow_log會導致MDL,影響MySQL穩定性。

建議將log_output=FILE,開啟slow_log, audit_log,這樣就會將slow_log,audit_log寫入文件,通過Go API處理這些文件將數據寫入分布式列式數據庫clickhouse中做統計分析。

Text改造建議

使用es存儲

在MySQL中,一般log表會存儲text類型保存request或response類的數據,用于接口調用失敗時去手動排查問題,使用頻繁的很低。可以考慮寫入本地log file,通過filebeat抽取到es中,按天索引,根據數據保留策略進行清理。

使用對象存儲

有些業務場景表用到TEXT,BLOB類型,存儲的一些圖片信息,比如商品的圖片,更新頻率比較低,可以考慮使用對象存儲,例如阿里云的OSS,AWS的S3都可以,能夠方便且高效的實現這類需求。

總結

由于MySQL是單進程多線程模型,一個SQL語句無法利用多個cpu core去執行,這也就決定了MySQL比較適合OLTP(特點:大量用戶訪問、邏輯讀,索引掃描,返回少量數據,SQL簡單)業務系統,同時要針對MySQL去制定一些建模規范和開發規范,盡量避免使用Text類型,它不但消耗大量的網絡和IO帶寬,同時在該表上的DML操作都會變得很慢。

另外建議將復雜的統計分析類的SQL,建議遷移到實時數倉OLAP中,例如目前使用比較多的clickhouse,里云的ADB,AWS的Redshift都可以,做到OLTP和OLAP類業務SQL分離,保證業務系統的穩定性。

 

責任編輯:武曉燕 來源: 三太子敖丙
相關推薦

2020-12-15 10:00:31

MySQL數據庫text

2024-12-05 08:16:32

2020-10-19 11:05:17

SpringTransaction事務

2021-04-06 10:48:52

MySQLElasticsear數據庫

2020-11-17 09:01:09

MySQLDelete數據

2024-03-11 11:02:03

Date類JavaAPI

2021-10-13 14:06:46

MySQLUtf8符號

2023-09-21 10:50:23

MySQL數據庫

2025-09-15 01:50:00

2021-12-31 10:32:26

MySQL數據類型

2021-11-15 06:56:45

MyBatis開發項目

2024-07-29 08:20:10

2016-11-02 13:12:31

微信離線消息

2023-09-07 21:40:06

室溫超導Nature

2021-07-08 06:52:41

ESClickHouse Lucene

2010-05-21 15:33:54

MySQL text

2021-08-04 17:20:30

阿里巴巴AsyncJava

2020-12-24 18:46:11

Java序列化編程語言

2020-12-22 06:04:13

Python定時代碼

2024-02-28 07:37:53

JavaExecutors工具
點贊
收藏

51CTO技術棧公眾號

91精品国产91久久久久久吃药| 欧美日韩成人激情| 久久国产精品99久久久久久丝袜| 成人免费视频毛片| 欧美色蜜桃97| 日韩一区二区三区视频在线| 一二三四视频社区在线| 精品视频二区| 国产精品一区二区三区乱码| 91精品国产91久久| 少妇高潮在线观看| 韩国精品福利一区二区三区| 91久久免费观看| 蜜臀在线免费观看| 久久久久久久影视| 国产精品69毛片高清亚洲| 51色欧美片视频在线观看| xxxxx99| 97一区二区国产好的精华液| 色婷婷av一区二区| 伊人久久在线观看| 粉嫩一区二区三区国产精品| 国产成人精品三级| 日韩男女性生活视频| 91精品国产高清一区二区三蜜臀| 国产99亚洲| 日韩视频一区二区三区在线播放 | 亚洲视频tv| 99riav一区二区三区| 成人亚洲欧美一区二区三区| 国产精品乱子伦| 综合国产精品| 在线播放日韩精品| 日韩av一二区| 超碰成人在线免费| 91精品国产一区二区三区| 免费黄色福利视频| 国产三级电影在线播放| 亚洲色图制服诱惑| 日韩一区二区电影在线观看| 特黄视频在线观看| 国产91丝袜在线18| 国产在线观看精品| 中文字幕观看视频| 日本怡春院一区二区| 97香蕉超级碰碰久久免费软件| 波多野结衣家庭教师| 成人羞羞视频播放网站| 亚洲另类欧美自拍| 亚洲观看黄色网| 国产ts一区| 精品国产一区二区三区四区四| 天天干天天曰天天操| 3d动漫一区二区三区在线观看| 91国模大尺度私拍在线视频| www黄色av| 无码小电影在线观看网站免费| 亚洲国产成人高清精品| 国产高清www| 黄色美女视频在线观看| 亚洲人成7777| 国产一级黄色录像片| 亚洲综合伊人久久大杳蕉| 亚洲天堂中文字幕| 黄色影视在线观看| 色图在线观看| 亚洲午夜日本在线观看| 欧美乱大交xxxxx潮喷l头像| 丁香花高清在线观看完整版| 亚洲国产aⅴ天堂久久| 国产传媒久久久| 波多野结衣在线观看| 亚洲国产日韩综合久久精品| 丰满少妇久久久| 亚洲同志男男gay1069网站| 欧美性猛交xxxx乱大交3| 无码精品国产一区二区三区免费| 婷婷综合六月| 欧美日韩久久不卡| 日本人妻一区二区三区| 欧美变态挠脚心| 亚洲人成电影网站| 成人黄色短视频| 91精品国产麻豆国产在线观看 | 青青草原av在线| 亚洲电影在线免费观看| 国产在线观看福利| 激情久久一区二区| 日韩欧美中文字幕制服| 午夜一区二区三区免费| 日本不卡电影| 欧美激情乱人伦一区| 91在线视频在线观看| 久久99精品久久久久久动态图 | 欧美激情xxxxx| 亚洲国产成人精品激情在线| 奇米影视7777精品一区二区| 5g影院天天爽成人免费下载| 亚洲色图狠狠干| 国产精品乱码妇女bbbb| 国产免费一区二区视频| 国产成人精品亚洲日本在线观看| 日韩一区二区三区高清免费看看 | 风间由美一区二区av101| 亚洲人成免费电影| 精品国产精品国产精品| 亚洲综合社区| 成人国产精品日本在线| 亚州视频一区二区三区| 亚洲欧美日韩电影| 久久人妻精品白浆国产| 欧美影院在线| 在线观看日韩av| 国产午夜视频在线| 久久精品国内一区二区三区| 国产一区精品视频| 免费a在线看| 日韩欧美国产一区二区| aaaaaaaa毛片| 全球成人免费直播| 2019中文字幕全在线观看| a毛片在线免费观看| 久久嫩草精品久久久久| 大陆极品少妇内射aaaaaa| 精品无人乱码一区二区三区 | 色视频在线观看免费| 亚洲欧洲色图综合| 成人一区二区三| 欧美人与动xxxxz0oz| 久久久极品av| 国产偷人爽久久久久久老妇app| 国产成人综合精品三级| 亚洲欧美日韩精品久久久| 成人影院入口| 亚洲国产精品一区二区久| 91成人福利视频| 国内国产精品久久| 亚洲精品在线免费| 午夜精品久久久久久久久久蜜桃| 亚洲国产一区自拍| 国产无码精品在线观看| 国产91精品免费| 黄色片免费在线观看视频| 四虎在线精品| 最近2019好看的中文字幕免费| aaa在线视频| 久久综合国产精品| 久久无码高潮喷水| 综合亚洲自拍| 欧美亚洲在线视频| 亚洲av成人无码网天堂| 精品久久久久久久久国产字幕| 日本wwwwwww| 好看的日韩av电影| 国产精品国模大尺度私拍| 女同视频在线观看| 精品国产乱码久久久久久牛牛| 波多野结衣爱爱视频| 国产老肥熟一区二区三区| 国产对白在线播放| 日韩一区二区三区高清在线观看| 欧美猛男性生活免费| 国产视频在线观看免费 | 久久久久久久久久久网| 国产福利一区在线| 青草网在线观看| 国产一级成人av| 97香蕉久久夜色精品国产| 亚洲日本在线播放| 色婷婷久久综合| 蜜臀久久99精品久久久久久| 日本不卡不码高清免费观看| 亚洲无玛一区| 精品久久国产一区| 久久久久久久久久久免费| 无码国精品一区二区免费蜜桃| 精品久久久久久久久久久久| 欧美bbbbb性bbbbb视频| 免费一级片91| 国产卡一卡二在线| 国产另类在线| 日本在线精品视频| 免费在线观看黄色网| 日韩午夜小视频| 久久久久久久久久免费视频| 国产视频亚洲色图| 精品国产午夜福利在线观看| 亚洲国产综合在线看不卡| 牛人盗摄一区二区三区视频| 日韩大陆av| 欧美黑人性猛交| 国产精品99999| 日韩你懂的电影在线观看| 国产精品500部| 国产亚洲精品aa| 91精品视频国产| 亚洲激情av| 亚洲视频精品一区| 欧美在线导航| 91亚洲国产精品| 在线免费看h| 日韩视频永久免费观看| 日本精品999| 欧美亚日韩国产aⅴ精品中极品| 99久久婷婷国产综合| 久久综合国产精品| 久久精品无码一区二区三区毛片 | 国产精品的网站| aaa黄色大片| 精品一区二区三区在线播放视频| 国产精品久久..4399| 久久中文字幕av| 精品欧美日韩在线| 视频成人永久免费视频| 国产精品video| f2c人成在线观看免费视频| 日韩在线播放av| 四虎精品在永久在线观看 | 亚洲xxx在线| 欧美日韩三级一区| 日韩熟女一区二区| 欧美日韩国产专区| 精品无码av在线| 亚洲特级片在线| 亚洲午夜精品久久久久久高潮| www.性欧美| 中文字幕在线国产| 国产精品羞羞答答xxdd| 奇米影视四色在线| 日韩av电影天堂| 国产裸体舞一区二区三区| 亚洲第一区色| 无码熟妇人妻av在线电影| 亚洲一级淫片| www.-级毛片线天内射视视| 成人网18免费网站| 亚洲精品8mav| 日韩毛片视频| 亚洲黄色成人久久久| 青青草国产成人a∨下载安卓| 日本一区视频在线| 国产aⅴ精品一区二区三区久久| 久久综合九色欧美狠狠| 丝袜连裤袜欧美激情日韩| 国产丝袜不卡| 国产区精品视频在线观看豆花| 国产精品9999久久久久仙踪林| 亚洲综合网狠久久| 不卡的av一区| 国产乱人伦丫前精品视频| 国产精品久久精品国产| 亚洲午夜免费| 国产传媒一区二区| 精品视频一区二区三区在线观看 | 人禽交欧美网站免费| 九一成人免费视频| 欧美久久在线| 国产a久久精品一区二区三区 | 免费看日本一区二区| 精品国产乱码久久久久久丨区2区| 亚洲va欧美va人人爽成人影院| 99久久久精品免费观看国产| 中文成人激情娱乐网| 91精品免费看| 亚洲日本在线观看视频| 国产精品丝袜白浆摸在线| 成人mm视频在线观看| 国产精品第1页| 免费视频成人| 国产在线一区二区三区| 欧美电影在线观看网站| 91传媒视频免费| 亚洲性视频在线| 国产伦精品一区二区三区在线| 青青一区二区| 蜜桃免费一区二区三区| 精品一区毛片| 日本一级淫片演员| 黄色在线一区| 欧美丰满熟妇bbbbbb百度| 蜜臂av日日欢夜夜爽一区| 九九热99视频| 国产乱色国产精品免费视频| 国产白袜脚足j棉袜在线观看| 成人av电影免费在线播放| 亚洲男女在线观看| 99国产精品国产精品久久| 亚洲综合欧美综合| 亚洲欧美日本在线| 久久午夜鲁丝片午夜精品| 五月天国产精品| 在线永久看片免费的视频| 欧美美女黄视频| 免费观看a视频| 亚洲欧美日韩中文视频| 日本成a人片在线观看| 欧美激情日韩图片| 中文不卡1区2区3区| 国产日产欧美a一级在线| 澳门成人av| 欧美亚州在线观看| 66久久国产| 欧美黄色一级片视频| 国内精品视频666| 国产一级黄色录像| 国产精品婷婷午夜在线观看| 久草视频免费在线播放| 色天天综合久久久久综合片| 亚洲精品网站在线| 一区二区三区在线播放欧美| 婷婷色在线资源| 国产精品专区h在线观看| 狠狠一区二区三区| 五月天色一区| 国产精品主播| 亚洲一区二区三区四区精品| av在线一区二区| 五月天婷婷丁香网| 午夜精品久久久久久不卡8050| 一炮成瘾1v1高h| 日韩高清免费观看| 精精国产xxxx视频在线| 国产精品欧美亚洲777777| 99香蕉久久| 视频一区二区视频| 亚洲一区二区网站| 中文字幕亚洲日本| 国产精品色眯眯| 不卡av电影在线| 精品福利av导航| 免费在线黄色网址| 136fldh精品导航福利| 午夜视频在线观看精品中文| 日本久久高清视频| 免费不卡在线观看| 成年人网站免费看| 懂色aⅴ精品一区二区三区蜜月| av网站在线观看免费| 中文字幕日韩专区| 欧美亚洲黄色| 日韩.欧美.亚洲| 视频一区二区中文字幕| 给我免费观看片在线电影的| 亚洲另类一区二区| 国产激情久久久久久熟女老人av| 色一区av在线| 中文.日本.精品| 亚洲毛片aa| 日韩二区三区四区| 永久免费观看片现看| 91福利在线看| 黄色av网址在线免费观看| 日本精品久久久久影院| 国产精品极品在线观看| 影音先锋男人的网站| 国产精品亚洲а∨天堂免在线| 一区二区三区影视| 日韩免费视频线观看| 97超碰资源站在线观看| 成人在线中文字幕| 欧美日韩国产精品一区二区亚洲| 午夜不卡福利视频| 一区二区三区在线免费观看| 国产精品无码免费播放| 久久久精品网站| 日韩欧美中文在线观看| www.日本在线视频| 国产成人在线视频网站| 日韩乱码在线观看| 日韩高清欧美高清| 成人在线视频观看| 一道精品一区二区三区| 久久精品99国产精品| 校园春色 亚洲| 日韩精品一区在线| 悠悠资源网亚洲青| 欧美日韩国产综合视频在线| 石原莉奈在线亚洲二区| 极品色av影院| 精品蜜桃在线看| 欧美亚洲韩国| 亚洲电影一二三区| 国产一区二区精品久久91| 日韩欧美性视频| 亚洲一区二区国产| 日韩精品亚洲专区在线观看| 18禁裸男晨勃露j毛免费观看| 99视频一区二区| 在线免费av网| 欧美日韩高清区| 欧美自拍偷拍| 佐山爱在线视频| 日本乱码高清不卡字幕| 久草免费在线观看| 国产亚洲精品美女久久久m| 免费亚洲网站| 日本精品人妻无码77777| 精品第一国产综合精品aⅴ| 亚洲精品粉嫩美女一区| 男人j进女人j|