成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > MySQL的join buffer原理

MySQL的join buffer原理

熱門標簽:400電話辦理服務(wù)價格最實惠 400電話變更申請 北京金倫外呼系統(tǒng) 大豐地圖標注app 呂梁外呼系統(tǒng) 南太平洋地圖標注 html地圖標注并導(dǎo)航 武漢電銷機器人電話 催天下外呼系統(tǒng)

一、MySQL的join buffer

在MySQL對于join操作的處理過程中,join buffer是一個重要的概念,也是MySQL對于table join的一個重要的優(yōu)化手段。雖然這個概念實現(xiàn)并不復(fù)雜,但是這個是實現(xiàn)MySQL join連接優(yōu)化的一個重要方法,在"暴力"連接的時候可以極大提高join查詢的效率。

關(guān)于這個概念的權(quán)威說明當然是來自MySQL文檔中對于這個概念的說明,說明的文字不多,但是言簡意賅,說明了這個優(yōu)化的主要實現(xiàn)思想:
Assume you have the following join:

Table name      Type
t1              range
t2              ref
t3              ALL
The join is then done as follows:
 
- While rows in t1 matching range
 - Read through all rows in t2 according to reference key
  - Store used fields from t1, t2 in cache
  - If cache is full
    - Read through all rows in t3
      - Compare t3 row against all t1, t2 combinations in cache
        - If row satisfies join condition, send it to client
    - Empty cache
 
- Read through all rows in t3
 - Compare t3 row against all stored t1, t2 combinations in cache
   - If row satisfies join condition, send it to client

二、join buffer cache存儲空間的分配

下面函數(shù)中table_count表示的就是所有join table中在該table之前的非const table數(shù)量,因為這個table要緩存自己之前所有table中的每條記錄中"需讀取"(tables[i].table->read_set置位)。

其中兩重循環(huán)每次執(zhí)行都是復(fù)制下需要緩存的field的描述結(jié)構(gòu)(及其對應(yīng)的數(shù)據(jù)源),或者說,二重循環(huán)只是為了賦值和保存元數(shù)據(jù),而最后的cache->buff=(uchar*) my_malloc(size,MYF(0))才是真正的分配滿足條件的記錄內(nèi)容。

