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

66m—66摸成人免费视频| 色成年激情久久综合| 成人夜晚看av| 暗呦丨小u女国产精品| 欧一区二区三区| 一区二区三区高清在线| 国产亚洲情侣一区二区无| 国产精品久久久久久久妇| 精品国产123区| 欧美一区二区在线免费播放| 久久在线中文字幕| 国家队第一季免费高清在线观看| 男女精品网站| 日韩亚洲综合在线| 亚洲免费看av| 少女频道在线观看免费播放电视剧| a美女胸又www黄视频久久| 国产成人精品免高潮费视频| 黑人狂躁日本娇小| 露出调教综合另类| 欧美天天综合网| 大荫蒂性生交片| 国产福利小视频在线观看| 国产一区高清在线| 欧美一区二区三区……| 欧美h片在线观看| 任我爽精品视频在线播放| 欧美日韩在线播| 成人一区二区免费视频| 中文字幕在线观看日本| a级高清视频欧美日韩| 国产视频福利一区| 国产69精品久久久久久久久久| 欧美综合一区| 日韩精品在线看| 日韩不卡的av| 亚洲第一会所001| 亚洲网友自拍偷拍| 99re8这里只有精品| 国产中文字幕在线观看| 国产91综合一区在线观看| 国产精品久久久久av| 国产五月天婷婷| 91精品一区国产高清在线gif| 亚洲精品日韩丝袜精品| 国产乱国产乱老熟300部视频| 日本精品另类| 日韩欧美中文免费| 国产中文字幕视频在线观看| 午夜在线激情影院| 亚洲丝袜精品丝袜在线| 亚洲欧洲国产精品久久| 黄视频在线观看免费| 99国产精品久久久| 国产一区二区不卡视频| 风流老熟女一区二区三区| 捆绑调教一区二区三区| 欧美亚洲激情在线| 91美女免费看| 噜噜噜躁狠狠躁狠狠精品视频| 久久久免费观看视频| 日本高清一二三区| 欧美国产高清| 欧美疯狂性受xxxxx另类| 日本一级二级视频| 综合久久一区| 久久久久国产一区二区三区| 久久国产在线观看| 国内一区二区三区| 国外成人在线播放| 男人午夜免费视频| 久久综合激情| 国产精品美女av| 国产又粗又猛视频| 国产精品91一区二区| 99国产高清| 色欲av永久无码精品无码蜜桃| a在线播放不卡| 日本欧美精品久久久| av大片在线看| 亚洲青青青在线视频| 国产精品国产三级国产专区51| 久草在线视频网站| 好吊成人免视频| 国产理论在线播放| 精品视频一区二区三区在线观看| 日韩欧美一区电影| 丰满少妇一区二区三区| 日本不卡二三区| 九九久久久久久久久激情| 99免费在线观看| 日韩激情av在线| 91天堂在线视频| 神宫寺奈绪一区二区三区| 久久精品在线免费观看| 色呦呦网站入口| 国产污视频在线播放| 91福利国产精品| 一级片免费在线观看视频| www.亚洲一二| 一本一本久久a久久精品综合小说| 久久久久人妻一区精品色| 精品999成人| 国产精品男女猛烈高潮激情| 精品久久人妻av中文字幕| 91视视频在线观看入口直接观看www| 亚洲 国产 日韩 综合一区| 欧美xxxxhdvideosex| 色婷婷一区二区| 91av免费观看| 国产精品欧美三级在线观看| 欧美成人合集magnet| 国产嫩bbwbbw高潮| 国产麻豆91精品| 日韩妆和欧美的一区二区| 羞羞污视频在线观看| 日本大香伊一区二区三区| 日本中文字幕有码| 欧美色女视频| 2019中文字幕全在线观看| 国产欧美日韩综合精品一区二区三区| 26uuu精品一区二区三区四区在线| 制服诱惑一区| 69久成人做爰电影| 欧美精品一区二区三区一线天视频| 国产18无套直看片| 国产亚洲在线| 欧美精品免费视频| 天天躁日日躁狠狠躁av麻豆男男 | 91精品国产综合久久精品| 国产熟女高潮一区二区三区 | 中国女人一级一次看片| 成人高清在线视频| 无码人妻精品一区二区三区99v| 欧美精品高清| 日韩精品亚洲视频| 精品在线视频观看| 国产精品18久久久久久久网站| 亚洲国内在线| 国产成人精品一区二三区在线观看| 日韩免费av电影| 69xxx免费| 伊人久久大香线蕉av超碰演员| 国产精品久久久久久久天堂| 天天操天天干天天操| 亚洲欧美另类综合偷拍| 爱爱爱爱免费视频| 欧美日韩一区二区三区视频播放| 97精品伊人久久久大香线蕉 | 色哟哟日韩精品| 日韩精品人妻中文字幕有码 | 国产a级一级片| 一区二区三区视频播放| 欧美精品日韩三级| 99热这里是精品| 综合久久一区二区三区| 亚洲视频一二三四| 99久久夜色精品国产亚洲96 | 日韩精品在线视频免费观看| 日韩区欧美区| 欧美国产在线视频| 丰满人妻一区二区三区四区53| 亚洲精品一二三区| 性生交大片免费看l| 欧美日韩国产一区精品一区| 91亚色免费| 日本在线观看大片免费视频| 精品卡一卡二卡三卡四在线| 久久久精品视频免费| 成人h版在线观看| av免费看网址| 伊人精品一区| 国产精品久久久久久久久久小说 | 日韩网站免费观看高清| 91青青草视频| 中文一区一区三区高中清不卡| 国产精品自拍视频在线| 中文精品久久| 国产欧美日韩一区| 欧美大片免费高清观看| 中文字幕日韩欧美在线视频| 国产精品无码天天爽视频| 一区二区三区欧美日韩| xxxx黄色片| 日产国产高清一区二区三区| 日日噜噜噜夜夜爽爽| 91成人午夜| 日本久久91av| 麻豆传媒免费在线观看| 欧美成人三级在线| 黄色片网站在线免费观看| 国产精品免费久久久久| 成年女人免费视频| 久久影院亚洲| 久久久久久久久久久综合| 亚洲aa在线| 91久久久久久久久久久久久| zzzwww在线看片免费| 在线播放国产精品| www.亚洲黄色| 在线亚洲免费视频| 久草视频在线资源站| 国产午夜精品久久久久久免费视| 一级黄色高清视频| 免费视频一区| 成年人视频大全| 亚洲免费观看高清完整版在线观| 成人在线观看视频网站| 亚洲综合电影| 美女久久久久久久| 猫咪在线永久网站| 日韩视频在线你懂得| 手机av免费观看| 亚洲午夜一区二区三区| av资源在线免费观看| 97久久精品人人做人人爽| 五月天视频在线观看| 国产情侣久久| 亚洲色婷婷久久精品av蜜桃| 欧美丝袜激情| 久久久久久九九| 亚洲视频国产精品| 国产在线一区二区三区| 丝袜美腿一区| 91精品国产网站| 在线观看a级片| 国产午夜精品一区二区三区| 天堂中文网在线| 日韩视频国产视频| 亚洲视屏在线观看| 欧美性色xo影院| 国产一级视频在线| 亚洲欧美另类久久久精品| 欧美一区二区三区粗大| 久久久亚洲精品石原莉奈| 日本黄色录像片| 国产·精品毛片| 青青草原播放器| 激情图片小说一区| 中文字幕66页| 麻豆精品视频在线观看免费| 国产天堂在线播放| 久久久精品午夜少妇| 日韩av黄色网址| 一区二区精品| 免费看黄在线看| 韩日成人av| 成人午夜视频免费观看| 欧美激情第8页| 99久久99久久精品| 欧美激情一区| 日韩成人手机在线| 激情久久五月| 欧美日韩精品在线一区二区| 亚洲毛片网站| 亚欧无线一线二线三线区别| 夜夜精品视频| 久久美女福利视频| 国产精品久久久亚洲一区| 欧美国产激情视频| 久久久夜夜夜| www.超碰com| 秋霞成人午夜伦在线观看| 成人免费在线观看视频网站| 老汉av免费一区二区三区| 国产免费中文字幕| 国产精品一二三区| 91porn在线| a美女胸又www黄视频久久| 国产精品第七页| 国产亚洲综合在线| 人与动物性xxxx| 亚洲一区日韩精品中文字幕| 五月天婷婷网站| 色视频一区二区| 在线免费观看日韩视频| 欧美一区二区三区小说| 丰满人妻一区二区三区无码av | 特黄特黄一级片| 成人精品免费看| 国产麻豆天美果冻无码视频| 欧美激情中文不卡| 中文字幕av播放| 亚洲福利视频导航| 无码人妻久久一区二区三区| 欧美精品99久久久**| 性猛交富婆╳xxx乱大交天津| 亚洲第一区在线观看| 国产一区二区三区福利| 久久精品久久久久电影| 波多野结衣在线观看| 日本精品性网站在线观看| 国产一区二区| 鲁鲁视频www一区二区| 欧美成人精品一区二区三区在线看| 成人免费看片视频在线观看| 国产亚洲毛片| 国内国产精品天干天干| 99久久婷婷国产综合精品电影 | 亚洲乱码中文字幕综合| 色网站在线播放| 欧美精品一级二级三级| 色窝窝无码一区二区三区成人网站 | 久久69精品久久久久久久电影好| 绿色成人影院| 成人午夜激情免费视频| 亚洲国产国产| 成年人视频网站免费| 日韩中文字幕av电影| 亚洲区 欧美区| 欧美激情综合在线| 国产精品999久久久| 欧美欧美欧美欧美| 欧美xxx.com| 欧美激情高清视频| 国产激情欧美| 免费久久99精品国产自| 欧美国产免费| 国产亚洲视频一区| 久久久久久电影| 欧美激情亚洲综合| 精品国产一区二区在线观看| 五月婷婷在线视频| 国产va免费精品高清在线观看| av毛片精品| 超碰97免费观看| 免费成人在线视频观看| 亚洲国产欧美视频| 亚洲高清在线视频| a视频免费在线观看| 色偷偷综合社区| 二区三区不卡| 国产一区在线免费| 午夜日韩在线| 成人性生交视频免费观看| 国产人成一区二区三区影院| 99热在线观看免费精品| 欧美精品一区二区三区久久久| 精品视频在线一区二区| 国产日韩一区在线| 欧美呦呦网站| 国产情侣av自拍| 国产亚洲精品aa午夜观看| 成人午夜淫片100集| 亚洲护士老师的毛茸茸最新章节| 午夜小视频福利在线观看| 国产色综合天天综合网| 91久久夜色精品国产按摩| 97公开免费视频| 久久精品亚洲国产奇米99| 久久精品无码av| 亚洲美女av在线播放| 成人美女大片| 日本一区二区免费看| 三级成人在线视频| www亚洲色图| 欧美影视一区在线| av中文字幕一区二区三区| 国产精品视频久久久久| 色婷婷色综合| 久久久精品高清| 尤物在线观看一区| 亚洲高清精品视频| 韩国精品久久久999| 亚洲裸色大胆大尺寸艺术写真| 日本在线观看a| 国产欧美一区二区三区网站| 一本一道人人妻人人妻αv| www.亚洲天堂| 久久国产精品免费一区二区三区| 青青在线视频免费观看| 成人精品视频一区二区三区 | 欧美在线精品一区| 中文在线字幕观看| 午夜国产精品一区| 国产精品一区二区婷婷| 国产日韩在线一区| 狠狠88综合久久久久综合网| 女同毛片一区二区三区| 欧美在线啊v一区| 国产原创精品视频| 国产亚洲欧美另类一区二区三区| 久久国产直播| 熟女少妇a性色生活片毛片| 日韩欧美一区二区免费| 亚洲插插视频| 裸体裸乳免费看| av电影天堂一区二区在线| 波多野结衣二区三区| 欧美成人自拍视频| 亚洲性视频大全| 久久久久久久久久一区| 亚洲成av人在线观看| 国产在线观看精品一区| 成人午夜高潮视频| 美女网站久久| 精品爆乳一区二区三区无码av| 精品亚洲永久免费精品 | 成人av影视在线| 快she精品国产999|