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

比開源快30倍的自研SQL Parser設計與實踐

新聞 前端
本文通過介紹詞法語法分析器技術和業(yè)界的做法,以及過去使用自動生成的詞法語法分析器遇到的問題,分享自研SQL Parser的設計與實踐,以及其帶來的性能和功能的提升。

 [[405195]]

SQL(Structured Query Language)作為一種領域語言(編程語言),最早用于關系型數(shù)據(jù)庫,方便管理結構化數(shù)據(jù);SQL由多種不同的類型的語言組成,包括數(shù)據(jù)定義語言,數(shù)據(jù)控制語言、數(shù)據(jù)操作語言;各數(shù)據(jù)庫產品都有不同的聲明和實現(xiàn);用戶可以很方便的使用SQL操作數(shù)據(jù),數(shù)據(jù)庫系統(tǒng)中的詞法語法分析器負責分析和理解SQL文本的含義,包括詞法分析、語法分析、語義分析3部分。經(jīng)過詞法語法分析器生成AST(Abstract Syntax Tree),會被優(yōu)化器處理生成生成執(zhí)行計劃,再由執(zhí)行引擎執(zhí)行,下圖以MySQL架構為例展示詞法語法分析器所處的位置。

本文通過介紹詞法語法分析器技術和業(yè)界的做法,以及過去使用自動生成的詞法語法分析器遇到的問題,分享自研SQL Parser的設計與實踐,以及其帶來的性能和功能的提升。

一、業(yè)界產品如何開發(fā)SQL Parser?

按照解析器代碼開發(fā)方式,可分為以下兩種:

1.自動生成

為方便開發(fā)詞法、語法分析的過程,業(yè)界有許多詞法、語法分析工具,例如:Flex、Lex、Bison工具常用于生成以C、C++作為目標語言的詞法、語法代碼;如果以Java作為目標語言,可以使用比較流行的ANTLR和JavaCC等工具,ANTLR、JavaCC工具都以用戶編寫的詞法語法規(guī)則文件作為輸入,其中語法文件需要滿足EBNF(extended Backus–Naur form)[1]語法規(guī)則, 這2個工具使用LL(k) (Left-to-right, Leftmost derivation)[2] 算法“自頂向下[3]”解析SQL文本并構建SQL AST, Presto,Spark、Hive等數(shù)據(jù)庫和大數(shù)據(jù)系統(tǒng)多采用該方式生成。生成的代碼包含詞法和語法解析部分,語義分析還需要結合Meta數(shù)據(jù),各數(shù)據(jù)庫內核自己處理;更多自動生成工具的功能和算法對比[4]在參考文獻中。

2.手工編寫

與自動生成工具不同,InfluxDB、H2、Clickhouse等流行的數(shù)據(jù)庫的SQL Parser組件均是手工編寫而成。

優(yōu)點:

  • 代碼邏輯清晰,方便開發(fā)人員調試和排錯;

  • 性能更好:有更多代碼優(yōu)化的空間交給開發(fā)人員,可以使用更優(yōu)秀的算法和數(shù)據(jù)結構提升性能;

  • 自主可控:無licence約束,可讀性和可維護性更高;

  • 不需要額外依賴第三方詞法語法代碼生成工具。

不足:

  • 對開發(fā)人員的技術要求較高,需了解編譯原理技術;

  • 開發(fā)工作量較大,實現(xiàn)MySQL常用語法的各類分支,需要投入很多時間和精力;

  • 需要長時間、大規(guī)模測試才會趨于穩(wěn)定。

二、問題與挑戰(zhàn)

1.復雜查詢的性能問題

在實時分析型數(shù)據(jù)庫的實際生產環(huán)境中,經(jīng)常需要處理數(shù)以千行的復雜查詢請求或者深層嵌套的查詢請求,自動生成的解析器,由于狀態(tài)機管理復雜,線程堆棧太深,導致個別查詢請求在詞法語法解析階段性能下降嚴重。

