在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Mysql索引為什么使用B+樹(shù)?

dyquk4xk2p3d ? 來(lái)源:良許Linu ? 2023-06-08 16:34 ? 次閱讀

		

		


		


		

		


		

		

		

		

		

		

在我們的印象中,mysql數(shù)據(jù)表里無(wú)非就是存儲(chǔ)一行行的數(shù)據(jù)。跟個(gè)excel似的。

直接遍歷這一行行數(shù)據(jù),性能就是O(n),比較慢。為了加速查詢,使用了B+樹(shù)來(lái)做索引,將查詢性能優(yōu)化到了O(lg(n))

但問(wèn)題就來(lái)了,查詢數(shù)據(jù)性能在 lg(n) 級(jí)別的數(shù)據(jù)結(jié)構(gòu)有很多,比如redis的zset里用到的跳表,也是lg(n),并且實(shí)現(xiàn)還賊簡(jiǎn)單。

那為什么mysql的索引,不使用跳表呢?

我們今天就來(lái)聊聊這個(gè)話題。

B+樹(shù)的結(jié)構(gòu)

在這里,為了混點(diǎn)字?jǐn)?shù),我簡(jiǎn)單總結(jié)下B+樹(shù)的結(jié)構(gòu)。

d631e2a8-05d6-11ee-962d-dac502259ad0.pngB+樹(shù)查詢過(guò)程

如上圖,一般B+樹(shù)是由多個(gè)頁(yè)組成的多層級(jí)結(jié)構(gòu),每個(gè)頁(yè)16Kb,對(duì)于主鍵索引來(lái)說(shuō),最末級(jí)的葉子結(jié)點(diǎn)放行數(shù)據(jù),非葉子結(jié)點(diǎn)放的則是索引信息(主鍵id和頁(yè)號(hào)),用于加速查詢。

比方說(shuō)我們想要查找行數(shù)據(jù)5。會(huì)先從頂層頁(yè)的record們?nèi)胧帧?strong style="font-size:inherit;line-height:inherit;color:rgb(41,98,255);">record里包含了主鍵id和頁(yè)號(hào)(頁(yè)地址)。關(guān)注黃色的箭頭,向左最小id是1,向右最小id是7。那id=5的數(shù)據(jù)如果存在,那必定在左邊箭頭。于是順著的record的頁(yè)地址就到了6號(hào)數(shù)據(jù)頁(yè)里,再判斷id=5>4,所以肯定在右邊的數(shù)據(jù)頁(yè)里,于是加載105號(hào)數(shù)據(jù)頁(yè)。

105號(hào)數(shù)據(jù)頁(yè)里,雖然有多行數(shù)據(jù),但也不是挨個(gè)遍歷的,數(shù)據(jù)頁(yè)內(nèi)還有個(gè)頁(yè)目錄的信息,它可以通過(guò)二分查找的方式加速查詢行數(shù)據(jù),于是找到id=5的數(shù)據(jù)行,完成查詢。

從上面可以看出,B+樹(shù)利用了空間換時(shí)間的方式(構(gòu)造了一批非葉子結(jié)點(diǎn)用于存放索引信息),將查詢時(shí)間復(fù)雜度從O(n)優(yōu)化為O(lg(n))

跳表的結(jié)構(gòu)

看完B+樹(shù),我們?cè)賮?lái)看下跳表是怎么來(lái)的。

同樣的,還是為了存儲(chǔ)一行行的數(shù)據(jù)。

我們可以將它們用鏈表串起來(lái)。

d6591fe4-05d6-11ee-962d-dac502259ad0.png單鏈表

想要查詢鏈表中的其中一個(gè)結(jié)點(diǎn),時(shí)間復(fù)雜度是O(n),這誰(shuí)頂?shù)米。谑菍?strong style="font-size:inherit;line-height:inherit;color:rgb(41,98,255);">部分鏈表結(jié)點(diǎn)提出來(lái),再構(gòu)建出一個(gè)新的鏈表。

d6609a8a-05d6-11ee-962d-dac502259ad0.png兩層跳表