static int
join_init_cache(THD *thd,JOIN_TAB *tables,uint table_count)
{
……
  for (i=0 ; i  table_count ; i++)
  {
    bool have_bit_fields= FALSE;
    uint null_fields=0,used_fields;
    Field **f_ptr,*field;
    MY_BITMAP *read_set= tables[i].table->read_set;
    for (f_ptr=tables[i].table->field,used_fields=tables[i].used_fields ;
 used_fields ;
 f_ptr++)
    {
      field= *f_ptr;
      if (bitmap_is_set(read_set, field->field_index))
      {
used_fields--;
length+=field->fill_cache_field(copy);
……
      }
  }
 
  cache->length=length+blobs*sizeof(char*);
  cache->blobs=blobs;
  *blob_ptr=0; /* End sequentel */
  size=max(thd->variables.join_buff_size, cache->length);
  if (!(cache->buff=(uchar*) my_malloc(size,MYF(0))))
    DBUG_RETURN(1); /* Don't use cache */ /* purecov: inspected */
  cache->end=cache->buff+size;
  reset_cache_write(cache);
  DBUG_RETURN(0);
}

三、普通的多表查詢實現(xiàn)

這個"普通"當然也可以理解為"樸素"、"直觀"的意思,也是大部分情況下的執(zhí)行流程。普通查詢其實就是對于對于各個表格進行遞歸調(diào)用,和矩陣的乘法一樣一樣的,這個對應(yīng)非常直觀,也非常通用。

而這個常規(guī)的查詢動作就是通過sub_select函數(shù)來實現(xiàn),這個函數(shù)本質(zhì)性上是執(zhí)行

tsecer_select()
{
for (r = first ; r != end ; r = next)
{
if(sofartest())
{
nexttable.tsecer_select()
}
}
}

其中的sofartest()表示"使用所有當前已讀取表格可以進行的判斷",也就是where中下推的表達式。例如 select * from a, b where a.a > 10 and b.b + a.a = 10,在a表讀取之后,其實已經(jīng)可以執(zhí)行 a.a > 10的判斷。當然這個是一個甚至算不上偽代碼的描述方法,而真正的代碼對應(yīng)為:

enum_nested_loop_state
sub_select(JOIN *join,JOIN_TAB *join_tab,bool end_of_records)
{
……
    error= (*join_tab->read_first_record)(join_tab);
    rc= evaluate_join_record(join, join_tab, error);
……
  while (rc == NESTED_LOOP_OK)
  {
    error= info->read_record(info);
    rc= evaluate_join_record(join, join_tab, error);
  }
……
  return rc;
}
static enum_nested_loop_state
evaluate_join_record(JOIN *join, JOIN_TAB *join_tab,
                     int error)
{
……
  if (select_cond)
  {
    select_cond_result= test(select_cond->val_int());
 
    /* check for errors evaluating the condition */
    if (join->thd->is_error())
      return NESTED_LOOP_ERROR;
  }
……
    if (found)
    {
      enum enum_nested_loop_state rc;
      /* A match from join_tab is found for the current partial join. */
      rc= (*join_tab->next_select)(join, join_tab+1, 0);
      if (rc != NESTED_LOOP_OK  rc != NESTED_LOOP_NO_MORE_ROWS)
        return rc;
      if (join->return_tab  join_tab)
        return NESTED_LOOP_OK;
      /*
        Test if this was a SELECT DISTINCT query on a table that
        was not in the field list;  In this case we can abort if
        we found a row, as no new rows can be added to the result.
      */
      if (not_used_in_distinct  found_records != join->found_records)
        return NESTED_LOOP_NO_MORE_ROWS;
    }
……
}

這里可以看到,這個地方是一個遞歸,用來產(chǎn)生一個笛卡爾叉乘集合,從程序?qū)崿F(xiàn)和數(shù)學(xué)表達上看都非常簡潔可愛。
在MySQL的實現(xiàn)中,tsecer_select函數(shù)中的for循環(huán)大致相當sub_select中的while循環(huán),而tsecer_select函數(shù)中循環(huán)體內(nèi)的內(nèi)容被放在了evaluate_join_record函數(shù)中,其中的sofartest對應(yīng)evaluate_join_record::test(select_cond->val_int());tsecer_select中的nexttable.tsecer_select()語句對應(yīng)evaluate_join_record::(*join_tab->next_select)(join, join_tab+1, 0)。

四、join buffer的select實現(xiàn)

當使用join buffer cache時,next_select函數(shù)指向sub_select_cache

enum_nested_loop_state
sub_select_cache(JOIN *join,JOIN_TAB *join_tab,bool end_of_records)
{
  enum_nested_loop_state rc;
 
  if (end_of_records)
  {
    rc= flush_cached_records(join,join_tab,FALSE);
    if (rc == NESTED_LOOP_OK || rc == NESTED_LOOP_NO_MORE_ROWS)
      rc= sub_select(join,join_tab,end_of_records);
    return rc;
  }
  if (join->thd->killed) // If aborted by user
  {
    join->thd->send_kill_message();
    return NESTED_LOOP_KILLED;                   /* purecov: inspected */
  }
  if (join_tab->use_quick != 2 || test_if_quick_select(join_tab) = 0)
  {
    if (!store_record_in_cache(join_tab->cache))
      return NESTED_LOOP_OK;                     // There is more room in cache
    return flush_cached_records(join,join_tab,FALSE);
  }
  rc= flush_cached_records(join, join_tab, TRUE);
  if (rc == NESTED_LOOP_OK || rc == NESTED_LOOP_NO_MORE_ROWS)
    rc= sub_select(join, join_tab, end_of_records);
  return rc;
}

結(jié)合MySQL文檔中的說明,這里的代碼意義就比較明顯。開始對于end_of_records的判斷對應(yīng)的就是

    if (!store_record_in_cache(join_tab->cache))
      return NESTED_LOOP_OK;                     // There is more room in cache
    return flush_cached_records(join,join_tab,FALSE);

對應(yīng)

  - Store used fields from t1, t2 in cache
  - If cache is full

其中store_record_in_cache函數(shù)會判斷cache是否已滿,如果cache可以放入更多的緩存,則把之前table的組合記錄存儲在cache中,并返回NESTED_LOOP_OK。注意:這個地方可以說是整個cache優(yōu)化的關(guān)鍵,因為這里并沒有啟動對于table的掃描。反過來說,如果cache數(shù)據(jù)已經(jīng)滿了,則調(diào)用flush_cached_records函數(shù)來進行下面的流程

    - Read through all rows in t3
      - Compare t3 row against all t1, t2 combinations in cache
        - If row satisfies join condition, send it to client
    - Empty cache

