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

拯救DBA!美團SQL解析探索實踐

數據庫
數據庫作為核心的基礎組件,是需要重點保護的對象。任何一個線上的不慎操作,都有可能給數據庫帶來嚴重的故障,從而給業(yè)務造成巨大的損失。

數據庫作為核心的基礎組件,是需要重點保護的對象。任何一個線上的不慎操作,都有可能給數據庫帶來嚴重的故障,從而給業(yè)務造成巨大的損失。

為了避免這種損失,一般會在管理上下功夫。比如為研發(fā)人員制定數據庫開發(fā)規(guī)范;新上線的 SQL,需要 DBA 進行審核;維護操作需要經過領導審批等等。

而且如果希望能夠有效地管理這些措施,需要有效的數據庫培訓,還需要 DBA 細心的進行 SQL 審核。

很多中小型創(chuàng)業(yè)公司,可以通過設定規(guī)范、進行培訓、完善審核流程來管理數據庫。

隨著美團業(yè)務的不斷發(fā)展和壯大,上述措施的實施成本越來越高。如何更多的依賴技術手段,來提高效率,越來越受到重視。

業(yè)界已有不少基于 MySQL 源碼開發(fā)的 SQL 審核、優(yōu)化建議等工具,極大的減輕了 DBA 的 SQL 審核負擔。

那么我們能否繼續(xù)擴展 MySQL 的源碼,來輔助 DBA 和研發(fā)人員來進一步提高效率呢?

比如,更全面的 SQL 優(yōu)化功能;多維度的慢查詢分析;輔助故障分析等。要實現上述功能,其中最核心的技術之一就是 SQL 解析。

現狀與場景

SQL 解析是一項復雜的技術,一般都是由數據庫廠商來掌握,當然也有公司專門提供 SQL 解析的 API。

由于這幾年 MySQL 數據庫中間件的興起,需要支持讀寫分離、分庫分表等功能,就必須從 SQL 中抽出表名、庫名以及相關字段的值。

因此像 Java 語言編寫的 Druid,C 語言編寫的 MaxScale,Go 語言編寫的 Kingshard 等,都會對 SQL 進行部分解析。

而真正把 SQL 解析技術用于數據庫維護的產品較少,主要有如下幾個:

  • 美團點評開源的 SQLAdvisor。它基于 MySQL 原生態(tài)詞法解析,結合分析 SQL 中的 where 條件、聚合條件、多表 Join 關系給出索引優(yōu)化建議。
  • 去哪兒開源的 Inception。側重于根據內置的規(guī)則,對 SQL 進行審核。
  • 阿里的 Cloud DBA。根據官方文檔介紹,其也是提供 SQL 優(yōu)化建議和改寫。

上述產品都有非常合適的應用場景,在業(yè)界也被廣泛使用。但是 SQL 解析的應用場景遠遠沒有被充分發(fā)掘,比如:

  • 基于表粒度的慢查詢報表。比如,一個 Schema 中包含了屬于不同業(yè)務線的數據表,那么從業(yè)務線的角度來說,其希望提供表粒度的慢查詢報表。

生成 SQL 特征。將 SQL 語句中的值替換成問號,方便 SQL 歸類。雖然可以使用正則表達式實現相同的功能,但是其 Bug 較多,可以參考 pt-query-digest。

  • 比如 pt-query-digest 中,會把遇到的數字都替換成“?”,導致無法區(qū)別不同數字后綴的表。
  • 高危操作確認與規(guī)避。比如,DBA 不小心 Drop 數據表,而此類操作,目前還無有效的工具進行回滾,尤其是大表,其后果將是災難性的。
  • SQL 合法性判斷。為了安全、審計、控制等方面的原因,美團點評不會讓研發(fā)人員直接操作數據庫,而是提供 RDS 服務。

尤其是對于數據變更,需要研發(fā)人員的上級主管進行業(yè)務上的審批。如果研發(fā)人員,寫了一條語法錯誤的 SQL,而 RDS 無法判斷該 SQL 是否合法,就會造成不必要的溝通成本。