這樣當(dāng)我想要查詢一個(gè)數(shù)據(jù)的時(shí)候,我先查上層的鏈表,就很容易知道數(shù)據(jù)落在哪個(gè)范圍,然后跳到下一個(gè)層級(jí)里進(jìn)行查詢。這樣就把搜索范圍一下子縮小了一大半。

比如查詢id=10的數(shù)據(jù),我們先在上層遍歷,依次判斷1,6,12,很快就可以判斷出10在6到12之間,然后往下一跳,就可以在遍歷6,7,8,9,10之后,確定id=10的位置。直接將查詢范圍從原來(lái)的1到10,變成現(xiàn)在的1,6,7,8,9,10,算是砍半了。

d67fc1da-05d6-11ee-962d-dac502259ad0.png兩層跳表查找id為10的數(shù)據(jù)

既然兩層鏈表就直接將查詢范圍砍半了,那我多加幾層,豈不妙哉?

于是跳表就這樣變成了多層。

d69d5f10-05d6-11ee-962d-dac502259ad0.png三層跳表

如果還是查詢id=10的數(shù)據(jù),就只需要查詢1,6,9,10就能找到,比兩層的時(shí)候更快一些。

d6b84af0-05d6-11ee-962d-dac502259ad0.png三層跳表查詢id為10的數(shù)據(jù)

可以看出,跳表也是通過(guò)犧牲空間換取時(shí)間的方式提升查詢性能。時(shí)間復(fù)雜度都是lg(n)

B+樹(shù)和跳表的區(qū)別

從上面可以看到,B+樹(shù)和跳表的最下面一層,都包含了所有的數(shù)據(jù),且都是順序的,適合用于范圍查詢。往上的層級(jí)都是構(gòu)建出來(lái)用于提升搜索性能的。這兩者實(shí)在是太像了。但他們兩者在新增和刪除數(shù)據(jù)時(shí),還是有些區(qū)別的。下面我們以新增數(shù)據(jù)為例聊一下。

B+樹(shù)新增數(shù)據(jù)會(huì)怎么樣

B+樹(shù)本質(zhì)上是一種多叉平衡二叉樹(shù)。關(guān)鍵在于"平衡"這兩個(gè)字,對(duì)于多叉樹(shù)結(jié)構(gòu)來(lái)說(shuō),它的含義是子樹(shù)們的高度層級(jí)盡量一致(一般最多差一個(gè)層級(jí)),這樣在搜索的時(shí)候,不管是到哪個(gè)子樹(shù)分支,搜索次數(shù)都差不了太多。

當(dāng)數(shù)據(jù)庫(kù)表不斷插入新的數(shù)據(jù)時(shí),為了維持B+樹(shù)的平衡,B+樹(shù)會(huì)不斷分裂調(diào)整數(shù)據(jù)頁(yè)。

我們知道B+樹(shù)分為葉子結(jié)點(diǎn)和非葉子結(jié)點(diǎn)

當(dāng)插入一條數(shù)據(jù)時(shí),葉子結(jié)點(diǎn)和它上層的索引結(jié)點(diǎn)(非葉子結(jié)點(diǎn))最大容量都是16k,它們都有可能會(huì)滿。

為了簡(jiǎn)化問(wèn)題,我們假設(shè)一個(gè)數(shù)據(jù)頁(yè)只能放三條行數(shù)據(jù)或索引。

加入一條數(shù)據(jù),根據(jù)數(shù)據(jù)頁(yè)會(huì)不會(huì)滿,分為三種情況。

  • 葉子結(jié)點(diǎn)和索引結(jié)點(diǎn)都沒(méi)滿。這種情況最簡(jiǎn)單,直接插入到葉子結(jié)點(diǎn)中就好了。

d6c62774-05d6-11ee-962d-dac502259ad0.png葉子和非葉子都未滿
  • 葉子結(jié)點(diǎn)滿了,但索引結(jié)點(diǎn)沒(méi)滿。此時(shí)需要拆分葉子結(jié)點(diǎn),同時(shí)索引結(jié)點(diǎn)要增加新的索引信息。

d6dc9d56-05d6-11ee-962d-dac502259ad0.png葉子滿了但非葉子未滿.drawio
  • 葉子結(jié)點(diǎn)滿了,且索引結(jié)點(diǎn)也滿了。葉子和索引結(jié)點(diǎn)都要拆分,同時(shí)往上還要再加一層索引。

