精品久久久久久久久中文字幕_成人在线免费观看视视频_成人久久精品视频_热99精品里视频精品_日韩国产欧美精品在线_色多多国产成人永久免费网站_国产一区二区三区18_日韩美女免费观看_亚洲va久久久噜噜噜_亚洲精品一区二区在线_亚洲福利视频在线_中文字幕亚洲情99在线_91精品久久久久久久久久久久久_欧美日韩成人在线观看_日本精品视频在线播放_97视频在线观看播放

二維碼
企資網(wǎng)

掃一掃關(guān)注

當(dāng)前位置: 首頁 » 企業(yè)資訊 » 行業(yè) » 正文

庖丁解牛___圖解MySQL_8.0優(yōu)化器查

放大字體  縮小字體 發(fā)布日期:2021-09-13 20:28:21    作者:企資小編    瀏覽次數(shù):109
導(dǎo)讀

一 背景和架構(gòu)我們都知道,利用編寫程序來動態(tài)實(shí)現(xiàn)我們應(yīng)用所需要的邏輯,從而程序執(zhí)行時得到我們需要的結(jié)果。那么數(shù)據(jù)庫就是一種通過輸入SQL字符串來快速獲取數(shù)據(jù)的應(yīng)用。當(dāng)然,假設(shè)沒有數(shù)據(jù)庫這種系統(tǒng)應(yīng)用,用程序

一 背景和架構(gòu)

我們都知道,利用編寫程序來動態(tài)實(shí)現(xiàn)我們應(yīng)用所需要的邏輯,從而程序執(zhí)行時得到我們需要的結(jié)果。那么數(shù)據(jù)庫就是一種通過輸入SQL字符串來快速獲取數(shù)據(jù)的應(yīng)用。當(dāng)然,假設(shè)沒有數(shù)據(jù)庫這種系統(tǒng)應(yīng)用,用程序如何實(shí)現(xiàn)呢?我們可能會發(fā)現(xiàn),即使不管數(shù)據(jù)如何存儲、數(shù)據(jù)是否并發(fā)訪問,仍然需要不斷通過修改程序處理不同應(yīng)用對數(shù)據(jù)的不同請求。比如大數(shù)據(jù)領(lǐng)域,我們通常通過非關(guān)系型數(shù)據(jù)庫的API,實(shí)現(xiàn)對數(shù)據(jù)的獲取。然而這種方式雖然入門簡單,但是維護(hù)極難,而且通用性不強(qiáng),即使不斷進(jìn)行軟件架構(gòu)設(shè)計(jì)或者抽象重構(gòu),仍然需要不斷地變換應(yīng)用,這也是為何非關(guān)系型數(shù)據(jù)庫回頭擁抱數(shù)據(jù)庫SQL優(yōu)化器的原因。

SQL優(yōu)化器本質(zhì)上是一種高度抽象化的數(shù)據(jù)接口的實(shí)現(xiàn),經(jīng)過該設(shè)計(jì),客戶可以使用更通用且易于理解的SQL語言,對數(shù)據(jù)進(jìn)行操作和處理,而不需要關(guān)注和抽象自己的數(shù)據(jù)接口,極大地解放了客戶的應(yīng)用程序。

本文就來通過圖形解說的方式介紹下MySQL 8.0 SQL優(yōu)化器如何把一個簡單的字符串(SQL),變成數(shù)據(jù)庫執(zhí)行器可以理解的執(zhí)行序列,最終將數(shù)據(jù)返還給客戶。強(qiáng)大的優(yōu)化器是不需要客戶關(guān)注SQL如何寫的更好來更快獲得需要的數(shù)據(jù),因此優(yōu)化器對原始SQL一定會做一些等價的變化。在《MySQL 8.0 Server層最新架構(gòu)詳解》一文中我們重點(diǎn)介紹了MySQL最新版本關(guān)于Server層解析器、優(yōu)化器和執(zhí)行器的總體介紹,包括一些代碼結(jié)構(gòu)和變化的詳細(xì)展示,并且通過simple_joins函數(shù)拋磚引玉展示了MySQL優(yōu)化器在邏輯變換中如何簡化嵌套Join的優(yōu)化。本文我們會一步一步帶你進(jìn)入神奇的優(yōu)化器細(xì)節(jié),詳細(xì)了解優(yōu)化器優(yōu)化部分的每個步驟如何改變著一個SQL最終的執(zhí)行。

本文基于最新MySQL8.0.25版本,因?yàn)閮?yōu)化器轉(zhuǎn)換部分篇幅比較長,我們分成兩篇文章來介紹,第一部分介紹基于基本結(jié)構(gòu)的Setup和Resolve的解析轉(zhuǎn)換過程,第二部分介紹更為復(fù)雜的子查詢、分區(qū)表和連接的復(fù)雜轉(zhuǎn)換過程,大綱如下:

