国产99久久精品_欧美日本韩国一区二区_激情小说综合网_欧美一级二级视频_午夜av电影_日本久久精品视频

最新文章專題視頻專題問(wèn)答1問(wèn)答10問(wèn)答100問(wèn)答1000問(wèn)答2000關(guān)鍵字專題1關(guān)鍵字專題50關(guān)鍵字專題500關(guān)鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關(guān)鍵字專題關(guān)鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
問(wèn)答文章1 問(wèn)答文章501 問(wèn)答文章1001 問(wèn)答文章1501 問(wèn)答文章2001 問(wèn)答文章2501 問(wèn)答文章3001 問(wèn)答文章3501 問(wèn)答文章4001 問(wèn)答文章4501 問(wèn)答文章5001 問(wèn)答文章5501 問(wèn)答文章6001 問(wèn)答文章6501 問(wèn)答文章7001 問(wèn)答文章7501 問(wèn)答文章8001 問(wèn)答文章8501 問(wèn)答文章9001 問(wèn)答文章9501
當(dāng)前位置: 首頁(yè) - 科技 - 知識(shí)百科 - 正文

MySQL數(shù)據(jù)庫(kù)InnoDB存儲(chǔ)引擎多版本控制(MVCC)實(shí)現(xiàn)原理分析_MySQL

來(lái)源:懂視網(wǎng) 責(zé)編:小采 時(shí)間:2020-11-09 19:18:47
文檔

MySQL數(shù)據(jù)庫(kù)InnoDB存儲(chǔ)引擎多版本控制(MVCC)實(shí)現(xiàn)原理分析_MySQL

MySQL數(shù)據(jù)庫(kù)InnoDB存儲(chǔ)引擎多版本控制(MVCC)實(shí)現(xiàn)原理分析_MySQL:文/何登成導(dǎo)讀: 來(lái)自網(wǎng)易研究院的MySQL內(nèi)核技術(shù)研究人何登成,把MySQL數(shù)據(jù)庫(kù)InnoDB存儲(chǔ)引擎的多版本控制(簡(jiǎn)稱:MVCC)實(shí)現(xiàn)原理,做了深入的研究與詳細(xì)的文字圖表分析,方便大家理解InnoDB存儲(chǔ)引擎實(shí)現(xiàn)的多版本控制技術(shù)(簡(jiǎn)稱:MVCC)。基本知識(shí)假設(shè)對(duì)于
推薦度:
導(dǎo)讀MySQL數(shù)據(jù)庫(kù)InnoDB存儲(chǔ)引擎多版本控制(MVCC)實(shí)現(xiàn)原理分析_MySQL:文/何登成導(dǎo)讀: 來(lái)自網(wǎng)易研究院的MySQL內(nèi)核技術(shù)研究人何登成,把MySQL數(shù)據(jù)庫(kù)InnoDB存儲(chǔ)引擎的多版本控制(簡(jiǎn)稱:MVCC)實(shí)現(xiàn)原理,做了深入的研究與詳細(xì)的文字圖表分析,方便大家理解InnoDB存儲(chǔ)引擎實(shí)現(xiàn)的多版本控制技術(shù)(簡(jiǎn)稱:MVCC)。基本知識(shí)假設(shè)對(duì)于
文/何登成

導(dǎo)讀:

來(lái)自網(wǎng)易研究院的MySQL內(nèi)核技術(shù)研究人何登成,把MySQL數(shù)據(jù)庫(kù)InnoDB存儲(chǔ)引擎的多版本控制(簡(jiǎn)稱:MVCC)實(shí)現(xiàn)原理,做了深入的研究與詳細(xì)的文字圖表分析,方便大家理解InnoDB存儲(chǔ)引擎實(shí)現(xiàn)的多版本控制技術(shù)(簡(jiǎn)稱:MVCC)。

基本知識(shí)

假設(shè)對(duì)于多版本控制(MVCC)的基礎(chǔ)知識(shí),有所了解。MySQL數(shù)據(jù)庫(kù)InnoDB存儲(chǔ)引擎為了實(shí)現(xiàn)多版本的一致性讀,采用的是基于回滾段的協(xié)議。

行結(jié)構(gòu)