因此為了讓所有有需要的業(yè)務都能方便的使用 SQL 解析功能,我們認為應該具有如下特性:

  • 直接暴露 SQL 解析接口,使用盡量簡單。比如,輸入 SQL,則輸出表名、特征和優(yōu)化建議。
  • 接口的使用不依賴于特定的語言,否則維護和使用的代價太高。比如,以 HTTP 等方式提供服務。

千里之行,始于足下,下面我先介紹下 SQL 的解析原理。

SQL 解析原理

SQL 解析與優(yōu)化屬于編譯器范疇,和 C 等其他語言的解析沒有本質的區(qū)別。

其中分為,詞法分析、語法和語義分析、優(yōu)化、執(zhí)行代碼生成。對應到 MySQL 的部分,如下圖:

圖 1:SQL 解析原理

詞法分析

SQL 解析由詞法分析和語法/語義分析兩個部分組成。詞法分析主要是把輸入轉化成一個個 Token。其中 Token 中包含 Keyword(也稱 Symbol)和非 Keyword。

例如,SQL 語句 select username from userinfo,在分析之后,會得到 4 個 Token。

其中有 2 個 Keyword,分別為 select 和 from:

通常情況下,詞法分析可以使用 Flex 來生成,但是 MySQL 并未使用該工具,而是手寫了詞法分析部分(據說是為了效率和靈活性,參考此文)。具體代碼在 sql/lex.h 和 sql/sql_lex.cc 文件中。

MySQL 中的 Keyword 定義在 sql/lex.h 中,如下為部分 Keyword:

  1. "&&",               SYM(AND_AND_SYM)}, 
  2. "<",                SYM(LT)}, 
  3. "<=",               SYM(LE)}, 
  4. "<>",               SYM(NE)}, 
  5. "!=",               SYM(NE)}, 
  6. "=",                SYM(EQ)}, 
  7. ">",                SYM(GT_SYM)}, 
  8. ">=",               SYM(GE)}, 
  9. "<<",               SYM(SHIFT_LEFT)}, 
  10. ">>",               SYM(SHIFT_RIGHT)}, 
  11. "<=>",              SYM(EQUAL_SYM)}, 
  12. "ACCESSIBLE",       SYM(ACCESSIBLE_SYM)}, 
  13. "ACTION",           SYM(ACTION)}, 
  14. "ADD",              SYM(ADD)}, 
  15. "AFTER",            SYM(AFTER_SYM)}, 
  16. "AGAINST",          SYM(AGAINST)}, 
  17. "AGGREGATE",        SYM(AGGREGATE_SYM)}, 
  18. "ALL",              SYM(ALL)}, 

詞法分析的核心代碼在 sql/sql_lex.c 文件中的 MySQLLex→lex_one_Token,有興趣的同學可以下載源碼研究。

語法分析

語法分析就是生成語法樹的過程。這是整個解析過程中最精華,最復雜的部分,不過這部分 MySQL 使用了 Bison 來完成。

即使如此,如何設計合適的數據結構以及相關算法,去存儲和遍歷所有的信息,也是值得在這里研究的。

語法分析樹

SQL 語句:

  1. select username, ismale from userinfo where age > 20 and level > 5 and 1 = 1 

會生成如下語法樹:

圖 2:語法樹

對于未接觸過編譯器實現的同學,肯定會好奇如何才能生成這樣的語法樹。其背后的原理都是編譯器的范疇。

本人也是在學習 MySQL 源碼過程中,閱讀了部分內容。由于編譯器涉及的內容過多,本人經歷和時間有限,不做過多探究。

從工程的角度來說,學會如何使用 Bison 去構建語法樹,來解決實際問題,對我們的工作也許有更大幫助。下面我就以 Bison 為基礎,探討該過程。

MySQL 語法分析樹生成過程

全部的源碼在 sql/sql_yacc.yy 中,在 MySQL 5.6 中有 17K 行左右代碼。這里列出涉及到的 SQL:

  1. select username, ismale from userinfo where age > 20 and level > 5 and 1 = 1  