d6f9eb7c-05d6-11ee-962d-dac502259ad0.png葉子和非葉子都滿了

從上面可以看到,只有在葉子和索引結(jié)點(diǎn)都滿了的情況下,B+樹(shù)才會(huì)考慮加入一層新的結(jié)點(diǎn)。

要把三層B+樹(shù)塞滿,那大概需要2kw左右的數(shù)據(jù)。

跳表新增數(shù)據(jù)

跳表同樣也是很多層,新增一個(gè)數(shù)據(jù)時(shí),最底層的鏈表需要插入數(shù)據(jù)。

此時(shí),是否需要在上面的幾層中加入數(shù)據(jù)做索引呢?

這個(gè)就純靠隨機(jī)函數(shù)了。

理論上為了達(dá)到二分的效果,每一層的結(jié)點(diǎn)數(shù)需要是下一層結(jié)點(diǎn)數(shù)的二分之一。

也就是說(shuō)現(xiàn)在有一個(gè)新的數(shù)據(jù)插入了,它有50%的概率需要在第二層加入索引,有25%的概率需要在第三層加個(gè)索引,以此類推,直到最頂層

舉個(gè)例子,如果跳表中插入數(shù)據(jù)id=6,且隨機(jī)函數(shù)返回第三層(有25%的概率),那就需要在跳表的最底層到第三層都插入數(shù)據(jù)。

d717f810-05d6-11ee-962d-dac502259ad0.png跳表插入數(shù)據(jù)

如果這個(gè)隨機(jī)函數(shù)設(shè)計(jì)成上面這樣,當(dāng)數(shù)據(jù)量樣本足夠大的時(shí)候,數(shù)據(jù)的分布就符合我們理想中的"二分"。

跟上面B+樹(shù)不一樣,跳表是否新增層數(shù),純粹靠隨機(jī)函數(shù),根本不關(guān)心前后上下結(jié)點(diǎn)。

好了,基礎(chǔ)科普也結(jié)束了,我們可以進(jìn)入正題了。

Mysql的索引為什么使用B+樹(shù)而不使用跳表?

B+樹(shù)是多叉樹(shù)結(jié)構(gòu),每個(gè)結(jié)點(diǎn)都是一個(gè)16k的數(shù)據(jù)頁(yè),能存放較多索引信息,所以扇出很高三層左右就可以存儲(chǔ)2kw左右的數(shù)據(jù)(知道結(jié)論就行,想知道原因可以看之前的文章)。也就是說(shuō)查詢一次數(shù)據(jù),如果這些數(shù)據(jù)頁(yè)都在磁盤(pán)里,那么最多需要查詢三次磁盤(pán)IO

跳表是鏈表結(jié)構(gòu),一條數(shù)據(jù)一個(gè)結(jié)點(diǎn),如果最底層要存放2kw數(shù)據(jù),且每次查詢都要能達(dá)到二分查找的效果,2kw大概在2的24次方左右,所以,跳表大概高度在24層左右。最壞情況下,這24層數(shù)據(jù)會(huì)分散在不同的數(shù)據(jù)頁(yè)里,也即是查一次數(shù)據(jù)會(huì)經(jīng)歷24次磁盤(pán)IO

因此存放同樣量級(jí)的數(shù)據(jù),B+樹(shù)的高度比跳表的要少,如果放在mysql數(shù)據(jù)庫(kù)上來(lái)說(shuō),就是磁盤(pán)IO次數(shù)更少,因此B+樹(shù)查詢更快

而針對(duì)寫(xiě)操作,B+樹(shù)需要拆分合并索引數(shù)據(jù)頁(yè),跳表則獨(dú)立插入,并根據(jù)隨機(jī)函數(shù)確定層數(shù),沒(méi)有旋轉(zhuǎn)和維持平衡的開(kāi)銷(xiāo),因此跳表的寫(xiě)入性能會(huì)比B+樹(shù)要好。