MySQL數(shù)據(jù)庫(kù)InnoDB存儲(chǔ)引擎表數(shù)據(jù)的組織方式為主鍵聚簇索引。由于采用索引組織表結(jié)構(gòu),記錄的ROWID是可變的(索引頁(yè)的時(shí)候,Structure Modification Operation,SMO),因此二級(jí)索引中采用的是(索引鍵值, 主鍵鍵值)的組合來(lái)唯一確定一條記錄。

無(wú)論是聚簇索引,還是二級(jí)索引,其每條記錄都包含了一個(gè)DELETED BIT位,用于標(biāo)識(shí)該記錄是否是刪除記錄。除此之外,聚簇索引記錄還有兩個(gè)系統(tǒng)列:DATA_TRX_ID,DATA_ROLL_PTR。DATA _TRX_ID表示產(chǎn)生當(dāng)前記錄項(xiàng)的事務(wù)ID;DATA _ROLL_PTR指向當(dāng)前記錄項(xiàng)的undo信息。

聚簇索引行結(jié)構(gòu)(與多版本一致讀有關(guān)的部分,DELETED BIT省略):

innodb-mvcc-1

二級(jí)索引行結(jié)構(gòu):

innodb-mvcc-2

從聚簇索引行結(jié)構(gòu),與二級(jí)索引行結(jié)構(gòu)可以看出,聚簇索引中包含版本信息(事務(wù)號(hào)+回滾指針),二級(jí)索引不包含版本信息,二級(jí)索引項(xiàng)的可見(jiàn)性如何判斷?下面將會(huì)給出。

Read View

InnoDB存儲(chǔ)引擎默認(rèn)的隔離級(jí)別為Repeatable Read (RR),可重復(fù)讀。InnoDB存儲(chǔ)引擎在開(kāi)始一個(gè)RR讀之前,會(huì)創(chuàng)建一個(gè)Read View。Read View用于判斷一條記錄的可見(jiàn)性。Read View定義在read0read.h文件中,其中最主要的與可見(jiàn)性相關(guān)的屬性如下:

?
1234567101112131415161718192021

dulintlow_limit_id;/* 事務(wù)號(hào) >= low_limit_id的記錄,對(duì)于當(dāng)前Read View都是不可見(jiàn)的 */

dulintup_limit_id;/* 事務(wù)號(hào) < up_limit_id ,對(duì)于當(dāng)前Read View都是可見(jiàn)的 */

ulintn_trx_ids;/* Number of cells in the trx_ids array */

dulint*trx_ids;/* Additional trx ids which the read should

not see: typically, these are the active

transactions at the time when the read is

serialized, except the reading transaction

itself; the trx ids in this array are in a

descending order */

dulintcreator_trx_id;/* trx id of creating transaction, or

(0, 0) used in purge */