Setup and Resolve

  • setup_tables : Set up table leaves in the query block based on list of tables.
  • resolve_placeholder_tables/merge_derived/setup_table_function/setup_materialized_derived : Resolve derived table, view or table function references in query block.
  • setup_natural_join_row_types : Compute and store the row types of the top-most NATURAL/USING joins.
  • setup_wild : Expand all '*' in list of expressions with the matching column references.
  • setup_base_ref_items : Set query_block's base_ref_items.
  • setup_fields : Check that all given fields exists and fill struct with current data.
  • setup_conds : Resolve WHERe condition and join conditions.
  • setup_group : Resolve and set up the GROUP BY list.
  • m_having_cond->fix_fields : Setup the HAVINg clause.
  • resolve_rollup : Resolve items in SELECt list and ORDER BY list for rollup processing.
  • resolve_rollup_item : Resolve an item (and its tree) for rollup processing by replacing items matching grouped expressions with Item_rollup_group_items and updating properties (m_nullable, PROP_ROLLUP_FIELD). Also check any GROUPING function for incorrect column.
  • setup_order : Set up the ORDER BY clause.
  • resolve_limits : Resolve OFFSET and LIMIT clauses.
  • Window::setup_windows1: Set up windows after setup_order() and before setup_order_final().
  • setup_order_final: Do final setup of ORDER BY clause, after the query block is fully resolved.
  • setup_ftfuncs : Setup full-text functions after resolving HAVINg.
  • resolve_rollup_wfs : Replace group by field references inside window functions with references in the presence of ROLLUP.

    二 詳細(xì)轉(zhuǎn)換過程

    轉(zhuǎn)換的整個框架是由Query_expression到Query_block調(diào)用prepare函數(shù)(sql/sql_resolver.cc)并且根據(jù)不同轉(zhuǎn)換規(guī)則的要求自頂向下或者自底向上的過程。

    圖片

    1 傳遞null到j(luò)oin的內(nèi)表列表(propagate_nullability)

    prepare開始先要處理nullable table,它指的是table可能包含全為null的row,根據(jù)JOIN關(guān)系(top_join_list)null row可以被傳播。如果能確定一個table為nullable會使得一些優(yōu)化退化,比如access method不能為EQ_REF、outer join不能優(yōu)化為inner join等。

    2 解析設(shè)置查詢塊的leave_tables(setup_tables)

    SELECT  t1.c1FROM t1,     (SELECt       t2.c1     FROM t2,          (SELECt            t3.c1          FROM t3          UNIOn          SELECt            t4.c1          FROM t4) AS t3a) AS t2a;

    未在setup_table調(diào)用之前,每個Query_block的leaf_tables是為0的。

    該函數(shù)的作用就是構(gòu)建leaf_tables,包括base tables和derived tables列表,用于后續(xù)的優(yōu)化。setup_tables并不會遞歸調(diào)用,而是只解決本層的tables,并統(tǒng)計(jì)出本層derived table的個數(shù)。但是隨后會調(diào)用resolve_placeholder_tables()->resolve_derived()->derived(Query_expression)::prepare->Query_block::prepare來專門遞歸處理derived table對應(yīng)的Query_expression。

    接下來我們根據(jù)prepare的調(diào)用順序,繼續(xù)看下針對于derived table處理的函數(shù)resolve_placeholder_tables。

    3 解析查詢塊Derived Table、View、Table函數(shù) (resolve_placeholder_tables)

    這個函數(shù)用于對derived table、view和table function的處理,如果該table已經(jīng)merged過了,或者是由于使用transform_grouped_to_derived()被調(diào)用到,已經(jīng)決定使用materialized table方式,則直接忽略。

    前面已經(jīng)介紹過resolve_derived()的作用,我們重點(diǎn)介紹merge_derived()函數(shù),merge_derived是改變Query_expression/Query_block框架結(jié)構(gòu),將derived table或者view合并到到query block中。

    merge_derived 處理和合并Derived table

    1)merge_derived transformation的先決條件

  • 外層query block是否允許merge(allow_merge_derived)外層query block為nullptr外層query expression的子查詢?yōu)閚ullptr,derived table是第一層子查詢外層的外層query block可以allow_merge_derived=true,或者不包括外層的外層query block話是否為SELECt/SET
  • 外層lex是否可以支持merge(lex->can_use_merged()+lex->can_no_use_merged())
  • derived table是否已經(jīng)被標(biāo)記為需要物化materialize,比如創(chuàng)建視圖的方法是CREATE ALGORITHM=TEMPTABLE VIEW(derived_table->algorithm == VIEW_ALGORITHM_TEMPTABLE)
  • 整個dervived table所在的查詢表達(dá)式單元中,不能是(Query_expression::is_mergeable() ):Union查詢包含聚集、HAVINg、DISTINCT、WINDOWS或者LIMIT沒有任何table list
  • HINT或者optimizer_switch沒有禁止derived_merge
  • heuristic建議合并(derived_query_expressionmerge_heuristic())如果derived table包含的子查詢SELECT list依賴于自己的列時,不支持如果是dependant subquery需要多次執(zhí)行時,不支持
  • derived table中如果查詢塊包含SEMI/ANTI-JOIN,并指定STRAIGHT_JOIN時,不支持
  • 如果合并的derived table和現(xiàn)有query block的leaf table count大約 MAX_TABLES時,不支持

    2)merge_derived transformation的轉(zhuǎn)換過程

  • 利用derived_table->nested_join結(jié)構(gòu)來輔助處理OUTER JOIN的情況。
  • 把derived table中的表merge到NESTED_JOIN結(jié)構(gòu)體(derived_table->merge_underlying_tables())
  • 將derived table中的所有表連接到父查詢的table_list列表中,同時把derived table從父查詢中刪除。
  • 對父查詢的所有相關(guān)數(shù)據(jù)結(jié)構(gòu)進(jìn)行重新計(jì)算(leaf_table_count,derived_table_count,table_func_count,materialized_derived_table_count,has_sj_nests,has_aj_nests,partitioned_table_count,cond_count,between_count,select_n_having_items)
  • 傳播設(shè)置父查詢OPTION_SCHEMA_TABLE(add_base_options())和如果是外查詢JOIN的內(nèi)表,傳播設(shè)置nullable屬性(propagate_nullability())
  • 合并derived table的where條件到外查詢中(merge_where())
  • 建立對derived table需要獲取的列的引用(create_field_translation())
  • 將Derived table的結(jié)構(gòu)從父查詢中刪除(exclude_level())
  • 將derived table中的列或者表的重命名合并到父查詢(fix_tables_after_pullout()/repoint_contexts_of_join_nests())
  • 因?yàn)橐呀?jīng)把derived table中包含的表merge到了父查詢,所以需要對TABLE_LIST中的表所在的位置進(jìn)行重新定位(remap_tables())
  • 將derived table合并到父查詢之后,需要重新修改原來derived table中所有對derived table中所有列的引用(fix_tables_after_pullout())
  • 如果derived table中包含ORDER By語句,如果滿足下列條件,derived table將會保留ORDER BY并合并到父查詢中,其他情況ORDER BY將會被忽略掉:如果父查詢允許排序并且正好是只有derived table不是一個UNIOn可以有WHERe條件,但是不能有g(shù)roup by或聚合函數(shù)本身并不是有序的

    過程簡化為:

    merge_derived 圖解過程

    看起來官方的derived merge還是不夠完美,無法自底向上的遞歸merge
    包含的opt trace:

    trace_derived.add_utf8_table(derived_table)       .add("select#", derived_query_block->select_number)       .add("merged", true);trace_derived.add_alnum("transformations_to_derived_table", "removed_ordering");

    該優(yōu)化可以通過set optimizer_switch="derived_merge=on/off"來控制。

    setup_materialized_derived 設(shè)置物化Derived Table

    對于剩下不能采用 merge 算法的 derived table ,會轉(zhuǎn)為materialize 物化方式去處理。但此時只是做一些變量設(shè)置等預(yù)處理,實(shí)際的物化執(zhí)行是在executor階段執(zhí)行。

  • setup_materialized_derived_tmp_table(): 設(shè)置一個臨時表包含物化Derived Table的所有行數(shù)據(jù)。
  • check_materialized_derived_query_blocks(): 設(shè)置屬于當(dāng)前Derived Table所在的查詢塊結(jié)構(gòu)。
    trace_derived.add_utf8_table(this)       .add("select#", derived->first_query_block()->select_number)       .add("materialized", true);

    setup_table_function 處理表函數(shù)

    如果 query block 中有 table function,整個過程會處理兩遍。第一遍會跳過 table function 的 table ,第二遍才專門再對table function 的 table 執(zhí)行一遍上述邏輯。這里的考慮應(yīng)該是先 resolve 了外部環(huán)境(相對于table function),因?yàn)橛锌赡芎瘮?shù)參數(shù)會有依賴外部的 derived table。

    trace_derived.add_utf8_table(this)       .add_utf8("function_name", func_name, func_name_len)       .add("materialized", true);

    4 將SELECT *的通配符展開成具體的fields(setup_wild)

    5 建立Query_block級別的base_ref_items(setup_base_ref_items)

    base_ref_items記錄了所有Item的位置,方便查詢塊的其他Item可以進(jìn)行引用,或者通過Item_ref及其Item_ref子類進(jìn)行直接引用,例如子查詢的引用(Item_view_ref)、聚合函數(shù)引用(Item_aggregate_ref)、外查詢列的引用(Item_outer_ref)、subquery 子查詢產(chǎn)生NULL value的引用輔助(Item_ref_null_helper)。

    舉例說明比較復(fù)雜的Item_outer_ref:

    6 對select_fields進(jìn)行fix_fields()和列權(quán)限檢查(setup_fields)

    下圖是比較復(fù)雜的帶子查詢的fixed field過程。有些field和表關(guān)聯(lián),有的要添加相應(yīng)的Item_xxx_ref引用。

    7 解析和fixed_fields WHERe條件和Join條件(setup_conds)

    setup_join_cond如果有nested_join會遞歸調(diào)用setup_join_cond進(jìn)行解析和設(shè)置。這里也順帶介紹下simplify_const_condition函數(shù)的作用,如果發(fā)現(xiàn)可以刪除的const Item,則會用Item_func_true/Item_func_false來替代整個的條件,如圖。

    8 解析和設(shè)置ROLLUP語句(resolve_rollup)

    在數(shù)據(jù)庫查詢語句中,在 GROUP BY 表達(dá)式之后加上 WITH ROLLUP 語句,可以使得通過單個查詢語句來實(shí)現(xiàn)對數(shù)據(jù)進(jìn)行不同層級上的分析與統(tǒng)計(jì)。

    SELECT YEAR,       country,       product,       SUM(profit) AS profitFROM salesGROUP BY YEAR,         country,         product WITH ROLLUP;+------+---------+------------+--------+| year | country | product    | profit |+------+---------+------------+--------+| 2000 | Finland | Computer   |   1500 || 2000 | Finland | Phone      |    100 || 2000 | Finland | NULL       |   1600 || 2000 | India   | Calculator |    150 || 2000 | India   | Computer   |   1200 || 2000 | India   | NULL       |   1350 || 2000 | USA     | Calculator |     75 || 2000 | USA     | Computer   |   1500 || 2000 | USA     | NULL       |   1575 || 2000 | NULL    | NULL       |   4525 || 2001 | Finland | Phone      |     10 || 2001 | Finland | NULL       |     10 || 2001 | USA     | Calculator |     50 || 2001 | USA     | Computer   |   2700 || 2001 | USA     | TV         |    250 || 2001 | USA     | NULL       |   3000 || 2001 | NULL    | NULL       |   3010 || NULL | NULL    | NULL       |   7535 |+------+---------+------------+--------+相當(dāng)于做了下面的查詢:SELECt *FROM  (SELECt YEAR,          country,          product,          SUM(profit) AS profit   FROM sales   GROUP BY YEAR,            country,            product   UNIOn ALL SELECt YEAR,                    country,                    NULL,                    SUM(profit) AS profit   FROM sales   GROUP BY YEAR,            country   UNIOn ALL SELECt YEAR,                    NULL,                    NULL,                    SUM(profit) AS profit   FROM sales   GROUP BY YEAR   UNIOn ALL SELECt NULL,                    NULL,                    NULL,                    SUM(profit) AS profit   FROM sales) AS sum_tableORDER BY YEAR, country, product;+------+---------+------------+--------+| YEAR | country | product    | profit |+------+---------+------------+--------+| NULL | NULL    | NULL       |   7535 || 2000 | NULL    | NULL       |   4525 || 2000 | Finland | NULL       |   1600 || 2000 | Finland | Computer   |   1500 || 2000 | Finland | Phone      |    100 || 2000 | India   | NULL       |   1350 || 2000 | India   | Calculator |    150 || 2000 | India   | Computer   |   1200 || 2000 | USA     | NULL       |   1575 || 2000 | USA     | Calculator |     75 || 2000 | USA     | Computer   |   1500 || 2001 | NULL    | NULL       |   3010 || 2001 | Finland | NULL       |     10 || 2001 | Finland | Phone      |     10 || 2001 | USA     | NULL       |   3000 || 2001 | USA     | Calculator |     50 || 2001 | USA     | Computer   |   2700 || 2001 | USA     | TV         |    250 |+------+---------+------------+--------+

    排序由于有NULL的問題,所以分級匯總的效果非常難弄,而且group 列不同改變,SQL復(fù)雜度來回變化,而ROLLUP很簡單就可以實(shí)現(xiàn)效果,下面看下rollup在解析過程做了什么樣的轉(zhuǎn)換達(dá)到了意想不到的效果。

    9 解析和設(shè)置GROUP BY/ORDER BY語句(setup_group/setup_order)

    其中一個函數(shù)find_order_in_list(): 嘗試在select fields里去尋找可以映射的列,否則就得在最后投影的all fields里加上當(dāng)前列,同時也做fix_fields。

  • m_having_cond->fix_fields : 對having條件進(jìn)行fixed_fields。
  • resolve_limits : 處理OFFSET和LIMIT子句(offset_limit和select_limit的Items)。
  • setup_ftfuncs : 如果有full-text的函數(shù),對相關(guān)Item進(jìn)行fix_fields。

    remove_redundant_subquery_clause : 對于Table Subquery的表達(dá)式,通常是IN/ANY/ALL/EXISTS/etc,如果沒有聚合函數(shù)和Having子句,通??梢钥紤]刪除不必要的ORDER/DISTINCT/GROUP BY。該函數(shù)支持三種REMOVE_ORDER | REMOVE_DISTINCT | REMOVE_GROUP,如果是SINGLEROW_SUBS的子查詢,只考慮刪除REMOVE_ORDER。

    select c1 from t1 where t1.c2 in (select distinct c1 from t2 group by c1, c2 order by c1);轉(zhuǎn)化為 =>select c1 from t1 where t1.c2 in (select c1 from t2);
  • 處理是否可以刪除不必要的distinct語句,刪除的條件就是GROUP BY的列都在SELECt列表中,并且沒有ROLLUP和Window函數(shù)。
    is_grouped() && hidden_group_field_count == 0 && olap == UNSPECIFIED_OLAP_TYPE

    例如場景:

    SELECT DISTINCT c1, max(c2) from t1 group by c1;

    10 解析和設(shè)置Window函數(shù)(Window::setup_windows1)

    SELECt id,       release_year,       rating,       avg(rating) over(PARTITION BY release_year) AS year_avgFROM tw;+------+--------------+--------+-------------------+| id   | release_year | rating | year_avg          |+------+--------------+--------+-------------------+|    1 |         2015 |      8 |               8.5 ||    3 |         2015 |      9 |               8.5 ||    2 |         2015 |    8.5 |               8.5 ||    4 |         2016 |    8.2 |               8.3 ||    5 |         2016 |    8.4 |               8.3 ||    6 |         2017 |      7 |                 7 |+------+--------------+--------+-------------------+

    執(zhí)行的過程和結(jié)果類似于下圖:

    我們看下它在開始Query_block::prepare解析過程做了哪些事情:

    select_lex->m_windows 不為空,就調(diào)用 Window::setup_windows1

  • 遍歷window函數(shù)列表,調(diào)用resolve_window_ordering來解析m_partition_by和m_order_by
  • 處理inter-window的引用關(guān)系(如WINDOW w1 AS (w2), w2 AS (), w3 AS (w1)),但必須是一個有向無環(huán)圖(DAG)
  • 重新遍歷檢查是否唯一名字check_unique_name、創(chuàng)建window partition by和window order by的引用items
  • 檢查窗口函數(shù)特征(Window::check_window_functions1(THD thd, _block select))首先判斷的是當(dāng)前是靜態(tài)窗口還是動態(tài)窗口;靜態(tài)窗口即判斷了 frame 的定義是否有定義上下邊界。m_static_aggregates 為 true, 意味著是靜態(tài)窗口,同時對每一個分區(qū)都可以進(jìn)行一次評估。如果 ma_static_aggregates 為 false, 則進(jìn)一步判斷其滑動窗口使用的是基于范圍還是基于行。 m_row_optimizable 基于行 m_range_optimizable 基于范圍獲取聚合函數(shù)作為窗口函數(shù)時候窗口的特殊規(guī)格要求wfs->check_wf_semantics1(thd, select, &reqs) 這個方法其實(shí)就是判斷是不是需要row_buffer作為評估,如果我們只看當(dāng)前分區(qū)的行無法進(jìn)行正確的計(jì)算不需要,而需要看之后的或者之前的行,就需要使用row_buffer。

    三 綜述

    本文重點(diǎn)介紹了下優(yōu)化器的基于規(guī)則的其中一部分優(yōu)化,更多的偏重于SQL中的基本操作符,如表、列、函數(shù)、聚合、分組、排序等元素的解析和設(shè)置以及一些顯而易見的結(jié)構(gòu)變化。下一篇文章我們將繼續(xù)介紹子查詢、分區(qū)表和JOIN操作的轉(zhuǎn)換部分,敬請期待。

    四 參考資料

  • 《MySQL 8.0 Server層最新架構(gòu)詳解》
  • 《Mysql derived_MySQL · 新特性分析 · 5.7中Derived table變形記》
  • 《ROLLUP性能增強(qiáng)》
  • 《WL#9236, WL#9603 and WL#9727 - Add SQL window functions to MySQL》

    五 關(guān)于我們

    PolarDB 是阿里巴巴自主研發(fā)的云原生分布式關(guān)系型數(shù)據(jù)庫,于2020年進(jìn)入Gartner全球數(shù)據(jù)庫Leader象限,并獲得了2020年中國電子學(xué)會頒發(fā)的科技進(jìn)步一等獎。PolarDB 基于云原生分布式數(shù)據(jù)庫架構(gòu),提供大規(guī)模在線事務(wù)處理能力,兼具對復(fù)雜查詢的并行處理能力,在云原生分布式數(shù)據(jù)庫領(lǐng)域整體達(dá)到了國際領(lǐng)先水平,并且得到了廣泛的市場認(rèn)可。在阿里巴巴集團(tuán)內(nèi)部的最佳實(shí)踐中,PolarDB還全面支撐了2020年天貓雙十一,并刷新了數(shù)據(jù)庫處理峰值記錄,高達(dá)1.4億TPS。歡迎有志之士加入我們,簡歷請投遞到daoke.wangc@alibaba-inc,期待與您共同打造世界一流的下一代云原生分布式關(guān)系型數(shù)據(jù)庫。


    作者 | 道客

    原文鏈接:click.aliyun/m/1000295120/

    本文為阿里云原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。

  •  
    (文/企資小編)
    免責(zé)聲明
    本文僅代表作發(fā)布者:企資小編個人觀點(diǎn),本站未對其內(nèi)容進(jìn)行核實(shí),請讀者僅做參考,如若文中涉及有違公德、觸犯法律的內(nèi)容,一經(jīng)發(fā)現(xiàn),立即刪除,需自行承擔(dān)相應(yīng)責(zé)任。涉及到版權(quán)或其他問題,請及時聯(lián)系我們刪除處理郵件:weilaitui@qq.com。
     

    Copyright ? 2016 - 2025 - 企資網(wǎng) 48903.COM All Rights Reserved 粵公網(wǎng)安備 44030702000589號

    粵ICP備16078936號

    微信

    關(guān)注
    微信

    微信二維碼

    WAP二維碼

    客服

    聯(lián)系
    客服

    聯(lián)系客服:

    在線QQ: 303377504

    客服電話: 020-82301567

    E_mail郵箱: weilaitui@qq.com

    微信公眾號: weishitui

    客服001 客服002 客服003

    工作時間:

    周一至周五: 09:00 - 18:00

    反饋

    用戶
    反饋

    久久久久久久中文字幕| 日韩高清a**址| 国产精品一区二区在线免费观看| 亚洲第一福利网站| 激情欧美日韩| 欧美裸体在线版观看完整版| 国产97色在线 | 日韩| 精品视频www| zzijzzij亚洲日本少妇熟睡| 99久久亚洲精品日本无码| av亚洲在线观看| 超碰最新在线| 欧美a v在线播放| 日本三级一区二区| 激情小说综合网| 成人性教育av免费网址| 中文字幕国内精品| 国产不卡精品一区二区三区| 成视人a免费观看视频| 日韩不卡一区二区三区| 91麻豆国产福利在线观看| 成人网在线免费看| www.桃色.com| 亚洲成人资源网| 992tv成人国产福利在线| 久久精品小视频| 欧美美女网站色| 天天做天天摸天天爽国产一区| 欧美极品另类videosde| 一本一道久久综合狠狠老精东影业| 国产美女主播在线| 阿v天堂2017| 亚洲天堂av综合网| 国产免费a∨片在线观看不卡| 成人综合日日夜夜| 亚洲色图校园春色| 天天影视综合色| 欧美va亚洲va在线观看蝴蝶网| 青青草97国产精品免费观看无弹窗版| 久久综合久久综合九色| 亚洲乱码日产精品bd| 97久久久精品综合88久久| www.日韩精品| 女人被狂躁到高潮视频免费网站| 福利一区二区三区视频在线观看| 国产精品白丝av嫩草影院| 精品毛片免费观看| 大桥未久在线视频| 2019一级黄色毛片免费看网| 欧美aⅴ99久久黑人专区| 日韩丝袜美女视频| 精品少妇av| 亚洲免费在线观看av| 日韩欧美一区二区三区免费看| 国产成人免费视频一区| 国产午夜精品久久久久久久| 在线 亚洲欧美在线综合一区| 亚洲国产成人影院播放| 不卡中文字幕在线观看| 亚洲精品免费一区亚洲精品免费精品一区| 99久久免费精品高清特色大片| 国产大片一区二区| 天天想你在线观看完整版电影免费| 国产在线免费av| 91免费国产精品| 中文字幕超清在线免费观看| 欧美精品人人做人人爱视频| 看亚洲a级一级毛片| 国产激情无套内精对白视频| 黄色片免费观看| 日本精品视频一区二区| 亚洲成人黄色小说| 成 人 黄 色 小说网站 s色| 极品色影院av| 884aa四虎影成人精品一区| 久久久久噜噜噜亚洲熟女综合| 一区二区视频免费| 日韩在线观看免费全| 91蜜桃传媒精品久久久一区二区| 九九热在线视频免费观看| 精品久久久久久亚洲| 精品国产一区二区三区久久久樱花| 97人妻人人揉人人躁人人| 久久国产亚洲精品无码| 无码人妻丰满熟妇精品区| 亚洲电影av| 国产原创视频在线| 免费网站在线观看视频| 欧美色图中文字幕| 午夜精品久久久久久| 国产99在线|亚洲| 国产成人免费视频精品含羞草妖精| 99精品人妻无码专区在线视频区| 人人爽久久涩噜噜噜网站| 欧美在线高清视频| 国产69久久精品成人| 99精品一区二区三区| 狠狠人妻久久久久久综合| 午夜视频网站在线观看| 羞羞视频在线观看免费| 亚洲亚洲精品三区日韩精品在线视频| 狠久久av成人天堂| 国产片高清在线观看| 欧美日韩一区二区三区不卡| 欧洲综合视频| 国产黄色在线播放| 国产精品videossex久久发布| 亚洲色偷偷综合亚洲av伊人| 欧美老熟妇喷水| 日韩精品极品| 中文字幕乱码人妻二区三区| 亚洲精品粉嫩美女一区| 91香蕉国产线在线观看| 日本免费黄网站| 玖玖玖国产精品| 女人黄色片免费| 国产视频手机在线播放| 欧美激情一级片一区二区| 欧美激情亚洲精品| 日本视频www色| 欧美乱妇20p| 久久三级毛片| 不卡视频免费在线观看| 国产欧美日韩精品综合| 欧美另类自拍| 伊人在线视频观看| 狠狠干婷婷色| 91在线视频| 风韵丰满熟妇啪啪区老熟熟女| 亚洲国产毛片aaaaa无费看| 国产美女永久无遮挡| 日韩av不卡一区| 一本色道**综合亚洲精品蜜桃冫| 日本亚洲欧洲精品| 中文在线中文字幕| 久久日韩精品| 中文字幕在线观看免费高清| 亚洲综合色自拍一区| 一本色道久久88亚洲综合88| 欧美做受高潮6| 国产精品一区二区三区四区在线观看| 日韩在线免费av| 美女视频一区在线观看| 少妇丰满尤物大尺度写真| 欧美久久久一区| 亚洲欧美视频二区| 国产精美视频| 中文字幕v亚洲ⅴv天堂| 色播视频在线观看| 国产情侣在线视频| 亚洲免费成人在线| 91久久综合亚洲鲁鲁五月天| 欧美国产另类| 成人久久久久久久| 成人免费a**址| 鲁啊鲁视频在线精品| 99视频免费播放| 国产日韩第一页| 国产91亚洲精品一区二区三区| 91看片淫黄大片一级在线观看| 精品免费av一区二区三区| av最新在线| 韩国成人动漫在线观看| 欧美尿孔扩张虐视频| 亚洲热在线观看| 国产情侣第一页| 亚洲女人的天堂| 91情侣在线视频| 久久精品亚洲无码| 91精品国产91久久久久青草| 国产一区二区不卡| 国产国语刺激对白av不卡| 成人免费网站在线| 亚洲aⅴ乱码精品成人区| 久久久精品动漫| 国产美女激情视频| 欧美成人精品一区二区免费看片| 高清国产午夜精品久久久久久| 午夜一级毛片| 蜜桃精品wwwmitaows| 亚洲成人网久久久| 在线播放国产精品二区一二区四区| 中文乱码字幕高清一区二区| 亚洲欧洲美洲国产香蕉| 亚洲精品成人在线| 日韩精品免费一区二区三区竹菊| 欧美系列日韩一区| 精品99久久| 亚洲一区尤物| 国产精品久久久久久久久久久久久久久久| 国产精品综合不卡av| 久久五月婷婷丁香社区| av色综合久久天堂av色综合在| 国产久卡久卡久卡久卡视频精品| 亚洲视频在线不卡| 国产亚洲午夜高清国产拍精品| 久9re热视频这里只有精品| 久久精品女人的天堂av| 粉嫩av免费一区二区三区| 成人免费视频视频| 韩国三级hd中文字幕| 亚洲专区在线| 久久久久久久久久久影院| 亚洲精品a级片| 成人av免费电影| 久久国产精品美女| 欧美福利在线播放| 最新的欧美黄色| 亚洲午夜久久久影院| 成人午夜又粗又硬又大| 欧美日韩成人在线播放| 777午夜精品电影免费看| 亚洲欧洲激情在线| 久久久久久久久毛片| 麻豆md0077饥渴少妇| 呦视频在线一区二区三区| **欧美日韩在线观看| 高清无码一区二区在线观看吞精| 国语自产精品视频在线看一大j8| 国产精品久久久久久中文字| 久久久亚洲欧洲日产国码aⅴ| 97精品国产97久久久久久粉红| h网站视频在线观看| 亚洲大片精品免费| 国产美女娇喘av呻吟久久| 欧美高清视频一区| 国产乱淫a∨片免费观看| 久久久久久久久久一区二区三区| 69精品久久久| 日韩精品一级| 国产做受高潮69| 欧美日韩第一区日日骚| 欧美一区二区福利| 欧美特级限制片免费在线观看| 野外性xxxxfreexxxxx欧美| 欧美孕妇毛茸茸xxxx| 亚洲一区电影在线观看| 日韩中文字幕无砖| 成人免费播放器| 青春草免费在线视频| 久久这里只有精品6| 国产日韩视频在线播放| 一区二区三区四区高清精品免费观看| 色总=综合色| 午夜精品一区二区三区在线播放| 国产免费av观看| 激情视频在线观看一区二区三区| 亚洲综合成人在线视频| 蜜桃av一区二区三区电影| 艳妇乳肉亭妇荡乳av| 91社区国产高清| 丰满熟妇人妻中文字幕| 91香蕉视频在线播放| 精品国产乱码91久久久久久网站| 亚洲а∨精品天堂在线| 亚洲怡红院在线观看| 亚洲免费三区一区二区| 亚洲成人精品影院| 中文字幕无码精品亚洲资源网久久| 日本亚洲欧洲无免费码在线| 伊人成人网在线看| 国产精品白嫩白嫩大学美女| 成人午夜视屏| 国产欧美一区二区视频| 一区二区三区高清视频在线观看| 91亚洲精品久久久蜜桃借种| 一区二区三区| 久久久久久久久久久亚洲| 外国一级黄色片| 香港日本韩国三级网站| 日韩av综合在线| 免费黄网在线看| 一级片免费观看视频| 日韩免费性生活视频播放| 99综合久久| 久久er精品视频| 成人精品一区| 韩国精品一区二区三区| 亚洲综合在线一区| 五月婷婷视频在线观看| 欧美日韩久久久久久| 日韩精品高清在线观看| 久久综合色天天久久综合图片| 国产免费区一区二区三视频免费| 在线免费观看a视频| 日韩禁在线播放| 午夜视频在线观看一区二区| 好吊色欧美一区二区三区四区| 亚洲欧美激情视频在线观看一区二区三区| 中文字幕 亚洲视频| 欧美午夜电影一区| 少妇人妻好深好紧精品无码| 久久久久成人精品免费播放动漫| 91超碰碰碰碰久久久久久综合| 久久久精品在线视频| 成人免费高清| 亚洲地区一二三色| 国产成人8x视频一区二区| 久久久久久久久国产一区| 特大黑人巨人吊xxxx| 亚洲国产综合在线| 精品国产乱码久久久久久久软件| 精品国产污污免费网站入口| 极品视频在线| 午夜精品一区二区三区电影天堂| 最近的2019中文字幕免费一页| 99精品欧美一区二区三区小说| 欧美肥胖老妇做爰| 日韩高清免费av| 一区二区三区天堂av| 亚洲一区中文字幕在线观看| 性感美女福利视频| 亚洲v国产v欧美v久久久久久| 免费精品一区二区三区在线观看| 北条麻妃av毛片免费观看| 精品嫩模一区二区三区| 午夜小视频在线播放| 欧美激情一级欧美精品| h在线观看视频免费网站| 精品国产一区二区国模嫣然| 国产精品一区二区资源| 日韩高清免费av| 亚洲黄色在线| 91av视频| 日本成人在线免费| 久久偷看各类wc女厕嘘嘘偷窃| 欧美在线视频一区| 2024短剧网剧在线观看|