精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国内国产精品天干天干| 日韩高清av电影| 国产无遮挡又黄又爽又色| 狠狠一区二区三区| 欧美怡红院视频| 亚洲国产精品影视| 偷拍精品一区二区三区| 视频在线在亚洲| 日韩亚洲欧美成人| 午夜男人的天堂| 日韩毛片一区| 亚洲成人av电影| 亚洲精品乱码久久久久久蜜桃91| 国产不卡精品视频| 日日夜夜精品免费视频| 久久av.com| 日本黄色特级片| 亚洲图片小说区| 色综合网色综合| 一级黄色免费在线观看| 天天干,夜夜爽| 国产一区三区三区| 欧美中文字幕精品| 国产一二三区精品| 欧美日韩一二| 亚洲国产高清福利视频| 日韩av在线中文| 蜜桃视频动漫在线播放| 亚洲天堂av一区| 日韩在线第一区| 天堂中文资源在线观看| 国产精品综合二区| 国产精自产拍久久久久久蜜| 亚洲 欧美 视频| 一区二区三区四区日韩| 国产一区二区欧美日韩| 精品夜夜澡人妻无码av| 视频一区在线| 欧美一级日韩一级| 国产又黄又猛又粗又爽的视频| av老司机免费在线| 亚洲综合色婷婷| 一区二区视频国产| 国产小视频在线观看| 99国产精品99久久久久久| 114国产精品久久免费观看| 中文字幕日日夜夜| 日韩**一区毛片| 日本一区二区在线播放| 人人干人人干人人干| 狠色狠色综合久久| 欧美精品18videos性欧| 久久亚洲成人av| 韩日在线一区| 欧美精品18videosex性欧美| 欧美激情一区二区视频| 夜间精品视频| 久久综合九色九九| 91在线播放观看| 亚洲乱码在线| 欧美精品在线免费观看| 日本妇女毛茸茸| 欧美激情自拍| 欧美激情第三页| 国产精品99无码一区二区| 国产精品第十页| 国精产品一区一区三区有限在线| 麻豆一区二区三区精品视频| 欧美视频久久| 国内精品伊人久久| 久久99国产综合精品免费| 日日欢夜夜爽一区| 国产精品久久久久久五月尺| 中文有码在线播放| 国内精品免费**视频| 91免费在线观看网站| 亚洲精品久久久久久无码色欲四季| 国产伦精品一区二区三区免费| 91免费看网站| 色综合888| 中文在线免费一区三区高中清不卡| 亚洲国产高清国产精品| a级网站在线播放| 亚洲伊人伊色伊影伊综合网| 天天夜碰日日摸日日澡性色av| 热三久草你在线| 欧美综合亚洲图片综合区| 潘金莲激情呻吟欲求不满视频| 玖玖玖视频精品| 亚洲国产小视频| 最近中文字幕在线mv视频在线| 久久激情电影| 久久久免费精品视频| 狠狠人妻久久久久久综合| 看电视剧不卡顿的网站| dy888夜精品国产专区| 青青青免费视频在线2| 国产精品国产三级国产aⅴ原创| 桥本有菜av在线| 菠萝蜜视频在线观看www入口| 一本大道久久a久久精二百| 九九精品久久久| 国产精品久久久网站| 色噜噜狠狠狠综合曰曰曰88av| 免费麻豆国产一区二区三区四区| 欧美亚洲网站| 91最新国产视频| 男人的天堂在线视频| 18欧美亚洲精品| 国产乱子夫妻xx黑人xyx真爽| 国产高清日韩| 亚洲人av在线影院| 免费一级特黄特色大片| 蜜臀久久99精品久久久久久9| 高清不卡一区二区三区| 91精品大全| 精品久久久久久久久久ntr影视 | 国产美女性感在线观看懂色av| 1区2区3区精品视频| 精品久久久久久久免费人妻| 视频一区国产| 久热在线中文字幕色999舞| 伊人久久久久久久久久久久 | www.久久国产| 亚洲第一网站| 99久久伊人精品影院| 亚洲免费视频一区二区三区| 午夜婷婷国产麻豆精品| 亚洲热在线视频| 久久看人人摘| 国产精品日韩欧美| 精品视频三区| 欧美日韩亚洲一区二区| 国内精品免费视频| 欧美福利一区| 亚洲一区久久久| 欧美成人xxx| 欧美日韩免费不卡视频一区二区三区| 成人免费av片| 亚洲欧美日韩国产一区| 国产亚洲一区在线播放 | 欧美在线视频免费播放| 人人妻人人玩人人澡人人爽| 一区二区三区欧美在线观看| 久久人人爽av| 亚洲91中文字幕无线码三区| 成人国产精品日本在线| 9i精品一二三区| 欧美视频一区二区三区在线观看 | 亚洲国产999| 一区二区三区四区激情| 亚洲黄色小说在线观看| 国产字幕视频一区二区| 成人xxxxx色| 福利写真视频网站在线| 亚洲精品在线一区二区| 日本特黄一级片| a亚洲天堂av| 国产 日韩 亚洲 欧美| 欧美18xxxx| 热99精品里视频精品| 精品三级久久久久久久电影聊斋| 一本色道久久综合亚洲精品按摩| 精品少妇一区二区三区免费观| 蜜桃av综合| 三区精品视频观看| 亚洲老司机网| 欧美黑人极品猛少妇色xxxxx| 性欧美一区二区三区| 亚洲影视在线观看| 国产精品无码午夜福利| 日本中文字幕一区二区视频| 亚洲日本一区二区三区在线不卡| 午夜精品久久久久久毛片| 久久精品久久精品亚洲人| 午夜精品一区二区三| 精品日韩美女的视频高清| 美女爆乳18禁www久久久久久| 青青草成人在线观看| 超碰成人在线免费观看| 97超碰成人| 日本中文字幕成人| 黄色在线播放网站| 亚洲成成品网站| 国产精品乱码一区二区视频| 中文字幕一区二区三区在线不卡| 爱情岛论坛亚洲自拍| 亚洲美女视频在线免费观看| 日韩亚洲不卡在线| 日韩在线观看中文字幕| 日本免费在线精品| 草莓福利社区在线| 亚洲乱码国产乱码精品精天堂| 中文字幕一区二区人妻| 亚洲观看高清完整版在线观看| www.中文字幕av| 国内久久精品视频| 国产性xxxx18免费观看视频| 99久久这里只有精品| 国产综合欧美在线看| 国产亚洲人成a在线v网站 | 毛片免费看不卡网站| 久久中文精品视频| 国产黄在线观看免费观看不卡| 日韩一区二区三区视频| 亚洲综合成人av| 午夜精品久久久久久久久久久| 欧美色图17p| 久久久久综合网| 在线xxxxx| 国内精品国产三级国产a久久| av观看免费在线| 黄色免费成人| 成人免费看片视频在线观看| 国内精品久久久久久久久电影网 | 国产原创av在线| 亚洲激情第一页| 精品区在线观看| 在线成人av网站| 中文在线观看免费高清| 色哟哟一区二区在线观看| 久久免费视频精品| 亚洲综合色噜噜狠狠| 欧美一区免费观看| 亚洲欧洲精品一区二区精品久久久| 日本黄色网址大全| 白白色 亚洲乱淫| 午夜福利三级理论电影 | 999热视频| 粉嫩一区二区三区在线观看| 国产精品久久9| 亚洲最新无码中文字幕久久| 欧美精品videossex88| 91亚洲精选| 在线播放国产精品| 男人的天堂在线免费视频| 日韩av网站导航| 懂色av一区二区三区四区 | 91黑人精品一区二区三区| 欧美日韩亚洲精品内裤| 久草视频免费播放| 亚洲男人天堂av| 动漫性做爰视频| 国产精品精品国产色婷婷| 久久久久无码精品国产sm果冻| 久久人人超碰精品| 亚洲国产精品成人综合久久久| 国产精品亚洲专一区二区三区 | 日韩精品欧美激情| 十八禁一区二区三区| 日韩一区二区电影在线| 国产成人精品免费看视频| 欧美高清精品3d| 国产三级小视频| 精品久久国产字幕高潮| 亚洲狼人综合网| 日韩精品专区在线影院重磅| 亚洲欧美激情另类| 精品国产一区久久| 国产91免费看| 精品久久一二三区| 五月婷婷六月丁香| 亚洲国产又黄又爽女人高潮的| 免费看黄色一级视频| 日韩精品极品视频免费观看| 亚洲av电影一区| 亚洲欧美国内爽妇网| jizzjizz在线观看| 中文字幕一区电影| 成人影欧美片| 欧美一级片在线播放| 欧美大胆成人| 国产精品久久网| 日本99精品| 精品国产一区二区三区四区精华 | 久久精品aaaaaa毛片| 成人18夜夜网深夜福利网| 另类欧美小说| 日本不卡高清| 亚洲国产精品女人| 一区二区黄色| 另类小说色综合| 三级成人在线视频| 男人添女人下部视频免费| 亚洲精品男同| 丰满人妻中伦妇伦精品app| 日本成人中文字幕在线视频| 男女视频在线观看网站| 国产91高潮流白浆在线麻豆| 国产真实乱人偷精品| 成人动漫中文字幕| 手机看片国产日韩| 亚洲自拍偷拍欧美| 精品一区在线视频| 欧美偷拍一区二区| 成人激情四射网| 亚洲大胆人体视频| 午夜视频在线观看网站| 欧美放荡办公室videos4k| 亚洲妇女成熟| 99精彩视频在线观看免费| 麻豆精品少妇| 正在播放久久| 免费一区视频| 精品国产乱码久久久久久1区二区| 国产成人综合在线观看| 刘亦菲国产毛片bd| 亚洲午夜视频在线观看| 精品国产乱子伦| 精品盗摄一区二区三区| 风间由美一区| 欧美激情aaaa| 免费精品一区| 欧美自拍资源在线| 天天射综合网视频| 日本999视频| 国产一区美女在线| 国产女主播在线播放| 欧美经典三级视频一区二区三区| 久草福利资源在线观看| 欧美视频中文一区二区三区在线观看| 五月婷在线视频| 久久精品这里热有精品| 亚洲天堂手机| 精品久久中出| 午夜国产一区| 国产色视频在线播放| 国产亚洲成aⅴ人片在线观看| 免费在线看黄网址| 欧美人与禽zozo性伦| aaa在线观看| 日本在线精品视频| 国内精品偷拍| 日韩网站在线免费观看| 国内久久精品视频| 懂色av懂色av粉嫩av| 欧美系列一区二区| 色哟哟在线观看| 欧美专区在线播放| 国产精品欧美大片| 中文字幕人妻熟女人妻洋洋| 国产一区二区久久| 五月天免费网站| 欧美性猛片xxxx免费看久爱| 国产中文字幕在线| 91精品国产91久久久久| 精品视频一区二区三区在线观看| 国产对白在线播放| 激情综合色综合久久| 91嫩草|国产丨精品入口| 欧美精品三级在线观看| 粉嫩av在线播放| 成人黄色免费在线观看| 99久久精品网站| 粉色视频免费看| 亚洲黄色小视频| 精品久久国产视频| 欧美极品少妇xxxxⅹ喷水| 日韩在线观看中文字幕| 91免费网站视频| 国产成人三级在线观看| 久久免费视频播放| 亚洲成人免费网站| 极品美女一区| 欧美精品在线一区| 免费成人你懂的| 成年人二级毛片| 日韩欧美亚洲国产精品字幕久久久| 图片区小说区亚洲| 懂色中文一区二区三区在线视频| 亚洲一级电影| 91成人在线免费视频| 欧美影院午夜播放| 污视频网站在线免费| 官网99热精品| 国产精品一卡| 视频国产一区二区| 日韩亚洲欧美在线观看| 中文字幕资源网在线观看免费 | 日本久久久久| 五月天婷亚洲天综合网鲁鲁鲁| 激情都市一区二区| xxxx 国产| 尤物tv国产一区| 91精品视频一区二区| 久艹在线免费观看| 国产精品私人影院| www香蕉视频| 国产va免费精品高清在线| 日韩欧美一区二区三区免费看| 亚洲图片 自拍偷拍| 欧美日韩一区二区三区| 91av资源在线| 7777奇米亚洲综合久久| 国产亚洲精品v| 日本黄色片免费观看| 亚洲久久久久久久久久久| 久久麻豆视频| 超碰97人人射妻| 悠悠色在线精品|