簡(jiǎn)單來(lái)說(shuō),Read View記錄讀開(kāi)始時(shí),所有的活動(dòng)事務(wù),這些事務(wù)所做的修改對(duì)于Read View是不可見(jiàn)的。除此之外,所有其他的小于創(chuàng)建Read View的事務(wù)號(hào)的所有記錄均可見(jiàn)。可見(jiàn)包括兩層含義:

  • 記錄可見(jiàn),且Deleted bit = 0;當(dāng)前記錄是可見(jiàn)的有效記錄。
  • 記錄可見(jiàn),且Deleted bit = 1;當(dāng)前記錄是可見(jiàn)的刪除記錄。此記錄在本事務(wù)開(kāi)始之前,已經(jīng)刪除。
  • 測(cè)試方法:

    ?
    123456710111213141516

    -create table and index

    create table test (id int primary key, comment char(50)) engine=InnoDB;

    create index test_idx on test(comment);

    -Insert

    insert into test values(1, ‘a(chǎn)aa’);

    insert into test values(2, ‘bbb’);

    -update primary key

    update test set id = 9 where id = 1;

    -update non-primary key with different value

    update test set comment = ‘ccc’ where id = 9;

    -update non-primary key with same value

    update test set comment = ‘bbb’ where id = 2 and comment = ‘bbb’;

    -read隔離級(jí)別

    repeatable read(RR)

    測(cè)試結(jié)果

    update primary key

    代碼調(diào)用流程:

    ?
    1ha_innobase::update_row -> row_update_for_mysql -> row_upd_step -> row_upd -> row_upd_clust_step -> row_upd_clust_rec_by_insert -> btr_cur_del_mark_set_clust_rec -> row_ins_index_entry

    簡(jiǎn)單來(lái)說(shuō),就是將cluster index的舊記錄標(biāo)記位刪除;插入一條新紀(jì)錄。該語(yǔ)句執(zhí)行完之后,數(shù)據(jù)結(jié)構(gòu)如下:

    innodb-mvcc-3-300x248

    老版本仍舊存儲(chǔ)在聚簇索引之中,其DATA_TRX_ID被設(shè)置為1811,Deleted bit設(shè)置為1,undo中記錄了前鏡像的事務(wù)id = 1809。新版本DATA_TRX_ID也為1811。通過(guò)此圖,還可以發(fā)現(xiàn),雖然新老版本是一條記錄,但是在聚簇索引中是通過(guò)兩條記錄來(lái)標(biāo)識(shí)的。同時(shí), 由于更新了主鍵,二級(jí)索引也需要做相應(yīng)的更新(二級(jí)索引中包含主鍵項(xiàng))。

    update non-primary key(diff value)

    更新comment字段,代碼調(diào)用流程與上面有部分不同,可以自行跟蹤,此處省略。更新操作執(zhí)行完之后,索引結(jié)構(gòu)變更如下:

    innodb-mvcc-4-300x213

    從上圖可見(jiàn),更新二級(jí)索引的鍵值時(shí),聚簇索引本身并不會(huì)產(chǎn)生新的記錄項(xiàng),而是將舊版本信息記錄在undo之中。與此同時(shí),二級(jí)索引將會(huì)產(chǎn)生 新的索引項(xiàng),其PK值保持不變,指向聚簇索引的同一條記錄。細(xì)心的讀者可能會(huì)發(fā)現(xiàn),二級(jí)索引頁(yè)面中有一個(gè)MAX_TRX_ID,此值記錄的是更新二級(jí)索引 頁(yè)面的最大事務(wù)ID。通過(guò)MAX_TRX_ID的過(guò)濾,INNODB能夠?qū)崿F(xiàn)大部分的輔助索引覆蓋性掃描(僅僅掃描輔助索引,不需要回聚簇索引)。具體過(guò) 濾方法,將在后面的內(nèi)容中給出。

    update non-primary key(same value)

    最后一個(gè)測(cè)試用例,是更新comment項(xiàng)為同樣的值。在我的測(cè)試中,更新之后的索引結(jié)構(gòu)如下:

    innodb-mvcc-5-300x220

    聚簇索引仍舊會(huì)更新,但是二級(jí)索引保持不變。

    總結(jié)

    1. 無(wú)論是聚簇索引,還是二級(jí)索引,只要其鍵值更新,就會(huì)產(chǎn)生新版本。將老版本數(shù)據(jù)deleted bti設(shè)置為1;同時(shí)插入新版本。
    2. 對(duì)于聚簇索引,如果更新操作沒(méi)有更新primary key,那么更新不會(huì)產(chǎn)生新版本,而是在原有版本上進(jìn)行更新,老版本進(jìn)入undo表空間,通過(guò)記錄上的undo指針進(jìn)行回滾。
    3. 對(duì)于二級(jí)索引,如果更新操作沒(méi)有更新其鍵值,那么二級(jí)索引記錄保持不變。
    4. 對(duì)于二級(jí)索引,更新操作無(wú)論更新primary key,或者是二級(jí)索引鍵值,都會(huì)導(dǎo)致二級(jí)索引產(chǎn)生新版本數(shù)據(jù)。
    5. 聚簇索引設(shè)置記錄deleted bit時(shí),會(huì)同時(shí)更新DATA_TRX_ID列。老版本DATA_TRX_ID進(jìn)入undo表空間;二級(jí)索引設(shè)置deleted bit時(shí),不寫入undo。

    可見(jiàn)性判斷

    主鍵查找

    select * from test where id = 1;

  • 針對(duì)測(cè)試1,如果1811(DATA_TRX_ID) < read_view.up_limit_id,證明被標(biāo)記為刪除的記錄1可見(jiàn)。刪除可見(jiàn) -> 無(wú)記錄返回。
  • 針對(duì)測(cè)試1,如果 1811(DATA_TRX_ID) >= read_view.low_limit_id,證明被標(biāo)記為刪除的記錄1不可見(jiàn),通過(guò)DATA_ROLL_PTR回滾記錄,得到DATA_TRX_ID = 1809。如果1809可見(jiàn),則返回記錄(1,aaa);否則無(wú)記錄返回。
  • 針對(duì)測(cè)試1,如果up_limit_id,low_limit_id都無(wú)法判斷可見(jiàn)性,那么遍歷read_view中的trx_ids,依次對(duì)比事務(wù)id,如果在DATA_TRX_ID在trx_ids數(shù)組中,則不可見(jiàn)(更新未提交)。

  • select * from test where id = 9;

  • 針對(duì)測(cè)試2,如果1816可見(jiàn),返回(9,ccc)。
  • 針對(duì)測(cè)試2,如果1816不可見(jiàn),通過(guò)DATA_ROLL_PTR回滾到1811,如果1811可見(jiàn),返回(9, aaa)。
  • 針對(duì)測(cè)試2,如果1811不可見(jiàn),無(wú)結(jié)果返回。

  • select * from test where id > 0;

  • 針對(duì)測(cè)試1,索引中, 滿足條件的同一記錄,有兩個(gè)版本(版本1,delete bit =1)。那么是否會(huì)一條記錄返回兩次呢?必定不會(huì),這是因?yàn)閜k = 1的可見(jiàn)性與pk = 9的可見(jiàn)性是一致的,同時(shí)pk = 1是標(biāo)記了deleted bit的版本。如果事務(wù)ID = 1811可見(jiàn)。那么pk = 1 delete可見(jiàn),無(wú)記錄返回,pk = 9返回記錄;如果1811不可見(jiàn),回滾到1809可見(jiàn),那么pk = 1返回記錄,pk = 9回滾后無(wú)記錄。
  • 總結(jié):

    1. 通過(guò)主鍵查找記錄,需要配合read_view,記錄DATA_TRX_ID,記錄DATA_ROLL_PTR指針共同判斷。
    2. read_view用于判斷當(dāng)前記錄是否可見(jiàn)(判斷DATA_TRX_ID)。DATA_ROLL_PTR用于將當(dāng)前記錄回滾到前一版本。

    非主鍵查找

    select comment from test where comment > ‘ ‘;

  • 針對(duì)測(cè)試2,二級(jí)索 引,當(dāng)前頁(yè)面的最大更新事務(wù)MAX_TRX_ID = 1816。如果MAX_TRX_ID < read_view.up_limit_id,當(dāng)前頁(yè)面所有數(shù)據(jù)均可見(jiàn),本頁(yè)面可以進(jìn)行索引覆蓋性掃描。丟棄所有deleted bit = 1的記錄,返回deleted bit = 0 的記錄;此時(shí)返回 (ccc)。(row_select_for_mysql -> lock_sec_rec_cons_read_sees)
  • 針對(duì)測(cè)試2,二級(jí)索 引,如果當(dāng)前頁(yè)面不能滿足MAX_TRX_ID < read_view.up_limit_id,說(shuō)明當(dāng)前頁(yè)面無(wú)法進(jìn)行索引覆蓋性掃描,此時(shí)需要針對(duì)每一項(xiàng),到聚簇索引中判斷可見(jiàn)性。回到測(cè)試2,二級(jí)索引 中有兩項(xiàng)pk = 9 (一項(xiàng)deleted bit = 1,另一個(gè)為0),對(duì)應(yīng)的聚簇索引中只有一項(xiàng)pk= 9。如何保證通過(guò)二級(jí)索引過(guò)來(lái)的同一記錄的多個(gè)版本,在聚簇索引中最多只能被返回一次?如果當(dāng)前事務(wù)id 1811可見(jiàn)。二級(jí)索引pk = 9的記錄(兩項(xiàng)),通過(guò)聚簇索引的undo,都定位到了同一記錄項(xiàng)。此時(shí),InnoDB通過(guò)以下的一個(gè)表達(dá)式,來(lái)保證來(lái)自二級(jí)索引,指向同一聚簇索引記錄 的多個(gè)版本項(xiàng),有且最多僅有一個(gè)版本將會(huì)返回?cái)?shù)據(jù):

    ?
    1234567if (clust_rec

    && (old_vers || rec_get_deleted_flag(

    rec,dict_table_is_comp(sec_index->table)))&& !row_sel_sec_rec_is_for_clust_rec(rec, sec_index, clust_rec, clust_index))
  • 滿足if判斷的所有聚簇索引記錄,都直接丟棄,以上判斷的邏輯如下:

    1. 需要回聚簇索引掃描,并且獲得記錄
    2. 聚簇索引記錄為回滾版本,或者二級(jí)索引中的記錄為刪除版本
    3. 聚簇索引項(xiàng),與二級(jí)索引項(xiàng),其鍵值并不相等

    為什么滿足if判斷,就可以直接丟棄數(shù)據(jù)?用白話來(lái)說(shuō),就是我們通過(guò)二級(jí)索引記錄,定位聚簇索引記錄,定位之后,還需要再次檢查聚簇索引記錄是否仍舊是我在二級(jí)索引中看到的記錄。如果不是,則直接丟棄;如果是,則返回。

    根據(jù)此條件,結(jié)合查詢與測(cè)試2中的索引結(jié)構(gòu)。可見(jiàn)版本為事務(wù)1811.二級(jí)索引中的兩項(xiàng)pk = 9都能通過(guò)聚簇索引回滾到1811版本。但是,二級(jí)索引記錄(ccc,9)與聚簇索引回滾后的版本(aaa,9)不一致,直接丟棄。只有二級(jí)索引記錄 (aaa,9)保持一致,直接返回。

    總結(jié):

    1. 二級(jí)索引的多版本可見(jiàn)性判斷,需要通過(guò)聚簇索引完成。
    2. 二級(jí)索引頁(yè)面中保存了MAX_TRX_ID,可以快速判斷當(dāng)前頁(yè)面中,是否所有項(xiàng)均可見(jiàn),可以實(shí)現(xiàn)二級(jí)索引頁(yè)面級(jí)別的索引覆蓋掃描。一般而言,此判斷是滿足條件的,保證了索引覆蓋掃描 (index only scan)的高效性。
    3. 二級(jí)索引中的項(xiàng),需要與聚簇索引中的可見(jiàn)性進(jìn)行比較,保證聚簇索引中的可見(jiàn)項(xiàng),與二級(jí)索引中的項(xiàng)數(shù)據(jù)一致。

    疑問(wèn)

    1. 在http://blogs.InnoDB.com/wp/2011/04/mysql-5-6-multi-threaded-purge/中, 作者提到,InnoDB存儲(chǔ)引擎的purge操作,是通過(guò)遍歷undo來(lái)實(shí)現(xiàn)對(duì)于標(biāo)記位deleted項(xiàng)的回收的。如果二級(jí)索引本身標(biāo)記deleted位不記錄 undo,那么這個(gè)回收操作如何完成?還是說(shuō)purge是通過(guò)解析redo來(lái)完成回收的?(根據(jù)下面對(duì)于purge的流程分析,此問(wèn)題已解決)

    Purge流程

    Purge功能:

    InnoDB由于要支持多版本協(xié)議,因此無(wú)論是更新,刪除,都只是設(shè)置記錄上的deleted bit標(biāo)記位,而不是真正的刪除記錄。后續(xù)這些記錄的真正刪除,是通過(guò)Purge后臺(tái)進(jìn)程實(shí)現(xiàn)的。Purge進(jìn)程定期掃描InnoDB的undo,按照先 讀老undo,再讀新undo的順序,讀取每條undo record。對(duì)于每一條undo record,判斷其對(duì)應(yīng)的記錄是否可以被purge(purge進(jìn)程有自己的read view,等同于進(jìn)程開(kāi)始時(shí)最老的活動(dòng)事務(wù)之前的view,保證purge的數(shù)據(jù),一定是不可見(jiàn)數(shù)據(jù),對(duì)任何人來(lái)說(shuō)),如果可以purge,則構(gòu)造完整記 錄(row_purge_parse_undo_rec)。然后按照先purge二級(jí)索引,最后purge聚簇索引的順序,purge一個(gè)操作生成的舊版本完整記錄。

    一個(gè)完整的purge函數(shù)調(diào)用流程如下:

    ?
    123row_purge_step->row_purge->trx_purge_fetch_next_rec->row_purge_parse_undo_rec->row_purge_del_mark->row_purge_remove_sec_if_poss->row_purge_remove_clust_if_poss

    總結(jié):

    1. purge是通過(guò)遍歷undo實(shí)現(xiàn)的。
    2. purge的粒度是一條記錄上的一個(gè)操作。如果一條記錄被update了3次,產(chǎn)生3個(gè)old版本,均可purge。那么purge讀取undo,對(duì)于每一個(gè)操作,都會(huì)調(diào)用一次purge。一個(gè)purge刪除一個(gè)操作產(chǎn)生的old版本(按照操作從老到新的順序)。
    3. purge按照先二級(jí)索引,最后聚簇索引的順序進(jìn)行。
    4. purge二級(jí)索引,通過(guò)構(gòu)造出的索引項(xiàng)進(jìn)行查找定位。不能直接針對(duì)某個(gè)二級(jí)頁(yè)面進(jìn)行,因?yàn)椴恢烙涗浀拇娣舙age。
    5. 對(duì)于二級(jí)索引設(shè)置deleted bit為不需要記錄undo,因?yàn)閜urge是根據(jù)聚簇索引undo實(shí)現(xiàn)。因此二級(jí)索引deleted bit被設(shè)置為1的項(xiàng),沒(méi)有記錄undo,仍舊可以被purge。
    6. purge是一個(gè)耗時(shí)的操作。二級(jí)索引的purge,需要search_path定位數(shù)據(jù),相當(dāng)于每個(gè)二級(jí)索引,都做了一次index unique scan。
    7. 一次delete操作,IO翻番。第一次IO是將記錄的deleted bit設(shè)置為1;第二次的IO是將記錄刪除。

    文章具體來(lái)源不詳,如有知情者,請(qǐng)?jiān)谠u(píng)論中回復(fù)。

    聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

    文檔

    MySQL數(shù)據(jù)庫(kù)InnoDB存儲(chǔ)引擎多版本控制(MVCC)實(shí)現(xiàn)原理分析_MySQL

    MySQL數(shù)據(jù)庫(kù)InnoDB存儲(chǔ)引擎多版本控制(MVCC)實(shí)現(xiàn)原理分析_MySQL:文/何登成導(dǎo)讀: 來(lái)自網(wǎng)易研究院的MySQL內(nèi)核技術(shù)研究人何登成,把MySQL數(shù)據(jù)庫(kù)InnoDB存儲(chǔ)引擎的多版本控制(簡(jiǎn)稱:MVCC)實(shí)現(xiàn)原理,做了深入的研究與詳細(xì)的文字圖表分析,方便大家理解InnoDB存儲(chǔ)引擎實(shí)現(xiàn)的多版本控制技術(shù)(簡(jiǎn)稱:MVCC)。基本知識(shí)假設(shè)對(duì)于
    推薦度:
    • 熱門焦點(diǎn)

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top 主站蜘蛛池模板: 日韩a无v码在线播放免费 | 久久国产精品成人免费古装 | 香蕉国产精品 | 国产亚洲欧美另类一区二区三区 | 国产亚洲一区二区三区不卡 | 欧美成人免费高清视频 | 一区在线看 | 一区二区视频在线观看高清视频在线 | 一本综合久久国产二区 | 国产一区导航 | 欧美国产精品一区二区免费 | 欧美网址在线观看 | 亚洲 自拍 另类 欧美 综合 | 国产精自产拍久久久久久 | 国产网站视频 | 日产精品久久久一区二区 | 一区二区三区在线视频播放 | 一区二区三区网站 | 伊人久久成人成综合网222 | 精品国产一级在线观看 | 色综合天天综合中文网 | 91视频免费看 | 欧美骚 | 亚洲色图欧美另类 | 亚洲日韩精品欧美一区二区 | 欧美另类在线观看 | 日韩综合| 国产亚洲一区二区精品 | 中文字幕美日韩在线高清 | 国产精品久久久久久一级毛片 | 欧美国产第一页 | 日韩专区亚洲综合久久 | 亚洲欧美日本另类激情 | 第一页欧美| 亚洲精品在线免费观看 | 北条麻妃一区 | 国产日韩欧美一区二区三区视频 | 91精品国产色综合久久不卡蜜 | 国产一区在线看 | 欧美 国产 日韩 第一页 | 午夜欧美性视频在线播放 |