其實(shí),mysql的存儲(chǔ)引擎是可以換的,以前是myisam,后來(lái)才有的innodb,它們底層索引用的都是B+樹(shù)。也就是說(shuō),你完全可以造一個(gè)索引為跳表的存儲(chǔ)引擎裝到mysql里。事實(shí)上,facebook造了個(gè)rocksDB的存儲(chǔ)引擎,里面就用了跳表。直接說(shuō)結(jié)論,它的寫(xiě)入性能確實(shí)是比innodb要好,但讀性能確實(shí)比innodb要差不少。

redis為什么使用跳表而不使用B+樹(shù)或二叉樹(shù)呢?

redis支持多種數(shù)據(jù)結(jié)構(gòu),里面有個(gè)有序集合,也叫ZSET。內(nèi)部實(shí)現(xiàn)就是跳表。那為什么要用跳表而不用B+樹(shù)等結(jié)構(gòu)呢?

這個(gè)幾乎每次面試都要被問(wèn)一下。

雖然已經(jīng)很熟了,但每次都要裝作之前沒(méi)想過(guò),現(xiàn)場(chǎng)思考一下才知道答案。

真的,很考驗(yàn)演技。

大家知道,redis 是純純的內(nèi)存數(shù)據(jù)庫(kù)。

進(jìn)行讀寫(xiě)數(shù)據(jù)都是操作內(nèi)存,跟磁盤(pán)沒(méi)啥關(guān)系,因此也不存在磁盤(pán)IO了,所以層高就不再是跳表的劣勢(shì)了。

并且前面也提到B+樹(shù)是有一系列合并拆分操作的,換成紅黑樹(shù)或者其他AVL樹(shù)的話也是各種旋轉(zhuǎn),目的也是為了保持樹(shù)的平衡

而跳表插入數(shù)據(jù)時(shí),只需要隨機(jī)一下,就知道自己要不要往上加索引,根本不用考慮前后結(jié)點(diǎn)的感受,也就少了旋轉(zhuǎn)平衡的開(kāi)銷(xiāo)

因此,redis選了跳表,而不是B+樹(shù)。

總結(jié)

  • B+樹(shù)是多叉平衡搜索樹(shù),扇出高,只需要3層左右就能存放2kw左右的數(shù)據(jù),同樣情況下跳表則需要24層左右,假設(shè)層高對(duì)應(yīng)磁盤(pán)IO,那么B+樹(shù)的讀性能會(huì)比跳表要好,因此mysql選了B+樹(shù)做索引。

  • redis的讀寫(xiě)全在內(nèi)存里進(jìn)行操作,不涉及磁盤(pán)IO,同時(shí)跳表實(shí)現(xiàn)簡(jiǎn)單,相比B+樹(shù)、AVL樹(shù)、少了旋轉(zhuǎn)樹(shù)結(jié)構(gòu)的開(kāi)銷(xiāo),因此redis使用跳表來(lái)實(shí)現(xiàn)ZSET,而不是樹(shù)結(jié)構(gòu)。

  • 存儲(chǔ)引擎RocksDB內(nèi)部使用了跳表,對(duì)比使用B+樹(shù)的innodb,雖然寫(xiě)性能更好,但讀性能屬實(shí)差了些。在讀多寫(xiě)少的場(chǎng)景下,B+樹(shù)依舊YYDS。


聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7247

    瀏覽量

    91292
  • MySQL
    +關(guān)注

    關(guān)注

    1

    文章

    849

    瀏覽量

    27651
  • 索引
    +關(guān)注

    關(guān)注

    0

    文章

    59

    瀏覽量

    10637

原文標(biāo)題:Mysql索引為什么使用B+樹(shù)?