2.大批量寫入吞吐問題

分析型數(shù)據(jù)庫要穩(wěn)定處理大批量、高并發(fā)寫入的場景,要求SQL Parser組件有很好的性能和穩(wěn)定性,我們嘗試使用過ANTLR,JavaCC等工具生成SQL 的詞法語法解析器,大批量寫入時,values子句在解析過程會產生太多AST臨時對象,導致垃圾回收耗時的問題。

3.Query Rewriting的靈活性問題

需要快速方便的遍歷AST樹,找到符合某種規(guī)則的葉子節(jié)點,修改改節(jié)點,自動生成的解析器并不能很靈活的支持。

自動生成的代碼可讀性差,排查問題成本高,復雜查詢場景下,性能不足,影響系統(tǒng)穩(wěn)定性和版本迭代速度;在設計之初,我們放棄了自動生成的技術方案,完全手工編寫詞法語法解析器。

三、自研詞法語法分析器的技術要點

自動生成工具主要處理生成下圖中左側的 SQL Parser Core和 SQL Tree Nodes的部分,右側featrues的部分需要開發(fā)同學處理,當右側功能(例如:SQL rewriting)對左側有的Tree nodes的更改功能有更多的需求時,想修改自動生成的代碼,則無從下手。

自動生成工具是面向生成通用語法解析器而設計的,針對SQL這一特定領域語言,有特定的優(yōu)化技術提升穩(wěn)定性和性能,從設計之初,我們選擇LL(k)作為語法分析的算法,其自頂向下的特性,在手工編寫分析器時,邏輯清晰,代碼易讀,方便開發(fā)和維護,LL(k)的“左遞歸”問題,可通過手工判定循環(huán)編程的方式避免。

1.詞法和語法分析

詞法分析中,Lexer持續(xù)讀取連續(xù)SQL 文本,將具有某特征的一段連續(xù)文本標識為Token,并標識Token的類別,比如賦值語句 x = 30,經(jīng)過詞法分析后x, = , 30 分別被標識為ID、等號操作符、數(shù)值常量;尤其在識別標識符(變量,表名,列名等)和保留字(TABLE,F(xiàn)ROM,SELECT等)需要對字符串進行反復對比。自動生成工具在這一階段使用DFA(Deterministic Finite Automaton)和預先定義的詞法文件,確定每個Token的值和類型,手工編寫解析器不需要額外維護一個狀態(tài)機,使用分支預測,減少計算量和調用堆棧的深度。

語法分析器會使用詞法分析中的Token作為輸入,以SQL語法描述作為規(guī)則,自頂向下,依次將非葉子節(jié)點展開,構建語法樹,整個過程就像是走迷宮,只有一個正確入口和出口,走完迷宮后,會生成一個正確的AST。

快速Token比較

  1. selECT c1 From T1; 

由于大部分數(shù)據(jù)庫系統(tǒng)對大小寫不敏感,上述query中 selECT 和 From 會被識別為保留字,c1和T1會被識別為標識符。識別2者的類型不同,字符串匹配操作是必不可少的,通常將字符統(tǒng)一轉為大寫或者小寫,再比較字面值,是一個可行的方案。首先把數(shù)據(jù)庫保留字按照 Map<String, Token> 初始化在內存里,key是保留字的大寫字符串,value是Token類型;其中key在作大寫轉化時,可使用ASCII值+32的方法取代 toUpperCase() 方法,在不影響正確性的前提下,獲得數(shù)倍性能提升。

快速數(shù)值分析

在解析常量值時,通常的做法是讀取SQL中的字符串,把字符串作為參數(shù),調用Java自帶的 Integer.parseInt() / Float.parseFloat() / Long.parseLong() ,可以直接在原文本上邊讀取邊計算數(shù)值,該過程只使用基礎類型,避免構造字符串,可以節(jié)省內存,又提升了解析速度,該優(yōu)化對大批量寫入數(shù)值的場景優(yōu)化非常明顯。