解析過程的部分代碼摘錄出來。有了 Bison 之后,SQL 解析的難度也沒有想象的那么大,特別是這里給出了解析的脈絡之后。

  1. select /*select語句入口*/: 
  2.  
  3.           select_init 
  4.  
  5.           { 
  6.  
  7.             LEX *lex= Lex; 
  8.  
  9.             lex->sql_command= SQLCOM_SELECT; 
  10.  
  11.           } 
  12.  
  13.         ; 
  14.  
  15. select_init: 
  16.           SELECT_SYM /*select 關鍵字*/ select_init2 
  17.  
  18.         | '(' select_paren ')' union_opt 
  19.  
  20.         ; 
  21.  
  22. select_init2: 
  23.           select_part2 
  24.           { 
  25.             LEX *lex= Lex; 
  26.             SELECT_LEX * sel= lex->current_select; 
  27.             if (lex->current_select->set_braces(0)) 
  28.             { 
  29.               my_parse_error(ER(ER_SYNTAX_ERROR)); 
  30.               MYSQL_YYABORT; 
  31.             } 
  32.             if (sel->linkage == UNION_TYPE && 
  33.                 sel->master_unit()->first_select()->braces) 
  34.             { 
  35.               my_parse_error(ER(ER_SYNTAX_ERROR)); 
  36.               MYSQL_YYABORT; 
  37.             } 
  38.           } 
  39.           union_clause 
  40.         ; 
  41. select_part2: 
  42.           { 
  43.             LEX *lex= Lex; 
  44.             SELECT_LEX *sel= lex->current_select; 
  45.             if (sel->linkage != UNION_TYPE) 
  46.               mysql_init_select(lex); 
  47.             lex->current_select->parsing_place= SELECT_LIST; 
  48.           } 
  49.  
  50.           select_options select_item_list /*解析列名*/ 
  51.           { 
  52.             Select->parsing_place= NO_MATTER; 
  53.           } 
  54.           select_into select_lock_type 
  55.         ; 
  56.  
  57. select_into: 
  58.           opt_order_clause opt_limit_clause {} 
  59.         | into 
  60.         | select_from /*from 字句*/ 
  61.         | into select_from 
  62.         | select_from into 
  63.         ; 
  64. select_from: 
  65.           FROM join_table_list /*解析表名*/ where_clause /*where字句*/ group_clause having_clause 
  66.           opt_order_clause opt_limit_clause procedure_analyse_clause 
  67.           { 
  68.             Select->context.table_list= 
  69.               Select->context.first_name_resolution_table= 
  70.                 Select->table_list.first
  71.           } 
  72.         | FROM DUAL_SYM where_clause opt_limit_clause 
  73.           /* oracle compatibility: oracle always requires FROM clause, 
  74.              and DUAL is system table without fields. 
  75.              Is "SELECT 1 FROM DUAL" any better than "SELECT 1" ? 
  76.           Hmmm :) */ 
  77.         ; 
  78.  
  79. where_clause: 
  80.           /* empty */  { Select->where= 0; } 
  81.         | WHERE 
  82.           { 
  83.             Select->parsing_place= IN_WHERE; 
  84.           } 
  85.           expr /*各種表達式*/ 
  86.           { 
  87.             SELECT_LEX *selectSelect
  88.             select->where= $3; 
  89.             select->parsing_place= NO_MATTER; 
  90.             if ($3) 
  91.               $3->top_level_item(); 
  92.           } 
  93.         ; 
  94.  
  95. /* all possible expressions */ 
  96. expr: 
  97.            | expr and expr %prec AND_SYM 
  98.           { 
  99.             /* See comments in rule expr: expr or expr */ 
  100.             Item_cond_and *item1; 
  101.             Item_cond_and *item3; 
  102.             if (is_cond_and($1)) 
  103.             { 
  104.               item1= (Item_cond_and*) $1; 
  105.               if (is_cond_and($3)) 
  106.               { 
  107.                 item3= (Item_cond_and*) $3; 
  108.                 /* 
  109.                   (X1 AND X2) AND (Y1 AND Y2) ==> AND (X1, X2, Y1, Y2) 
  110.                 */ 
  111.                 item3->add_at_head(item1->argument_list()); 
  112.                 $$ = $3; 
  113.               } 
  114.               else 
  115.               { 
  116.                 /* 
  117.                   (X1 AND X2) AND Y ==> AND (X1, X2, Y) 
  118.                 */ 
  119.                 item1->add($3); 
  120.                 $$ = $1; 
  121.               } 
  122.             } 
  123.             else if (is_cond_and($3)) 
  124.             { 
  125.               item3= (Item_cond_and*) $3; 
  126.               /* 
  127.                 X AND (Y1 AND Y2) ==> AND (X, Y1, Y2) 
  128.               */ 
  129.               item3->add_at_head($1); 
  130.               $$ = $3; 
  131.             } 
  132.             else 
  133.             { 
  134.               /* X AND Y */ 
  135.               $$ = new (YYTHD->mem_root) Item_cond_and($1, $3); 
  136.               if ($$ == NULL
  137.                 MYSQL_YYABORT; 
  138.             } 
  139.           } 

在大家瀏覽上述代碼的過程,會發(fā)現 Bison 中嵌入了 C++ 的代碼。通過 C++ 代碼,把解析到的信息存儲到相關對象中。

例如表信息會存儲到 TABLE_LIST 中,order_list 存儲 order by 子句里的信息,where 字句存儲在 Item 中。

有了這些信息,再輔助以相應的算法就可以對 SQL 進行更進一步的處理了。

核心數據結構及其關系

在 SQL 解析中,最核心的結構是 SELECT_LEX,其定義在 sql/sql_lex.h 中。下面僅列出與上述例子相關的部分。

圖 3:SQL 解析樹結構

上面圖示中,列名 username、ismale 存儲在 item_list 中,表名存儲在 table_list 中,條件存儲在 where 中。

其中以 where 條件中的 Item 層次結構最深,表達也較為復雜,如下圖所示:

圖 4:where 條件

SQL 解析應用

為了更深入的了解 SQL 解析器,這里給出 2 個應用 SQL 解析的例子。

無用條件去除

無用條件去除屬于優(yōu)化器的邏輯優(yōu)化范疇,可以僅僅根據 SQL 本身以及表結構即可完成,其優(yōu)化的情況也是較多的,代碼在 sql/sql_optimizer.cc 文件中的 remove_eq_conds 函數。

為了避免過于繁瑣的描述,以及大段代碼的粘貼,這里通過圖來分析以下四種情況:

  • 1=1 and (m > 3 and n > 4)
  • 1=2 and (m > 3 and n > 4)
  • 1=1 or (m > 3 and n > 4)
  • 1=2 or (m > 3 and n > 4)

圖 5:無用條件去除 a

圖 6:無用條件去除 b

圖 7:無用條件去除 c

圖 8:無用條件去除 d

如果對其代碼實現有興趣的同學,需要對 MySQL 中的一個重要數據結構 Item 類有所了解。

因為其比較復雜,所以 MySQL 官方文檔,專門介紹了 Item 類。阿里的 MySQL 小組,也有類似的文章。如需更詳細的了解,就需要去查看源碼中 sql/item_* 等文件。

SQL 特征生成

為了確保數據庫,這一系統(tǒng)基礎組件穩(wěn)定、高效運行,業(yè)界有很多輔助系統(tǒng)。比如慢查詢系統(tǒng)、中間件系統(tǒng)。

這些系統(tǒng)采集、收到 SQL 之后,需要對 SQL 進行歸類,以便統(tǒng)計信息或者應用相關策略。歸類時,通常需要獲取 SQL 特征。比如 SQL:

  1. select username, ismale from userinfo where age > 20 and level > 5; 

SQL 特征為:

  1. select username, ismale from userinfo where age > ? and level > ?  

業(yè)界著名的慢查詢分析工具 pt-query-digest,通過正則表達式實現這個功能但是這類處理辦法 Bug 較多。接下來就介紹如何使用 SQL 解析,完成 SQL 特征的生成。

SQL特征生成分兩部分組成:

  • 生成 Token 數組
  • 根據 Token 數組,生成 SQL 特征

首先回顧在詞法解析章節(jié),我們介紹了 SQL 中的關鍵字,并且每個關鍵字都有一個 16 位的整數對應,而非關鍵字統(tǒng)一用 ident 表示,其也對應了一個 16 位整數。如下表:

將一個 SQL 轉換成特征的過程:

在 SQL 解析過程中,可以很方便的完成 Token 數組的生成。而一旦完成 Token 數組的生成,就可以很簡單的完成 SQL 特征的生成。

SQL 特征被廣泛用于各個系統(tǒng)中,比如 pt-query-digest 需要根據特征對 SQL 歸類,然而其基于正則表達式的實現有諸多 Bug。

下面列舉幾個已知 Bug:

學習建議

最近,在對 SQL 解析器和優(yōu)化器探索的過程中,從一開始的茫然無措到有章可循,也總結了一些心得體會,在這里跟大家分享一下:

  • 閱讀相關書籍,書籍能給我們一個系統(tǒng)的認識解析器和優(yōu)化器的角度。但是該類針對 MySQL 的書籍市面上很少,目前中文作品可以看下《數據庫查詢優(yōu)化器的藝術:原理解析與SQL性能優(yōu)化》。
  • 閱讀源碼,但是***以某個版本為基礎,比如 MySQL 5.6.23,因為 SQL 解析、優(yōu)化部分的代碼在不斷變化。尤其是在跨越大的版本時,改動力度大。
  • 多使用 GDB 調試,驗證自己的猜測,檢驗閱讀質量。
  • 需要寫相關代碼驗證,只有寫出來了才能算真正的掌握。

作者:廣友、金龍、邢帆

簡介:廣友,美團到店綜合事業(yè)群資深 MySQL DBA,2012 年畢業(yè)于中國科學技術大學,2017 年加入美團點評,長期致力于 MySQL 及周邊工具的研究。

金龍,2014 年加入美團,主要從事相關的數據庫運維、高可用和相關的運維平臺建設。

邢帆,美團 DBA,2017 年研究生畢業(yè)后加入美團點評,目前對 MySQL 運維有一定經驗,并編寫了一些自動化腳本。

責任編輯:武曉燕 來源: 美團技術團隊(meituantech)
相關推薦

2022-08-12 12:23:28

神經網絡優(yōu)化

2022-04-29 09:10:00

算法人工智能技術

2022-05-20 11:01:06

模型性能框架

2022-03-17 12:00:48

異構業(yè)務實踐

2018-12-14 11:04:56

數據庫運維智能

2019-01-14 08:18:43

DBA數據庫運維

2019-08-23 13:10:39

美團點評Kubernetes集群管理

2022-04-15 10:30:03

美團技術實踐

2018-07-17 14:25:02

SQL解析美團點評MySQL

2022-08-09 09:18:47

優(yōu)化實踐

2017-06-01 10:52:35

互聯(lián)網

2022-03-15 10:20:00

云原生系統(tǒng)實踐

2022-03-17 21:42:20

美團插件技術

2018-03-28 09:53:50

Android架構演進

2022-02-14 16:08:15

開源項目線程池動態(tài)可監(jiān)控

2018-10-29 15:50:23

深度學習工程實踐技術

2023-11-14 12:07:43

美團沙龍

2018-07-13 09:53:27

移動應用美團代碼

2018-10-19 14:16:09

Flink數據倉庫數據系統(tǒng)

2022-06-17 11:54:17

數據模型系統(tǒng)
點贊
收藏

51CTO技術棧公眾號

av网站免费在线播放| 日日摸日日碰夜夜爽无码| 一级爱爱免费视频| 欧美日韩mv| 日韩精品丝袜在线| 天天操天天爽天天射| av香蕉成人| 久久综合一区二区| 亚洲aⅴ男人的天堂在线观看 | 另类图片第一页| 色吊一区二区三区| 国产91视频一区| 狠狠v欧美ⅴ日韩v亚洲v大胸| 激情六月婷婷久久| 欧美又大又硬又粗bbbbb| 国产精品视频一区二区在线观看| 精品欧美午夜寂寞影院| 欧美高清视频一二三区 | 精品国产成人系列| 一路向西2在线观看| 国产精品论坛| 伊人一区二区三区| 亚洲春色在线视频| 欧洲成人av| 国产999精品久久| 91精品国产综合久久久久久蜜臀 | 欧美日韩一区成人| 噜噜噜久久亚洲精品国产品麻豆| 超碰电影在线播放| 国产精品每日更新| 日本午夜一区二区三区| 香蕉久久一区二区三区| 国产精品中文有码| 成人黄色在线观看| 中文在线资源天堂| 久久成人免费| 欧美一区二三区| 国产精品9191| 伊人精品成人久久综合软件| 久久亚洲精品成人| 国产大屁股喷水视频在线观看| 亚州综合一区| 亚洲精品成人久久| 大尺度做爰床戏呻吟舒畅| 99久热这里只有精品视频免费观看| 欧美日产国产精品| 亚洲欧美日韩精品一区| 国产私拍福利精品视频二区| 一本大道av一区二区在线播放| 青青草视频在线免费播放| 色婷婷在线播放| 一区二区三区国产| 国产高清不卡无码视频| 最新黄网在线观看| 一区二区三区在线视频观看| 中文字幕乱码免费| 日本在线观看高清完整版| 尤物视频一区二区| 黄色三级中文字幕| 2020国产在线| 懂色av一区二区三区| 无码aⅴ精品一区二区三区浪潮| 2021天堂中文幕一二区在线观| 亚洲国产裸拍裸体视频在线观看乱了 | 日韩av免费在线播放| 亚洲婷婷综合网| 日韩国产高清在线| 国产精品视频区1| 日本妇乱大交xxxxx| 久久精品国产亚洲a| 成人久久久久爱| 超碰在线播放97| av一区二区不卡| 欧美日韩国产免费一区二区三区| 国产在线你懂得| 成人免费一区二区三区视频| 97av中文字幕| 新版的欧美在线视频| 在线影院国内精品| 天堂av手机在线| 久久中文字幕导航| 在线国产精品视频| 男女性高潮免费网站| 在线电影一区| 国产精品久久999| 国产wwwwwww| 91美女片黄在线观看| 天堂va久久久噜噜噜久久va| 黄色片网站在线观看| 午夜电影一区二区| 在线看的黄色网址| 精品国产影院| 日韩中文娱乐网| 国产一级做a爰片在线看免费| 99精品视频免费| 国产一区深夜福利| 污污网站在线免费观看| 国产精品传媒在线| 日本福利视频在线| а天堂中文最新一区二区三区| 亚洲成人性视频| 国产农村妇女精品一区| 亚洲国产综合在线看不卡| 国产精品三级在线| 黄色小视频免费在线观看| 亚洲国产精品成人综合| 免费看欧美黑人毛片| 中韩乱幕日产无线码一区| 欧美精品一区二区三区视频| 少妇高潮一区二区三区喷水| 一本色道久久综合一区 | 在线观看毛片视频| www.欧美.com| 无码人妻aⅴ一区二区三区日本| 中文字幕在线视频网站| 精品日韩av一区二区| 天美传媒免费在线观看| 中文欧美日韩| 91在线免费看片| h视频网站在线观看| 精品久久久一区二区| 99精品999| 第一sis亚洲原创| 2019中文字幕全在线观看| 精品人妻伦一二三区久久| 中文字幕精品三区| 日韩中文字幕组| 国产欧美啪啪| 欧美高清激情视频| 99久久精品无免国产免费| 国产欧美日韩三区| 爱福利视频一区二区| 91国内精品白嫩初高生| 麻豆成人在线看| 一级日韩一级欧美| 日本一区二区三区四区| 黑鬼大战白妞高潮喷白浆| 久久超级碰碰| 91爱视频在线| 天天射天天色天天干| 午夜私人影院久久久久| 69xxx免费视频| 国产精品久久| 国产精品免费一区二区三区| 污视频网站免费在线观看| 欧美一级欧美三级| 波多野结衣不卡视频| 精品一区二区三区视频在线观看| 色就是色欧美| 亚洲午夜剧场| 大胆欧美人体视频| 国产高清不卡视频| 亚洲国产一区二区视频| 玖玖爱在线精品视频| 国产精品久久久久久模特| 久久99精品国产一区二区三区| 黄频免费在线观看| 日韩www在线| 亚洲毛片一区二区三区| 国产欧美一区二区三区鸳鸯浴 | 91精品国产91久久久久麻豆 主演| 福利一区二区免费视频| 中文日韩在线观看| 亚洲网站在线免费观看| 亚洲天堂2014| 亚洲精品乱码久久久久久9色| 欧美+日本+国产+在线a∨观看| 69堂成人精品视频免费| 九色91在线| 精品一区二区亚洲| 国产精品传媒在线观看| 国产精品久久午夜夜伦鲁鲁| 亚洲 国产 图片| 国内精品久久久久久久97牛牛| 国产尤物91| 日本综合视频| 久久亚洲精品中文字幕冲田杏梨| 性欧美18一19性猛交| 婷婷国产在线综合| 美国黑人一级大黄| 国产成人av电影在线观看| 青青草国产精品视频| 欧美日韩国产高清电影| 亚洲va男人天堂| 色在线视频观看| 色黄久久久久久| 高h调教冰块play男男双性文| 色菇凉天天综合网| 国产少妇在线观看| 91在线观看高清| 日韩欧美国产片| 亚洲福利专区| 亚洲ai欧洲av| 精品少妇3p| 国产中文字幕91| 蜜桃视频动漫在线播放| 日韩视频免费在线观看| 凸凹人妻人人澡人人添| 欧美日韩国产另类一区| 日韩女同强女同hd| 中文字幕一区二区三区精华液| 国偷自产av一区二区三区麻豆| 视频精品一区二区| 日本香蕉视频在线观看| 精品欧美久久| 久草一区二区| 日韩亚洲精品在线观看| 国产精品久久久久久久av电影 | 国产成人中文字幕| 日韩三级电影视频| 在线成人免费网站| 午夜在线视频免费| 日韩欧美黄色影院| 亚洲熟女乱色一区二区三区久久久 | 蜜桃久久精品乱码一区二区| 精品一区二区三区四区五区 | 日韩在线观看a| 日韩在线精品| 欧美精品亚洲精品| 久久97精品| 产国精品偷在线| 精品中文在线| 国产免费久久av| 日韩高清成人| 日韩美女视频免费在线观看| 丁香花电影在线观看完整版| 草民午夜欧美限制a级福利片| 岛国大片在线观看| 日韩精品视频在线观看网址| 日韩在线视频第一页| 欧美va天堂va视频va在线| 97人人爽人人爽人人爽| 欧美日韩精品系列| 丰满人妻一区二区三区四区| 色综合欧美在线视频区| 亚洲免费在线观看av| 精品久久久在线观看| 亚洲黄色三级视频| 欧美日韩国产精品一区| 日本午夜小视频| 婷婷丁香久久五月婷婷| 久久久久久久久久久久久久免费看| 国产免费成人在线视频| 精品一区二区三区蜜桃在线| 久久久国产精品午夜一区ai换脸| 中文字幕xxx| 91在线一区二区三区| 国产老熟女伦老熟妇露脸| 99re在线精品| 人人妻人人澡人人爽人人精品| 91理论电影在线观看| 亚洲国产无码精品| 国产情人综合久久777777| 国产一二三四五区| 国产日产精品1区| 天天操天天干天天操天天干| 国产精品三级视频| www.5588.com毛片| 亚洲乱码日产精品bd| 青娱乐av在线| 天天免费综合色| 无码人妻精品一区二区三区9厂 | 国产a久久精品一区二区三区| 日本亚洲自拍| 亚洲综合激情在线| 日日摸日日碰夜夜爽无码| 国产午夜精品一区二区三区欧美| 免费在线观看毛片网站| 久久99精品久久久久久国产越南| www.成人黄色| 成人污视频在线观看| 中日韩精品一区二区三区| 中文字幕第一区二区| 久久久久99精品成人片试看| 亚洲成人综合网站| 波多野结衣二区三区| 4438成人网| 污污网站在线免费观看| 色婷婷综合久久久久| 欧美1—12sexvideos| 欧美最猛性xxxx| 国产欧美日韩电影| 久久久久欧美| 91精品福利| 国产精品97在线| 国产一区二区三区高清播放| 在线观看国产免费视频| 亚洲欧洲99久久| 六月丁香婷婷综合| 91麻豆精品国产91久久久 | 日韩国产欧美亚洲| 日本欧美一区二区三区乱码| av在线天堂网| 国产精品免费视频网站| 国产在线视频二区| 欧美视频一区在线| 你懂的网站在线| 日韩亚洲国产中文字幕| 国产剧情av在线播放| 国产欧美精品一区二区三区-老狼| 久久精品福利| 欧美精品一区二区性色a+v| 国产亚洲永久域名| 青娱乐国产精品视频| 欧美激情自拍偷拍| av黄色在线看| 日韩精品最新网址| 欧美尤物美女在线| 国产成人av网| 亲子伦视频一区二区三区| 日本黄xxxxxxxxx100| 奇米色一区二区三区四区| 久久久久国产精品无码免费看| 亚洲精品中文在线| 中文字幕丰满人伦在线| 亚洲精品国产美女| 调教一区二区| 91久久在线视频| 日韩成人综合| 老司机午夜av| 97se亚洲国产综合自在线不卡| 国产乱国产乱老熟300| 欧美日韩一级视频| freemovies性欧美| 国产成人97精品免费看片| 日韩欧美黄色| 奇米影视亚洲色图| 国产成人自拍网| 国产一区二区三区在线视频观看| 欧美伊人久久久久久午夜久久久久| 青青九九免费视频在线| 国内精品久久久| 成人18夜夜网深夜福利网| 超碰10000| 国产麻豆午夜三级精品| 久久嫩草捆绑紧缚| 欧美日韩不卡一区二区| 香蕉视频国产在线观看| 成人女保姆的销魂服务| 97精品国产一区二区三区| 亚洲综合欧美在线| 国产精品黄色在线观看| 91欧美日韩麻豆精品| 久久精品视频网站| 亚洲一区有码| 日本免费黄色小视频| 国产激情视频一区二区在线观看 | 亚洲图片另类小说| 91久久线看在观草草青青 | 亚洲国产成人午夜在线一区| 日韩中文字幕高清| 一区二区在线视频| 成人深夜福利| 影音欧美亚洲| 国产伦理精品不卡| 九九视频在线观看| 亚洲精品久久久久久久久久久| 国产社区精品视频| 欧美视频1区| 麻豆精品国产传媒mv男同 | av大片在线看| 亚洲a中文字幕| 欧美日韩国产亚洲一区| 捆绑裸体绳奴bdsm亚洲| 欧美体内谢she精2性欧美| 国产在线日本| 91亚洲一区精品| 亚洲国产一区二区精品专区| 丝袜美腿中文字幕| 欧美性猛交xxxx久久久| av福利精品| 97超级在线观看免费高清完整版电视剧| 激情亚洲成人| 欧美丰满美乳xxⅹ高潮www| 欧美久久婷婷综合色| 欧美理论电影| 欧美一区二区三区精美影视| 久久精品理论片| 国产福利久久久| 亚洲无线码在线一区观看| **日韩最新| 日韩中文字幕三区| 亚洲欧美日韩久久| 日韩a在线看| 91久久偷偷做嫩草影院| 性欧美videos另类喷潮| 91精品一区二区三区蜜桃| 亚洲福利视频久久| 欧美日韩免费电影| 国产av天堂无码一区二区三区| 国产精品欧美久久久久一区二区| 国产高清视频免费观看| 国产精品黄色av| 国产精品激情电影| 国产精品69久久久久孕妇欧美| 精品久久国产字幕高潮| 丁香婷婷久久| 91精品91久久久中77777老牛| 亚洲欧洲精品一区二区精品久久久| 亚洲色图欧美视频|