文章出處:【微信號(hào):良許Linux,微信公眾號(hào):良許Linux】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    mysql索引使用技巧有哪些?

    mysql索引使用技巧
    發(fā)表于 05-20 06:09

    MySQL索引使用優(yōu)化和規(guī)范

    MySQL - 索引使用優(yōu)化和規(guī)范
    發(fā)表于 06-15 16:01

    MySQL數(shù)據(jù)庫(kù)索引的底層是怎么實(shí)現(xiàn)的

    ' 。就能查出特定列(姓名列)的特定值(張三)的記錄。另外,它是一種數(shù)據(jù)結(jié)構(gòu)。那么mysql的數(shù)據(jù)結(jié)構(gòu),采用的是B+樹(shù)。那么,為啥選B+樹(shù)
    發(fā)表于 07-28 15:30

    基于B+樹(shù)的動(dòng)態(tài)數(shù)據(jù)持有性證明方案

    針對(duì)云存儲(chǔ)環(huán)境下的數(shù)據(jù)持有性證明( PDP)方案效率較低、不能很好支持全動(dòng)態(tài)更新的問(wèn)題,設(shè)計(jì)了一種基于B+樹(shù)的動(dòng)態(tài)數(shù)據(jù)持有性證明方案。該方案引入雙線性對(duì)技術(shù)和數(shù)據(jù)版本表,支持用戶進(jìn)行數(shù)據(jù)塊級(jí)的細(xì)粒度
    發(fā)表于 11-30 17:14 ?0次下載
    基于<b class='flag-5'>B+</b><b class='flag-5'>樹(shù)</b>的動(dòng)態(tài)數(shù)據(jù)持有性證明方案

    基于KD樹(shù)和R樹(shù)的多維索引結(jié)構(gòu)

    針對(duì)云存儲(chǔ)系統(tǒng)大多基于鍵值對(duì) key,value模型存儲(chǔ)數(shù)據(jù),多維查詢需要對(duì)整個(gè)數(shù)據(jù)集進(jìn)行完全掃描,查詢效率較低的問(wèn)題,提出了一種基于KD樹(shù)和R樹(shù)的多維索引結(jié)構(gòu)(簡(jiǎn)稱KD-R索引)。K
    發(fā)表于 01-25 15:13 ?0次下載
    基于KD<b class='flag-5'>樹(shù)</b>和R<b class='flag-5'>樹(shù)</b>的多維<b class='flag-5'>索引</b>結(jié)構(gòu)

    MySQL索引使用原則

    一般來(lái)說(shuō), MySQL 中的 B-Tree 索引的物理文件大多都是以 Balance Tree 的結(jié)構(gòu)來(lái)存儲(chǔ)的,也就是所有實(shí)際需要的數(shù)據(jù)都存放于 Tree 的 Leaf Node(葉子節(jié)點(diǎn)) ,而且
    的頭像 發(fā)表于 02-11 15:17 ?2905次閱讀
    <b class='flag-5'>MySQL</b><b class='flag-5'>索引</b>使用原則

    MySQL索引的使用問(wèn)題

    一、前言 在MySQL中進(jìn)行SQL優(yōu)化的時(shí)候,經(jīng)常會(huì)在一些情況下,對(duì)MySQL能否利用索引有一些迷惑。譬如:1、MySQL 在遇到范圍查詢條件的時(shí)候就停止匹配了,那么到底是哪些范圍條件
    的頭像 發(fā)表于 01-06 16:13 ?1779次閱讀

    關(guān)于MySQL ORDER BY的詳解

    回答一些常見(jiàn)的問(wèn)題(下文僅討論InnoDB存儲(chǔ)引擎)。 2 索引掃描排序和文件排序(filesort)簡(jiǎn)介 我們知道InnoDB存儲(chǔ)引擎以B+樹(shù)作為索引的底層實(shí)現(xiàn),
    的頭像 發(fā)表于 02-08 11:20 ?2711次閱讀
    關(guān)于<b class='flag-5'>MySQL</b> ORDER BY的詳解

    掌握這幾種方法 你的接口查詢速度將飛速提升

    很大時(shí),大多慢查詢可以用索引解決,大多慢查詢也因?yàn)?b class='flag-5'>索引不合理而產(chǎn)生。 MySQL 索引基于 B+ 樹(shù)
    的頭像 發(fā)表于 07-06 14:38 ?1980次閱讀

    對(duì) B+ 樹(shù)索引MySQL 中的認(rèn)識(shí)

    概述 本質(zhì):數(shù)據(jù)庫(kù)維護(hù)某種數(shù)據(jù)結(jié)構(gòu)以某種方式引用(指向)數(shù)據(jù) 索引取舍原則:索引的結(jié)構(gòu)組織要盡量減少查找過(guò)程中磁盤(pán)I/O的存取次數(shù) B樹(shù) 滿足的條件 d為大于1的一個(gè)正整數(shù),稱為
    的頭像 發(fā)表于 11-08 11:11 ?1395次閱讀
    對(duì) <b class='flag-5'>B+</b> <b class='flag-5'>樹(shù)</b>與<b class='flag-5'>索引</b>在 <b class='flag-5'>MySQL</b> 中的認(rèn)識(shí)

    MySQL高級(jí)進(jìn)階:索引優(yōu)化

    MySQL官方對(duì)于索引的定義:索引是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)。
    的頭像 發(fā)表于 06-11 11:13 ?825次閱讀
    <b class='flag-5'>MySQL</b>高級(jí)進(jìn)階:<b class='flag-5'>索引</b>優(yōu)化

    MySQL為什么選擇B+樹(shù)作為索引結(jié)構(gòu)?

    MySQL中,無(wú)論是Innodb還是MyIsam,都使用了B+樹(shù)索引結(jié)構(gòu)(這里不考慮hash等其他索引)。本文將從最普通的二叉查找
    的頭像 發(fā)表于 07-20 11:28 ?1190次閱讀
    <b class='flag-5'>MySQL</b>為什么選擇<b class='flag-5'>B+</b><b class='flag-5'>樹(shù)</b>作為<b class='flag-5'>索引</b>結(jié)構(gòu)?

    MySQL索引的常用知識(shí)點(diǎn)

    索引結(jié)構(gòu):B+樹(shù) 索引其實(shí)是一種數(shù)據(jù)結(jié)構(gòu) 注意B+樹(shù)MyS
    的頭像 發(fā)表于 09-30 16:43 ?658次閱讀

    索引是什么意思 優(yōu)缺點(diǎn)有哪些

    的數(shù)據(jù)結(jié)構(gòu),以協(xié)助快速查詢、更新數(shù)據(jù)庫(kù)表中數(shù)據(jù)。索引的實(shí)現(xiàn)通常使用B樹(shù)及其變種B+樹(shù)。更通俗的說(shuō),索引
    的頭像 發(fā)表于 10-09 10:19 ?3837次閱讀

    一文了解MySQL索引機(jī)制

    的呢?一起靜下心來(lái),耐心看完這篇文章吧,干貨不啰嗦,相信你一定會(huì)有所收獲。 一、索引模型 模型也就是數(shù)據(jù)結(jié)構(gòu),常見(jiàn)的三種模型分別是哈希表、有序數(shù)組和搜索樹(shù)。 了解MySQL的朋友已經(jīng)知道,現(xiàn)在
    的頭像 發(fā)表于 07-25 14:05 ?537次閱讀
    一文了解<b class='flag-5'>MySQL</b><b class='flag-5'>索引</b>機(jī)制
    主站蜘蛛池模板: 久久午夜综合久久 | 国产三级久久久精品三级 | 萌白酱白丝护士服喷水铁牛tv | 你懂的视频在线看 | 年下系列高h文 | 久久国产精品免费看 | 亚1州区2区三区4区产品 | 欧美一级免费观看 | 中国业余老太性视频 | 97夜夜澡人人爽人人喊一欧美 | 欲色啪| 日本拍拍拍 | 天天看片中文字幕 | 美女涩涩网站 | 岛国最新资源网站 | 孩交精品xxxx视频视频 | 亚洲第一区在线 | 欧美一区亚洲 | 欧美性淫爽www视频播放 | 加勒比精品久久一区二区三区 | 亚洲天堂电影在线观看 | 黄色视屏在线免费播放 | 天堂资源在线观看 | 午夜免费网站 | 亚洲高清免费在线观看 | 欧美在线视频免费 | 久操操 | 亚洲影视久久 | 国产精品女丝袜白丝袜 | 性视频在线 | 色狠狠xx| 免费一看一级毛片全播放 | 人人干人人澡 | 久久精品免视看国产成人2021 | 精品卡1卡2卡三卡免费网站视频 | 亚洲va久久久噜噜噜久久天堂 | 性欧美xxxx视频在线观看 | 亚洲一区日韩一区欧美一区a | 日韩精品系列产品 | 日本在线黄色网址 | 日本aaaa视频 |