避免回溯 [5]

SQL語法解析過程中,通常只需要預讀一個Token,就可以決定如何構建語法節(jié)點的關系,或者構建哪種語法節(jié) 點,有些語法分支較多,需要預讀2個及以上的Token才可以做出判斷,預讀多個Token可以降低回溯帶來的性能消耗,極少情況下,2個以上的Token預讀都也沒有匹配到正確的語法分支,需要撤銷預讀,走其他分支; 為了提高撤銷的速度,可以在預讀前保存Token位點,撤銷時,可以快速回到保存點。

在insert into values語句中,出現(xiàn)常量字面值的概率比出現(xiàn)其他的token要高,通過分支預測可以減少判斷邏輯,避免回溯,提升性能。

表達式替換

Query rewriting[6]技術基于“關系代數(shù)”修改AST,保證正確性的前提下,使新的AST在具備更好的執(zhí)行性能,例如:A,B兩張表的大小相差懸殊,而且錯誤的Join順序對數(shù)據(jù)庫系統(tǒng)不友好,通過更改A,B表的Join順序可以獲得更高的執(zhí)行性能。使用工具生成的解析器,通常不允許直接更改AST的節(jié)點,每次更改AST某個節(jié)點都需要重新構建整個AST,性能并不好。自研的Parser中,每個AST節(jié)點類實現(xiàn)都replace接口,只需要修改AST中的子樹就可以達到改寫的目的。

  1. public interface Replaceable { 
  2.     boolean replace(Node expr, Node target); 
  3.  
  4.  
  5. public class BetweenNode implements Replaceable { 
  6.     public Node            beginExpr; 
  7.     public Node            endExpr; 
  8.      
  9.     @Override 
  10.     public int hashCode(){...} 
  11.     @Override 
  12.     public boolean equals(Object obj) {...} 
  13.      
  14.     @Override 
  15.     public boolean replace(SQLExpr expr, SQLExpr target) { 
  16.         if (expr == beginExpr) { 
  17.             setBeginExpr(target); 
  18.             return true
  19.         } 
  20.  
  21.  
  22.         if (expr == endExpr) { 
  23.             setEndExpr(target); 
  24.             return true
  25.         } 
  26.  
  27.  
  28.         return false
  29.     } 

其他優(yōu)化

  • 支持AST Clone:如果保持原AST結構不變,克隆出一個新的AST,在新的AST修改節(jié)點結構,比如:增加Hint,刪減where條件,增加limit 限制等。

  • 維護AST 父子關系:自動生成的解析器維護了父到子節(jié)點的關系,是單向的引用關系。手寫代碼可以增加子節(jié)點對父節(jié)點的引用,構建AST節(jié)點的雙向引用關系,實現(xiàn)節(jié)點的快速“回跳”,使得AST的遍歷效率更高。

  1. public abstract class Node { 
  2.     public abstract List<Node> getChildren() 
  3.  
  4.  
  5. public class BetweenNode extends Node { 
  6.     public Node            beginExpr; 
  7.     public Node            endExpr; 
  8.      
  9.     @Override 
  10.     public List<Node> getChildren() { 
  11.         return Arrays.<Node>asList(beginExpr, this.endExpr); 
  12.     } 
  13.      
  14.     @Override 
  15.     public BetweenNode clone() { 
  16.         BetweenNode x = new BetweenNode(); 
  17.         if (beginExpr != null) { 
  18.             x.setBeginExpr(beginExpr.clone()); 
  19.         } 
  20.         if (endExpr != null) { 
  21.             x.setEndExpr(endExpr.clone()); 
  22.         } 
  23.         return x; 
  24.     } 
  25.      
  26.     public void setBeginExpr(Node beginExpr) { 
  27.         if (beginExpr != null) { 
  28.             beginExpr.setParent(this); 
  29.         } 
  30.         this.beginExpr = beginExpr; 
  31.     } 
  32.      
  33.     public void setEndExpr(Node endExpr) { 
  34.         if (endExpr != null) { 
  35.             endExpr.setParent(this); 
  36.         } 
  37.         this.endExpr = endExpr; 
  38.     } 

2.語義分析

寫入事件回調

前面提到大批量導入數(shù)據(jù)時,詞法語法分析階段會產生很多AST小對象,給垃圾回收帶來壓力,解決這個問題的核心是要盡量使用基礎數(shù)據(jù)類型,盡量不要產生AST 節(jié)點對象。需要從詞法分析階段入手,避免進入語法分析階段。在詞法分析階段,允許外部注冊實現(xiàn)了寫入接口的類,每當詞法分析器解析出values中的每個具體值,或者完整解析出values中的一行,同時回調寫入接口,實現(xiàn)數(shù)據(jù)庫寫入邏輯。

  1. public interface InsertValueHandler { 
  2.     Object newRow() throws SQLException; 
  3.     void processInteger(Object row, int index, Number value); 
  4.     void processString(Object row, int index, String value); 
  5.     void processDate(Object row, int index, String value); 
  6.     void processDate(Object row, int index, java.util.Date value); 
  7.     void processTimestamp(Object row, int index, String value); 
  8.     void processTimestamp(Object row, int index, java.util.Date value); 
  9.     void processTime(Object row, int index, String value); 
  10.     void processDecimal(Object row, int index, BigDecimal value); 
  11.     void processBoolean(Object row, int index, boolean value); 
  12.     void processNull(Object row, int index); 
  13.     void processFunction(Object row, int index, String funcName, Object... values); 
  14.     void processRow(Object row); 
  15.     void processComplete(); 
  16.  
  17.  
  18. public class BatchInsertHandler implements InsertValueHandler { 
  19.     ... 
  20.  
  21.  
  22. public class Application { 
  23.     BatchInsertHandler handler = new BatchInsertHandler(); 
  24.     parser.parseInsertHeader(); // 頭部:解析 insert into xxx values 部分 
  25.     parser.parseValues(handler); // 批量值:values (xxx), (xxx), (xxx) 部分 

Query Rewriting

手動編寫的SQL Parser可以更靈活的與優(yōu)化器配合,將Query rewriting 的部分優(yōu)化能力前置化到SQL Parser中實現(xiàn),使得優(yōu)化器能更加專注于基于代價和成本的優(yōu)化上。Parser可以結合Meta信息,利用“等價關系代數(shù)”,在AST上低成本實現(xiàn)Query Rewriting功能,以提升查詢性能,例如:常量折疊、函數(shù)變換、條件下推或上提、類型推導、隱式轉化、語義去重等。

首先,需要設計一個結構存儲catalog和table結構信息,包括庫名,表名,列名,列類型等。

然后,使用“訪問者模式”編寫Visitor程序,通過“深度優(yōu)先”遍歷AST,對字段、函數(shù)、表達式、操作符進行分析,結合表結構和類型信息,推斷表達式類型,注意,嵌套的查詢語句中,相同的表達式出現(xiàn)的位置不同,所屬的作用域也不同。

最后,AST會經(jīng)過使用“等價關系代數(shù)”編寫的RBO(Rule-Based Optimization)規(guī)則處理,達到優(yōu)化器的目的。

  1. -- 常量折疊示例 
  2. SELECT * FROM T1 
  3. WHERE c_week 
  4.   BETWEEN CAST(date_format(date_add('day', -day_of_week('20180605'), 
  5.                                    date('20180605')), '%Y%m&d') as bigint) 
  6.   AND CAST(date_format(date_add('day', -day_of_week('20180606'), 
  7.                                    date('20180606')), '%Y%m&d') as bigint) 
  8.                                     
  9. ------------折疊后----------- 
  10. SELECT * from T1 
  11. WHERE c_week BETWEEN 20180602 and 20180603 

 

  1. -- 函數(shù)轉換示例 
  2. SELECT * FROM T1 
  3. WHERE DATE_FORMAT(t1."pay_time"'%Y%m%d') >= '20180529' 
  4.     AND DATE_FORMAT(t1."pay_time"'%Y%m%d') <= '20180529' 
  5.      
  6. -----------轉化后, 更好利用索引------------ 
  7. SELECT * FROM T1 
  8. WHERE t1."pay_time" >= '2018-05-29 00:00:00' 
  9.   AND t1."pay_time" < '2018-05-30 00:00:00' 

四、最后

優(yōu)化后的SQL Parser的性能和穩(wěn)定性提升明顯,以TPC-DS[7] 99個Query對比來看,手工編寫的SQL Parser比ANTLR Parser(使用ANTLR生成)速度快20倍,比JSQLParser(使用JavaCC生成)速度快30倍,在批量Insert場景下,速度提升30~50倍。

本文通過介紹自動生成工具生成的詞法語法分析器和自研分析器的利弊權衡和思考,結合OLAP的大吞吐,處理復雜SQL的業(yè)務特性,選擇手工編寫解析器。性能優(yōu)化手段貼近SQL解析的特點;在語義分析層面,結合Schema信息沉淀了很多語義分析工具,在離線或在線SQL統(tǒng)計和特征分析方面更輕量化、便捷。

責任編輯:張燕妮 來源: 阿里技術
相關推薦

2019-08-06 17:19:22

開源技術 趨勢

2023-02-09 08:08:01

vivoJenkins服務器

2025-04-15 09:24:00

芯片AI技術

2025-07-10 14:54:13

AI模型圖像生成

2022-10-27 08:31:31

架構

2025-08-11 08:55:30

HTML前端字體異常

2024-03-26 10:13:54

日志引擎SigLens

2010-01-18 08:59:13

Windows 7系統(tǒng)速度

2024-02-20 13:31:26

AI訓練

2020-09-30 16:11:31

騰訊云自研服務器

2023-08-09 20:43:32

2023-04-07 08:17:39

fasthttp場景設計HTTP

2022-04-26 15:24:03

開源框架

2025-08-18 09:21:07

2024-12-09 08:27:02

2021-08-27 11:06:03

開源自建Trace阿里云

2025-08-19 16:10:46

AI模型開源

2021-05-06 10:52:09

Java Spring Bo框架

2023-09-09 06:54:02

AI編程語言Mojo

2019-10-14 09:50:52

KeyDBRedis中間件
點贊
收藏

51CTO技術棧公眾號

亚洲最大的免费视频网站| 欧美一级特黄aaaaaa大片在线观看| 国产日韩欧美一区二区三区| 欧美日韩亚洲综合在线| 国产高清免费在线| 日本wwwxxxx| 日韩精品久久久久久| 久久精品中文字幕电影| 男男做爰猛烈叫床爽爽小说 | 国产精品久久久久四虎| 亚洲影院高清在线| 中文字幕亚洲乱码熟女1区2区| 日韩欧美精品一区| 亚洲国产福利在线| 天天操狠狠操夜夜操| 欧美男男激情videos| 国产精品久久久久毛片软件| 国产青春久久久国产毛片| www欧美在线| 欧美激情第10页| 一区二区三区四区在线观看视频| 在线观看欧美一区二区| 朝桐光一区二区| 亚洲一二三四在线观看| 久久99久久精品国产| 国产视频一区二区三| 久久先锋影音| 性亚洲最疯狂xxxx高清| 日韩福利小视频| 狠狠综合久久av一区二区蜜桃| 欧美成人精品3d动漫h| 999在线观看| 成人软件在线观看| 精品日韩美女的视频高清| 青青视频免费在线观看| 91大神在线网站| 91麻豆精品在线观看| 99久久99久久精品国产片| 一二三区中文字幕| 日本aⅴ精品一区二区三区| 91精品国产一区| 久久精品视频国产| 欧美久久视频| 欧美成人精品在线| 亚洲伦理一区二区三区| 欧美精选视频在线观看| 亚洲人成在线免费观看| 国产精品无码网站| 精品国内亚洲2022精品成人| 欧美xxxxx牲另类人与| 特黄特黄一级片| 精品一区二区三区视频在线播放 | 97高清免费视频| 亚洲国产精品久| 一区二区三区在线电影| 久久亚洲精品小早川怜子66| 91n在线视频| 99久久www免费| 精品国偷自产在线| 四虎精品免费视频| 欧美在线看片| 久久久久久有精品国产| 国产稀缺真实呦乱在线| 精品二区久久| 91精品国产亚洲| 日本视频免费观看| 青青草国产成人99久久| 国产精品爽黄69天堂a| 国产又大又粗又长| 国产精品白丝jk黑袜喷水| 99re热精品| 色婷婷av一区二区三区之e本道| 99麻豆久久久国产精品免费优播| 久久精品99久久| 猫咪在线永久网站| 国产精品日韩精品欧美在线| 最新中文字幕久久| 黄色美女视频在线观看| 精品国产91久久久久久| 激情视频综合网| 日韩第二十一页| 日韩精品一区二区三区swag | 一级做a爱片性色毛片| 国内精品写真在线观看| 国产精品乱码视频| 国产在线视频资源| 一区二区三区四区亚洲| 国产免费黄色av| 四虎成人精品一区二区免费网站| 精品久久人人做人人爽| 国产精品1000部啪视频| 日韩精品久久| 久久久久久中文| 最近中文字幕免费在线观看| 老牛影视精品| 丝袜美腿一区二区三区| 国产精品日韩欧美大师| 亚洲AV无码精品国产| 91日韩精品一区| 制服诱惑一区| 麻豆网站免费在线观看| 欧美久久婷婷综合色| 美女露出粉嫩尿囗让男人桶| 国产成人影院| 欧美黑人极品猛少妇色xxxxx| 91video| 国产一区二区三区黄视频 | 五月婷婷狠狠操| 国偷自产av一区二区三区| 在线视频日本亚洲性| 欧美日韩中文视频| 久99久精品视频免费观看| 久久人人爽爽人人爽人人片av| 国内精品久久久久久野外| 丁香五六月婷婷久久激情| 无人码人妻一区二区三区免费| 久久91精品| 久久免费少妇高潮久久精品99| 中文字幕乱码视频| 成人av在线播放网址| 特级毛片在线免费观看| 综合在线影院| 亚洲精品成人久久久| 1024手机在线视频| 另类综合日韩欧美亚洲| 欧美大香线蕉线伊人久久国产精品| 日韩精品亚洲人成在线观看| 欧美日韩小视频| 国产免费一区二区三区网站免费| 一区免费视频| 99久久自偷自偷国产精品不卡| 一级毛片视频在线| 色八戒一区二区三区| 精品人妻一区二区免费视频| 红桃视频国产一区| 97久久精品午夜一区二区| 老司机精品影院| 欧美日韩久久久| 欧美18—19性高清hd4k| 亚洲一区二区成人| 国产亚洲精品美女久久久m| 黄色美女视频在线观看| 精品三级av在线| 九九在线观看视频| 国产成人一区二区精品非洲| 热久久最新网址| 久久三级中文| 欧美二区乱c黑人| 国产jzjzjz丝袜老师水多 | 日韩精品极品视频免费观看| 男人天堂中文字幕| 成人av网站在线观看免费| 国产一区二区片| 高潮久久久久久久久久久久久久| 欧美日韩第一页| 亚洲免费不卡视频| 亚洲一级二级三级| 欲求不满的岳中文字幕| 午夜亚洲精品| 欧美日韩综合另类| 中文字幕乱视频| 国产精品视频一区视频二区| 欧美成人免费网| www.午夜激情| 亚洲国产综合91精品麻豆 | wwwwxxxxx欧美| 日韩avxxx| 欧美日韩国产高清电影| 国产欧美中文字幕| 黄色成人在线| 精品国产免费人成电影在线观看四季| 久久9999久久免费精品国产| 91在线云播放| 艹b视频在线观看| 中文字幕一区二区三区在线视频| 粉嫩av一区二区三区免费观看| 嗯~啊~轻一点视频日本在线观看| 日韩电影视频免费| 最近日韩免费视频| 一区二区三区毛片| 国产精品久久AV无码| 日本网站在线观看一区二区三区| 自拍偷拍亚洲色图欧美| 成人动态视频| 日本成人精品在线| 免费在线看黄网站| 亚洲成人xxx| 中文字幕一区二区三区人妻四季| 亚洲天堂av一区| 亚洲午夜久久久久久久久| 天堂va蜜桃一区二区三区| 中文字幕一区二区三区在线乱码| 久久久久久毛片免费看| 国产精品美女在线观看| 色帝国亚洲欧美在线| 亚洲人成伊人成综合网久久久| 国产三级三级在线观看| 大桥未久av一区二区三区| av片在线免费看| 成人国产精品免费| 182午夜在线观看| 亚洲精选91| 日日噜噜噜夜夜爽爽| 日韩欧美四区| 亚洲自拍另类欧美丝袜| 日韩福利一区| 欧美国产激情18| 91在线播放网站| 日韩成人中文电影| 99在线精品视频免费观看软件| 欧美日韩激情网| 放荡的美妇在线播放| 国产日产欧美精品一区二区三区| 人妻 丝袜美腿 中文字幕| 麻豆精品国产91久久久久久| 成人免费在线小视频| 欧美激情精品久久久六区热门| 日本一区二区三区四区高清视频| 99亚洲乱人伦aⅴ精品| 成人精品一区二区三区电影免费| 不卡av播放| 97精品一区二区三区| 18在线观看的| 久久精品中文字幕| eeuss影院在线观看| 亚洲欧美成人网| 你懂的网站在线| 日韩一区二区免费电影| 做爰无遮挡三级| 色哟哟国产精品免费观看| 国产精品二区一区二区aⅴ| 亚洲欧美国产高清| 女人18毛片毛片毛片毛片区二| 中文字幕乱码一区二区免费| 亚洲熟妇一区二区三区| 91亚洲大成网污www| 在线中文字日产幕| 成人免费高清视频在线观看| 美女又黄又免费的视频| 国产资源在线一区| 国产传媒免费观看| 激情久久五月天| 亚洲18在线看污www麻豆| 老司机午夜精品| 尤物国产在线观看| 国内精品伊人久久久久av一坑| 国产一区二区在线观看免费视频| 老司机免费视频一区二区| www.日本一区| 精品亚洲成a人| 两性午夜免费视频| 国产麻豆一精品一av一免费| 手机免费看av网站| 国产盗摄精品一区二区三区在线| 性生活在线视频| 高清不卡一区二区| 国产一级免费片| 99久久免费国产| 欧美图片一区二区| 国产欧美视频在线观看| 五月天精品在线| 日韩一区在线播放| 欧美黄色一级网站| 亚洲va在线va天堂| 中文字幕视频网站| 欧美在线观看禁18| 国产乱码久久久久| 日韩一区二区三区三四区视频在线观看| 国产高清免费观看| 亚洲国产小视频在线观看| 日本人妖在线| 日韩中文第一页| a级影片在线观看| 久久久久久久久久久久久久久久久久av | 成人av免费观看| 青青草视频成人| 欧美国产精品久久| 一区视频免费观看| 香港成人在线视频| 国产成人a v| 91精品国产综合久久小美女| 蜜臀久久99精品久久久| 亚洲天堂av在线免费| 色综合久久久久综合一本到桃花网| 草民午夜欧美限制a级福利片| av剧情在线观看| 国产成人精品优优av| 国产高清日韩| 欧美久久在线| 亚洲最新色图| 欧美两根一起进3p做受视频| 国产自产视频一区二区三区| 成年人在线观看av| 亚洲欧美日韩久久| 久久精品视频7| 日韩一区二区三区在线视频| 日韩av高清在线| 大胆人体色综合| 91精品韩国| 国产女人水真多18毛片18精品 | 欧美男男gaygay1069| av资源站久久亚洲| 成人毛片在线| 天天夜碰日日摸日日澡性色av| 久久成人精品无人区| 亚洲蜜桃精久久久久久久久久久久| 国产精品高潮呻吟| 久久久精品福利| 日韩美女一区二区三区四区| av在线免费观看网站| 91精品国产777在线观看| 免费在线成人激情电影| 激情五月综合色婷婷一区二区| 久久精品免费一区二区三区| 免费黄色特级片| 国产99精品在线观看| 男人天堂资源网| 色8久久精品久久久久久蜜| 免费观看国产视频| 欧美成aaa人片在线观看蜜臀| 成人美女大片| 精品国产一区二区三区四区精华| 亚洲xxx拳头交| 亚洲欧美另类动漫| 91视频国产资源| 69精品久久久| 精品久久久网站| 新版中文在线官网| 91在线观看欧美日韩| 91嫩草亚洲精品| 亚洲最大综合网| 国产欧美视频一区二区| 在线观看日本网站| 精品亚洲男同gayvideo网站| 国产精品探花在线| 99视频日韩| 亚洲一本二本| 天天久久综合网| 亚洲天天做日日做天天谢日日欢 | 国内精品视频免费| 国产一区二区三区四区三区四| 人妻精油按摩bd高清中文字幕| 亚洲女爱视频在线| 国产av一区二区三区| 欧美理论片在线观看| 欧美二区观看| 精品免费久久久久久久| 国产成人免费xxxxxxxx| 久草视频免费播放| 亚洲国产精品成人精品| 麻豆蜜桃在线观看| 欧洲精品久久| 日本中文在线一区| 国产一二三av| 日韩一区二区三区电影| av超碰免费在线| 国产成人精品日本亚洲11| 影音先锋中文字幕一区| 亚洲av无码一区二区三区观看| 黑人巨大精品欧美一区二区免费 | 日韩亚洲国产中文字幕| 欧美97人人模人人爽人人喊视频| 在线视频亚洲自拍| 国产精品白丝av| 久草视频在线观| 国产亚洲精品美女久久久久| 欧美91在线|欧美| 青青草视频国产| 99久久精品情趣| 日本黄色中文字幕| 久久精品国产96久久久香蕉| 亚洲专区**| 成人小视频在线看| 亚洲国产精品99久久久久久久久 | 精品91自产拍在线观看一区| 免费污视频在线| 欧美精品免费观看二区| 免费在线观看一区二区三区| 好吊日在线视频| 亚洲精品成人久久久| 亚洲欧美在线成人| 欧美 日韩 国产 在线观看| 国产盗摄女厕一区二区三区 | 99热国产在线| 国产日产精品一区二区三区四区| 奶水喷射视频一区| 久久久久久久久久97| 亚洲激情成人网| 成人深夜福利| 精品国产av无码一区二区三区| 久久精品亚洲一区二区三区浴池| 伊人免费在线观看| 久久久久中文字幕| 欧美美女一区| 少妇一级淫片免费放播放| 欧美亚洲综合另类| caoprom在线| 一区二区日本| 久久综合色8888| 亚洲欧美高清视频|