這個流程的特殊之處在于遍歷的驅(qū)動是通過對于table的每一條記錄來和cache中所有t1、t2組合來進行比較,來判斷是否滿足下推where條件(If row satisfies join condition),則執(zhí)行join_tab->next_select函數(shù)(send it to client)。

static enum_nested_loop_state
flush_cached_records(JOIN *join,JOIN_TAB *join_tab,bool skip_last)
{
……
  info= join_tab->read_record;
  do
  {//遍歷t3表格所有記錄
……
        for (i=(join_tab->cache.records- (skip_last ? 1 : 0)) ; i-- > 0 ;)
        {//遍歷cache中所有t1、t2記錄組合
          read_cached_record(join_tab);
          skip_record= FALSE;
          if (select  select->skip_record(join->thd, skip_record))
          {//
            reset_cache_write(join_tab->cache);
            return NESTED_LOOP_ERROR;
          }
          if (!skip_record)
          {//滿足下推的where條件
//執(zhí)行下一個table的遍歷
            rc= (join_tab->next_select)(join,join_tab+1,0);
            if (rc != NESTED_LOOP_OK  rc != NESTED_LOOP_NO_MORE_ROWS)
            {
              reset_cache_write(join_tab->cache);
              return rc;
            }
          }
……
  } while (!(error=info->read_record(info)));

五、舉例來說明下這個流程

這個實現(xiàn)的核心思想并不復(fù)雜,結(jié)合具體的例子來看就更加的簡單直觀。
舉個例子,其中使用兩個簡單的table,其中分別存儲一個x,和y的值,我們希望通過一個join操作來計算這兩個表格中所有的滿足 x

x + y

y == 5 * 5,也就是我們最常見的"勾三股四弦五"這樣的經(jīng)典勾股數(shù)數(shù)值。

mysql> create table harry (x int);
Query OK, 0 rows affected (0.03 sec)
 
mysql> insert harry values (1),(2),(3),(4),(5);
Query OK, 5 rows affected (0.00 sec)
Records: 5  Duplicates: 0  Warnings: 0
 
mysql> create table tsecer (y int);                   
Query OK, 0 rows affected (0.01 sec)
 
mysql> insert tsecer values (1),(2),(3),(4),(5);     
Query OK, 5 rows affected (0.00 sec)
Records: 5  Duplicates: 0  Warnings: 0
 
mysql> explain select * from harry, tsecer where x * x + y * y = 5 * 5;
+----+-------------+--------+------+---------------+------+---------+------+------+--------------------------------+
| id | select_type | table  | type | possible_keys | key  | key_len | ref  | rows | Extra                          |
+----+-------------+--------+------+---------------+------+---------+------+------+--------------------------------+
|  1 | SIMPLE      | harry  | ALL  | NULL          | NULL | NULL    | NULL |    5 |                                |
|  1 | SIMPLE      | tsecer | ALL  | NULL          | NULL | NULL    | NULL |    5 | Using where; Using join buffer |
+----+-------------+--------+------+---------------+------+---------+------+------+--------------------------------+
2 rows in set (0.00 sec)
 
mysql>

1、不使用joinbuffer

在不使用join buffer的情況下,對于harry表的每個x值,對應(yīng)的tsecer表都要進行一次全表掃描,之后使用這個x和y的組合判斷是否滿足x

x + y

y == 5 * 5這條件。由于x總共有5個值,所以tsecer需要全表掃描的次數(shù)就是5次。

2、使用joinbuffer

對于x的每個值,tsecer表在執(zhí)行的時候先是把這個值緩存到j(luò)oinbuffer中,如果buffer緩沖內(nèi)容非空,那么把此時的x的值存儲在buffer中后直接返回;當join buffer滿或者是最后一條記錄的時候,此時開始啟動對于tsecer表的掃描,對于tsecer表中讀取的每一個記錄,結(jié)合前面緩存的每一個記錄,看是否滿足自己判斷條件。
對于我們看到的例子,這個地方harry表的5個值都在緩存中,在tsecer表的掃描過程中,對于從tsecer中讀取的每一條記錄,結(jié)合緩存中的“每一條”緩存,判斷這個組合結(jié)果是否滿足條件,如果任意一個組很滿足,那么就繼續(xù)next_select。
在這個使用buffer的例子中,可以看到這個地方只是對于tsecer表進行了一次掃描,而通常來說,數(shù)據(jù)庫的掃描代碼是最高的(因為要涉及到磁盤讀取),這樣使用buffer的方式將tsecer表的掃描降低為1次,所以這個效率提高很多,特別是在涉及到的多個table,并且/或者 每個table中的記錄數(shù)量都很多的情況下。

3、cache可以優(yōu)化的原因

本質(zhì)上說,這個效率提高的原因在于提高了從table中獲得的每條記錄的“利用率”,在使用直觀掃描方式時,table的全表掃描只是和一個組合進行匹配,而使用buffer之后則是和cache中的所有組合進行匹配。

以上就是MySQL的join buffer原理的詳細內(nèi)容,更多關(guān)于MySQL join buffer的資料請關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • 淺談mysql join底層原理
  • SQL語句中JOIN的用法場景分析
  • MYSQL數(shù)據(jù)庫基礎(chǔ)之Join操作原理
  • 解決Mysql的left join無效及使用的注意事項說明
  • mysql left join快速轉(zhuǎn)inner join的過程
  • 為什么代碼規(guī)范要求SQL語句不要過多的join
  • mysql高效查詢left join和group by(加索引)
  • SQL之各種join小結(jié)詳細講解

標簽:麗水 無錫 龍巖 自貢 徐州 西寧 迪慶 南充

巨人網(wǎng)絡(luò)通訊聲明:本文標題《MySQL的join buffer原理》,本文關(guān)鍵詞  MySQL,的,join,buffer,原理,MySQL,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《MySQL的join buffer原理》相關(guān)的同類信息!
  • 本頁收集關(guān)于MySQL的join buffer原理的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    91精品国产高清一区二区三区蜜臀| 日本三级日本三级日本三级极| 国产亚洲精品网站| 免费男女羞羞的视频网站中文子暮| 快射av在线播放一区| 四虎影成人精品a片| 992kp快乐看片永久免费网址| 久久久久久久爱| 亚洲欧美另类久久久精品| 免费 成 人 黄 色| 成人无号精品一区二区三区| 亚洲国产第一页| 欧美孕妇孕交| 国产精品久久久久久久久久精爆| 亚洲精品国产一区二| 欧美国产高跟鞋裸体秀xxxhd| 99热这里只有精品首页| xx欧美视频| 欧洲成人一区| 国内精品国产三级国产aⅴ久| 欧美午夜精品久久久久免费视| 在线观看免费的av| 麻豆免费在线观看| 99精品国产高清一区二区麻豆| 亚洲一区二区三区成人在线视频精品| 自拍偷拍亚洲在线| 中文字幕影片免费在线观看| 欧美在线xxxx| 欧美日韩亚洲一区二区三区在线| 亚洲图片欧美综合| 大又大又粗又硬又爽少妇毛片| 欧美日韩另类视频| 一区二区三区无码高清视频| 三级中文字幕在线观看| 性色a∨人人爽网站| 小草在线视频免费播放| 欧美日韩一区二区三区视频播放| 成人短片线上看| 欧美在线观看一区| 久久久久黄久久免费漫画| www.天堂在线| 亚洲国产精品久久久男人的天堂| 欧美日韩激情视频一区二区三区| 亚洲精品午夜在线观看| jizzjizz在线观看| 日韩亚洲欧美中文高清在线| 亚洲综合在线中文字幕| 亚洲嫩模很污视频| 日韩精品专区在线影院观看| 日韩成人影院| 久久久噜噜噜久久| 欧美高清无遮挡| 北条麻妃视频在线| 亚洲福利一二三区| 人成网站免费观看| 屁屁影院国产第一页| av大片在线免费观看| 亚洲在线激情| 日本五十路女优| 色在线视频免费| 国产一区二区三区精品久久久| 国产精品网站一区| 国产美女明星三级做爰| 国产免费拔擦拔擦8x高清在线人| 久久狠狠高潮亚洲精品| 永久久久免费浮力影院| 国产午夜精品理论片a级大结局| 亚洲成人精品一区| 日韩精品一区二区三区三区免费| 丰满人妻一区二区三区无码av| 欧美精品videofree1080p| 亚洲 欧美 成人| 日韩精品丝袜在线| 国产情侣自拍小视频| 91麻豆精品国产91久久久久久久久| 99在线热播| 国产精品原创巨作av| eeuss影院在线| 这里只有久久精品视频| 无码人妻一区二区三区在线视频| 精品久久久久久久中文字幕| 色老头在线视频| 真实乱视频国产免费观看| 一二三四在线视频观看社区| 激情一区二区三区| 亚洲天堂手机在线| 国产成人h网站| 亚洲大尺度在线观看| 亚洲东热激情| 成人亚洲精品| 在线免费观看日本欧美爱情大片| 欧美不卡高清一区二区三区| 户外露出精品视频国产| 亚洲一区二区三区视频在线| 日韩视频在线播放| 国产另类自拍| 久久影院一区| 天天操夜夜操国产精品| 国内外成人激情视频| 伊人婷婷欧美激情| 国产在线观看一区二区三区| 国产精品 日产精品 欧美精品| 国产精品18久久久久网站| 国产精品久久99| 成人自拍视频在线观看| 中文字幕第一页在线视频| 亚洲一区二区精品在线观看| 欧美精品与人动性物交免费看| www.污视频| 久草视频精品在线| 色啪免费观看视频| 农村妇女精品一二区| 欧美性大战xxxxx久久久| 亚洲欧美日韩精品久久| 一区二区三区av| 亚洲成人免费影院| 国产在线观看精品一区二区三区| 国产又大又黄又猛| 欧美一级性视频| 国产乡下妇女做爰| 2019精品视频| 国产一级二级三级| 国产欧美一区二区三区精品酒店| 青草在线视频在线观看| 午夜精品一区二区三区三上悠亚| 自拍视频在线播放| 亚洲三级在线免费| 婷婷夜色潮精品综合在线| 欧美成年网站| 精品网站aaa| 无码国产伦一区二区三区视频| 户外极限露出调教在线视频| 欧美videossex另类| 亚洲不卡系列| 六月婷婷在线视频| 亚洲欧美综合乱码精品成人网| 波多野结衣毛片| 青青草97国产精品免费观看无弹窗版| 亚洲国产精品18久久久久久| 亚洲美女性生活| 1313精品午夜理伦电影| 国产精欧美一区二区三区蓝颜男同| 你懂的在线视频| 日本久久亚洲电影| 久久久久久欧美| 久久蜜桃香蕉精品一区二区三区| 波多野结衣一区二区三区在线观看| 蜜桃av乱码一区二区三区| 亚洲国产日韩a在线播放| 最近中文字幕免费mv2018在线| 国产精品久久久久久久久影视| 免费在线观看你懂的| 天天摸天天碰天天添| 极品束缚调教一区二区网站| 久久蜜桃香蕉精品一区二区三区| 你懂的网址一区二区三区| 波多野结衣综合网| 天天摸天天干天天操| 欧美www在线观看| 男人的天堂在线| 亚洲aⅴ日韩av电影在线观看| 久久久人人人| 久久精品久久精品| 成人亚洲性情网站www在线观看| 嘿嘿视频在线观看| 91麻豆精品国产91久久综合| 最近2019中文免费高清视频观看www99| 在线视频综合导航| 在线尤物九色自拍| 国产日韩在线观看视频| 国产免费一区二区三区最新不卡| 精品人妻少妇AV无码专区| 日韩精品中文字幕在线不卡尤物| 一区 二区 三区| 中文字幕免费高清在线观看| 国产成人精品久久| 水蜜桃在线视频| 日韩欧美亚洲国产另类| 久久久国产一级片| 激情校园亚洲图片| 国产精品高潮在线| 91啪九色porn原创视频在线观看| 91精品国产视频| 在线午夜精品| 亚洲一区二区三区网站| 天堂中文字幕一二区| 美女久久久久久久久| 中文字幕a在线观看| 一区二区三区美女视频| 久久婷婷国产91天堂综合精品| 久草资源在线视频| 亚洲成年电人电影网站| 国产男女猛烈无遮挡免费视频| 91av国产在线| 色啦啦av综合| 懂色av粉嫩av蜜臀av一区二区三区| 男男成人高潮片免费网站| 免费大片黄在线| 中文字幕视频在线播放| 欧美激情护士| 天天干在线影院| 欧美激情精品久久久久久大尺度| 国内在线高清免费视频| 激情亚洲网站| 五月激情久久久| 久久久久久久激情视频| 日本少妇bbwbbw精品| 性色国产成人久久久精品| 男人的天堂在线视频免费观看| 黄色成人在线网| 综合在线一区| 91久久精品一区二区三区| 884aa四虎影成人精品一区| 亚洲影院在线播放| 日本中文字幕视频| 亚洲欧美天堂| 欧美另类老女人| 三级精品在线观看| 日韩美女一级视频| 日韩欧美亚洲一区| caoporen国产精品视频| 黄色大片免费观看| 国产欧美日韩三区| 在线看片日韩| 高潮毛片又色又爽免费| 精品国产乱码久久久久久蜜柚| 欧美性xxxx图片| 国产精品69毛片高清亚洲| 亚洲激情中文| 97久久超碰国产精品| 一级做a爰片性色毛片视频| 亚洲国产欧洲综合997久久| 先锋影音资源综合在线播放av| 色yeye香蕉凹凸一区二区av| 国产不卡123| 国产黄色高清在线| 日韩一级免费视频| 欧美大香线蕉线伊人久久| 日日日日人人人夜夜夜2017| 日韩在线网址| 久久男人天堂| 欧美一级视频| 青青草原网站在线观看| 亚洲第一区第一页| 成人午夜精品久久久久久久蜜臀| 日本激情视频在线| 欧美日韩激情美女| 免费观看成人鲁鲁鲁鲁鲁视频| 亚洲免费中文字幕| 宅男午夜电影| 亚洲一二三区精品| 久久众筹精品私拍模特| 亚洲成人免费电影| 亚洲综合色丁香婷婷六月图片| 日本欧美在线视频免费观看| 人妻少妇精品无码专区二区| 精品国产一区二区三区性色av| 国产精品毛片一区二区三区| 成人羞羞在线观看网站| 国产精品家庭影院| 久久久久高潮毛片免费全部播放| 青梅竹马是消防员在线| 天堂午夜在线| 色视频成人在线观看免| 91免费版在线看| 久久只精品国产| 欧美videosex性极品hd| 91sp网站在线观看入口| 日韩欧美电影一区| 99re6这里只有精品| 最好看的2019的中文字幕视频| 精品国产乱码久久久久久夜甘婷婷| 中文天堂在线一区| 国产一区二区麻豆| 51妺嘿嘿午夜福利| 久久久久无码精品国产sm果冻| 亚洲人成网站影音先锋播放| 国产精品视频| 亚洲激情视频在线观看| 欧美 国产 精品| 在线观看成人黄色| 亚洲高清在线| 高清孕妇孕交╳╳交| 亚洲精品一区二区三区婷婷月| 最好看的2019年中文视频| 亚洲国产成人高清精品| 久久精品夜夜夜夜久久| 久久久久久亚洲综合| 亚洲国产日韩欧美在线动漫| 亚洲AV无码一区二区三区性| 中文字幕av网址| 欧洲精品一区二区三区| 国产精一区二区| 91嫩草国产丨精品入口麻豆| 懂色av一区二区三区免费看| 91精品国产高清久久久久久91裸体| 亚洲欧美第一页| 亚洲综合精品久久| 欧美黄色a视频| 91精品一久久香蕉国产线看观看| 女人裸体性做爰全过| 本田岬高潮一区二区三区| 黄色片免费在线| 久久99深爱久久99精品| 欧美成人精品福利网站| 成人短视频在线看| 成人手机在线电影| 黄色资源在线看| 又黄又湿又爽又免费又色| 欧美三级欧美成人高清www| 精品亚洲aⅴ乱码一区二区三区| 日本少妇一区二区三区| 国内久久精品| 久久久久亚洲精品成人网小说| 天天免费亚洲黑人免费| 牛牛影视一区二区三区免费看| 欧美不卡一区二区三区| 91黄色在线看| 91国在线精品国内播放| avav免费在线观看| 日本免费久久高清视频| 日本高清免费在线视频| 国产精品福利电影| 亚洲的天堂在线中文字幕| 色佬视频在线观看| 黄色一级大片在线免费看国产一| 亚洲毛片网站| 成人羞羞视频免费看看|