3atv精品不卡视频,97人人超碰国产精品最新,中文字幕av一区二区三区人妻少妇,久久久精品波多野结衣,日韩一区二区三区精品

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

B+树索引及其使用

發布時間:2023/12/20 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 B+树索引及其使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

B+樹索引及其使用

一、B+樹索引

我們先來回顧一下前面講的Innodb數據頁的7個組成部分,首先各個數據頁可以組成一個雙向鏈表,而每個數據頁中的記錄會按照主鍵值從小到大的順序組成一個單向鏈表,每個數據頁都會為存儲在它里邊兒的記錄生成一個頁目錄,在通過主鍵查找某條記錄的時候可以在頁目錄中使用二分法快速定位到對應的槽,然后再遍歷該槽對應分組中的記錄即可快速找到指定的記錄。

名稱中文名占用空間大小簡單描述
File Header文件頭部38字節頁的一些通用信息(頁號、上下頁號、頁類型、表空間、校驗和等)
Page Header頁面頭部56字節數據頁專有的一些信息(槽的數量、記錄的數量地址、B+樹的層級、索引ID等)
Infimum + Supremum最大記錄和最小記錄26字節兩個虛擬行記錄
User Records用戶記錄不確定實際存儲的行記錄內容
Free Space空閑記錄不確定頁中尚未使用的空間
Page Directory頁面目錄不確定頁中的某些記錄的相對位置(槽、每組最后一條記錄的的地址偏移量)
File Trailer文件尾部8字節檢驗頁是否完整(檢驗和、最后修改對應的日志序列位置LSN)

名稱大小(單位:bit)描述
預留位11沒有使用
預留位21沒有使用
delete_mask1標記該記錄是否被刪除
min_rec_mask1B+樹的每層非葉子節點中的最小記錄都會添加該標記
n_owned4表示當前記錄擁有的記錄數
heap_no13表示當前記錄在記錄堆的位置信息
record_type3表示當前記錄的類型,0表示普通記錄,1表示B+樹非葉子節點記錄,2表示最小記錄,3表示最大記錄
next_record16表示下一條記錄的相對位置
如果滿足:132 + 2×(27 + n) < 16384 即:n < 8099 就不會成為溢出列 132 = 38 + 56 + 26 + 8 + 4(兩個槽及其地址偏移量) (一個頁大小為16KB,也就是16384個字節,用兩個字節足夠表示地址偏移量) 2表示一個頁最少存儲兩行數據 27 = 2 + 1 + 5 + 6 + 6 + 7 2個字節存儲數據長度、 1個字節的NULL值列表、 5個字節的頭信息、 6個字節row_id、 6個字節事務id、 7個字節回滾指針

1.1沒有索引的查找

本集的主題是索引,在正式介紹索引之前,我們需要了解一下沒有索引的時候是怎么查找記錄的。為了方便大家理解,我們下邊先只嘮叨搜索條件為對某個列精確匹配的情況,所謂精確匹配,就是搜索條件中用等于=連接起的表達式,比如這樣:

SELECT [列名列表] FROM 表名 WHERE 列名 = xxx;

在一個頁中的查找

假設目前表中的記錄比較少,所有的記錄都可以被存放到一個頁中,在查找記錄的時候可以根據搜索條件的不同分為兩種情況:

  • 以主鍵為搜索條件
    這個查找過程我們已經很熟悉了,可以在頁目錄中使用二分法快速定位到對應的槽,然后再遍歷該槽對應分組中的記錄即可快速找到指定的記錄。
  • 以其他列為搜索條件
    對非主鍵列的查找的過程可就不這么幸運了,因為在數據頁中并沒有對非主鍵列建立所謂的頁目錄,所以我們無法通過二分法快速定位相應的槽。這種情況下只能從最小記錄開始依次遍歷單鏈表中的每條記錄,然后對比每條記錄是不是符合搜索條件。很顯然,這種查找的效率是非常低的。

在很多頁中查找

大部分情況下我們表中存放的記錄都是非常多的,需要好多的數據頁來存儲這些記錄。在很多頁中查找記錄的話可以分為兩個步驟:

  • 定位到記錄所在的頁
  • 從所在的頁內中查找相應的記錄
  • 在沒有索引的情況下,不論是根據主鍵列或者其他列的值進行查找,由于我們并不能快速的定位到記錄所在的頁,所以只能從第一個頁沿著雙向鏈表一直往下找,在每一個頁中根據我們剛剛嘮叨過的查找方式去查找指定的記錄。因為要遍歷所有的數據頁,所以這種方式顯然是超級耗時的,如果一個表有一億條記錄,使用這種方式去查找記錄那要等到猴年馬月才能等到查找結果。所以祖國和人民都在期盼一種能高效完成搜索的方法,索引同志就要亮相登臺了。

    1.2索引

    一個簡單的索引方案

    回到正題,我們在根據某個搜索條件查找一些記錄時為什么要遍歷所有的數據頁呢?因為各個頁中的記錄并沒有規律,我們并不知道我們的搜索條件匹配哪些頁中的記錄,所以 不得不 依次遍歷所有的數據頁。所以如果我們想快速的定位到需要查找的記錄在哪些數據頁中該咋辦?還記得我們為根據主鍵值快速定位一條記錄在頁中的位置而設立的頁目錄么?我們也可以想辦法為快速定位記錄所在的數據頁而建立一個別的目錄,建這個目錄必須完成下邊這些事兒:

    • 下一個數據頁中用戶記錄的主鍵值必須大于上一個頁中用戶記錄的主鍵值。
    mysql> CREATE TABLE index_demo(-> c1 INT,-> c2 INT,-> c3 CHAR(1),-> PRIMARY KEY(c1)-> ) ROW_FORMAT = Compact; Query OK, 0 rows affected (0.03 sec)mysql> INSERT INTO index_demo VALUES(1, 4, 'u'), (3, 9, 'd'), (5, 3, 'y'); Query OK, 3 rows affected (0.01 sec) Records: 3 Duplicates: 0 Warnings: 0

    mysql> INSERT INTO index_demo VALUES(4, 4, 'a'); Query OK, 1 row affected (0.00 sec)

    咦?怎么分配的頁號是28呀,不應該是11么?再次強調一遍,新分配的數據頁編號可能并不是連續的,也就是說我們使用的這些頁在存儲空間里可能并不挨著。它們只是通過維護著上一個頁和下一個頁的編號而建立了鏈表關系。另外,頁10中用戶記錄最大的主鍵值是5,而頁28中有一條記錄的主鍵值是4,因為5 > 4,所以這就不符合下一個數據頁中用戶記錄的主鍵值必須大于上一個頁中用戶記錄的主鍵值的要求,所以在插入主鍵值為4的記錄的時候需要伴隨著一次記錄移動,也就是把主鍵值為5的記錄移動到頁28中,然后再把主鍵值為4的記錄插入到頁10中,這個過程的示意圖如下:

    這個過程表明了在對頁中的記錄進行增刪改操作的過程中,我們必須通過一些諸如記錄移動的操作來始終保證這個狀態一直成立:下一個數據頁中用戶記錄的主鍵值必須大于上一個頁中用戶記錄的主鍵值。這個過程我們也可以稱為頁分裂。

    • 給所有的頁建立一個目錄項。

    由于數據頁的編號可能并不是連續的,所以在向index_demo表中插入許多條記錄后,可能是這樣的效果:

    因為這些16KB的頁在物理存儲上可能并不挨著,所以如果想從這么多頁中根據主鍵值快速定位某些記錄所在的頁,我們需要給它們做個目錄,每個頁對應一個目錄項,每個目錄項包括下邊兩個部分

    • 頁的用戶記錄中最小的主鍵值,我們用key來表示。
    • 頁號,我們用page_no表示。

    以頁28為例,它對應目錄項2,這個目錄項中包含著該頁的頁號28以及該頁中用戶記錄的最小主鍵值5。我們只需要把幾個目錄項在物理存儲器上連續存儲,比如把他們放到一個數組里,就可以實現根據主鍵值快速查找某條記錄的功能了。比方說我們想找主鍵值為20的記錄,具體查找過程分兩步:

  • 先從目錄項中根據二分法快速確定出主鍵值為20的記錄在目錄項3中(因為 12 < 20 < 209),它對應的頁是頁9。
  • 再根據前邊說的在頁中查找記錄的方式去頁9中定位具體的記錄。
  • 至此,針對數據頁做的簡易目錄就搞定了。不過忘了說了,這個目錄有一個別名,稱為索引。

    1.3InnoDB中的索引方案

    上邊之所以稱為一個簡易的索引方案,是因為我們為了在根據主鍵值進行查找時使用二分法快速定位具體的目錄項而假設所有目錄項都可以在物理存儲器上連續存儲,但是這樣做有幾個問題:

    • InnoDB是使用頁來作為管理存儲空間的基本單位,也就是最多能保證16KB的連續存儲空間,而隨著表中記錄數量的增多,需要非常大的連續的存儲空間才能把所有的目錄項都放下,這對記錄數量非常多的表是不現實的。
    • 我們時常會對記錄進行增刪,假設我們把頁28中的記錄都刪除了,頁28也就沒有存在的必要了,那意味著目錄項2也就沒有存在的必要了,這就需要把目錄項2后的目錄項都向前移動一下,這種牽一發而動全身的設計不是什么好主意~

    所以,設計InnoDB的大叔們需要一種可以靈活管理所有目錄項的方式。他們靈光乍現,忽然發現這些目錄項其實長得跟我們的用戶記錄差不多,只不過目錄項中的兩個列是主鍵和頁號而已,所以他們復用了之前存儲用戶記錄的數據頁來存儲目錄項,為了和用戶記錄做一下區分,我們把這些用來表示目錄項的記錄稱為目錄項記錄。那InnoDB怎么區分一條記錄是普通的用戶記錄還是目錄項記錄呢?別忘了記錄頭信息里的record_type屬性,它的各個取值代表的意思如下:

    0:普通的用戶記錄

    1:目錄項記錄

    2:最小記錄

    3:最大記錄

    從圖中可以看出來,我們新分配了一個編號為30的頁來專門存儲目錄項記錄。這里再次強調一遍目錄項記錄和普通的用戶記錄的不同點:

    • 目錄項記錄的record_type值是1,而普通用戶記錄的record_type值是0。
    • 目錄項記錄只有主鍵值和頁的編號兩個列,而普通的用戶記錄的列是用戶自己定義的,可能包含很多列,另外還有InnoDB自己添加的隱藏列。
    • 還記得我們之前在嘮叨記錄頭信息的時候說過一個叫min_rec_mask的屬性么,只有在存儲目錄項記錄的頁中的主鍵值最小的目錄項記錄的min_rec_mask值為1,其他別的記錄的min_rec_mask值都是0。

    除了上述幾點外,這兩者就沒啥差別了,它們用的是一樣的數據頁(頁面類型都是0x45BF,這個屬性在File Header中,忘了的話可以翻到前邊的文章看),頁的組成結構也是一樣一樣的(就是我們前邊介紹過的7個部分),都會為主鍵值生成Page Directory(頁目錄),從而在按照主鍵值進行查找時可以使用二分法來加快查詢速度。現在以查找主鍵為20的記錄為例,根據某個主鍵值去查找記錄的步驟就可以大致拆分成下邊兩步:

  • 先到存儲目錄項記錄的頁,也就是頁30中通過二分法快速定位到對應目錄項,因為12 < 20 < 209,所以定位到對應的記錄所在的頁就是頁9。
  • 再到存儲用戶記錄的頁9中根據二分法快速定位到主鍵值為20的用戶記錄。
  • 雖然說目錄項記錄中只存儲主鍵值和對應的頁號,比用戶記錄需要的存儲空間小多了,但是不論怎么說一個頁只有16KB大小,能存放的目錄項記錄也是有限的,那如果表中的數據太多,以至于一個數據頁不足以存放所有的目錄項記錄,該咋辦呢?

    當然是再多整一個存儲目錄項記錄的頁嘍~ 為了大家更好的理解新分配一個目錄項記錄頁的過程,我們假設一個存儲目錄項記錄的頁最多只能存放4條目錄項記錄(請注意是假設哦,真實情況下可以存放好多條的),所以如果此時我們再向上圖中插入一條主鍵值為320的用戶記錄的話,那就需要分配一個新的存儲目錄項記錄的頁嘍:

    從圖中可以看出,我們插入了一條主鍵值為320的用戶記錄之后需要兩個新的數據頁:

    • 為存儲該用戶記錄而新生成了頁31。
    • 因為原先存儲目錄項記錄的頁30的容量已滿(我們前邊假設只能存儲4條目錄項記錄),所以不得不需要一個新的頁32來存放頁31對應的目錄項。

    現在因為存儲目錄項記錄的頁不止一個,所以如果我們想根據主鍵值查找一條用戶記錄大致需要3個步驟,以查找主鍵值為20的記錄為例:

  • 確定目錄項記錄頁
    我們現在的存儲目錄項記錄的頁有兩個,即頁30和頁32,又因為頁30表示的目錄項的主鍵值的范圍是[1, 320),頁32表示的目錄項的主鍵值不小于320,所以主鍵值為20的記錄對應的目錄項記錄在頁30中。
  • 通過目錄項記錄頁確定用戶記錄真實所在的頁。
  • 在真實存儲用戶記錄的頁中定位到具體的記錄。
  • 那么問題來了,在這個查詢步驟的第1步中我們需要定位存儲目錄項記錄的頁,但是這些頁在存儲空間中也可能不挨著,如果我們表中的數據非常多則會產生很多存儲目錄項記錄的頁,那我們怎么根據主鍵值快速定位一個存儲目錄項記錄的頁呢?其實也簡單,為這些存儲目錄項記錄的頁再生成一個更高級的目錄,就像是一個多級目錄一樣,大目錄里嵌套小目錄,小目錄里才是實際的數據(遞歸定義),所以現在各個頁的示意圖就是這樣子:

    如圖,我們生成了一個存儲更高級目錄項的頁33,這個頁中的兩條記錄分別代表頁30和頁32,如果用戶記錄的主鍵值在[1, 320)之間,則到頁30中查找更詳細的目錄項記錄,如果主鍵值不小于320的話,就到頁32中查找更詳細的目錄項記錄。不過這張圖好漂亮喔,隨著表中記錄的增加,這個目錄的層級會繼續增加,如果簡化一下,那么我們可以用下邊這個圖來描述它:

    這玩意兒像不像一個倒過來的樹呀,上頭是樹根,下頭是樹葉!其實這是一種組織數據的形式,或者說是一種數據結構,它的名稱是B+樹。

    不論是存放用戶記錄的數據頁,還是存放目錄項記錄的數據頁,我們都把它們存放到B+樹這個數據結構中了,所以我們也稱這些數據頁為節點。從圖中可以看出來,我們的實際用戶記錄其實都存放在B+樹的最底層的節點上,這些節點也被稱為葉子節點或葉節點,其余用來存放目錄項的節點稱為非葉子節點或者內節點,其中B+樹最上邊的那個節點也稱為根節點。

    從圖中可以看出來,一個B+樹的節點其實可以分成好多層,設計InnoDB的大叔們為了討論方便,規定最下邊的那層,也就是存放我們用戶記錄的那層為第0層,之后依次往上加。之前的討論我們做了一個非常極端的假設:存放用戶記錄的頁最多存放3條記錄,存放目錄項記錄的頁最多存放4條記錄。其實真實環境中一個頁存放的記錄數量是非常大的,假設,假設,假設所有存放用戶記錄的葉子節點代表的數據頁可以存放100條用戶記錄,所有存放目錄項記錄的內節點代表的數據頁可以存放1000條目錄項記錄,那么:

    • 如果B+樹只有1層,也就是只有1個用于存放用戶記錄的節點,最多能存放100條記錄。
    • 如果B+樹有2層,最多能存放1000×100=100000條記錄。
    • 如果B+樹有3層,最多能存放1000×1000×100=100000000條記錄。
    • 如果B+樹有4層,最多能存放1000×1000×1000×100=100000000000條記錄。哇咔咔~這么多的記錄!!!

    你的表里能存放100000000000條記錄么?所以一般情況下,我們用到的B+樹都不會超過4層,那我們通過主鍵值去查找某條記錄最多只需要做4個頁面內的查找(查找3個目錄項頁和一個用戶記錄頁),又因為在每個頁面內有所謂的Page Directory(頁目錄),所以在頁面內也可以通過二分法實現快速定位記錄,這不是很牛么,哈哈!

    B+樹

    在介紹B樹之前,先來看另一棵神奇的樹——二叉排序樹(Binary Sort Tree),首先它是一棵樹,“二叉”這個描述已經很明顯了,就是樹上的一根樹枝開兩個叉,于是遞歸下來就是二叉樹了(下圖所示),而這棵樹上的節點是已經排好序的,具體的排序規則如下:

    • 若左子樹不空,則左子樹上所有節點的值均小于它的根節點的值
    • 若右子樹不空,則右字數上所有節點的值均大于它的根節點的值
    • 它的左、右子樹也分別為二叉排序數(遞歸定義)

    從圖中可以看出,二叉排序樹組織數據時,用于查找是比較方便的,因為每次經過一次節點時,最多可以減少一半的可能,不過極端情況會出現所有節點都位于同一側,直觀上看就是一條直線,那么這種查詢的效率就比較低了,因此需要對二叉樹左右子樹的高度進行平衡化處理,于是就有了平衡二叉樹(Balenced Binary Tree)。

    所謂“平衡”,說的是這棵樹的各個分支的高度是均勻的,它的左子樹和右子樹的高度之差絕對值小于1,這樣就不會出現一條支路特別長的情況。于是,在這樣的平衡樹中進行查找時,總共比較節點的次數不超過樹的高度,這就確保了查詢的效率(時間復雜度為O(logn))

    總的來說,m階B樹滿足以下條件:

    • 每個節點至多可以擁有m棵子樹。
    • 根節點,只有至少有2個節點(要么極端情況,就是一棵樹就一個根節點,單細胞生物,即是根,也是葉,也是樹)。
    • 非根非葉的節點至少有的Ceil(m/2)個子樹(Ceil表示向上取整,圖中5階B樹,每個節點至少有3個子樹,也就是至少有3個叉)。
    • 非葉節點中的信息包括[n,A0,K1,A1,K2,A2,…,Kn,An],,其中n表示該節點中保存的關鍵字個數,K為關鍵字且Ki<Ki+1,A為指向子樹根節點的指針。
    • 從根到葉子的每一條路徑都有相同的長度,也就是說,葉子節在相同的層,并且這些節點不帶信息,實際上這些節點就表示找不到指定的值,也就是指向這些節點的指針為空。

    B樹的查詢過程和二叉排序樹比較類似,從根節點依次比較每個結點,因為每個節點中的關鍵字和左右子樹都是有序的,所以只要比較節點中的關鍵字,或者沿著指針就能很快地找到指定的關鍵字,如果查找失敗,則會返回葉子節點,即空指針。

    例如查詢圖中字母表中的K:

  • 從根節點P開始,K的位置在P之前,進入左側指針。
  • 左子樹中,依次比較C、F、J、M,發現K在J和M之間。
  • 沿著J和M之間的指針,繼續訪問子樹,并依次進行比較,發現第一個關鍵字K即為指定查找的值。
  • B樹的特點可以總結為如下:

    • 關鍵字集合分布在整顆樹中。
    • 任何一個關鍵字出現且只出現在一個節點中。
    • 搜索有可能在非葉子節點結束。
    • 其搜索性能等價于在關鍵字集合內做一次二分查找。
    • B樹在插入刪除新的數據記錄會破壞B-Tree的性質,因為在插入刪除時,需要對樹進行一個分裂、合并、轉移等操作以保持B-Tree性質。

    作為B樹的加強版,B+樹與B樹的差異在于

    • 有n棵子樹的節點含有n個關鍵字(也有認為是n-1個關鍵字)。
    • 所有的關鍵字全部存儲在葉子節點上,且葉子節點本身根據關鍵字自小而大順序連接。
    • 非葉子節點可以看成索引部分,節點中僅含有其子樹(根節點)中的最大(或最小)關鍵字。

    B+樹的查找過程,與B樹類似,只不過查找時,如果在非葉子節點上的關鍵字等于給定值,并不終止,而是繼續沿著指針直到葉子節點位置。因此在B+樹,不管查找成功與否,每次查找都是走了一條從根到葉子節點的路徑。

    B+樹的特性如下:

    • 所有關鍵字都存儲在葉子節上,且鏈表中的關鍵字恰好是有序的。
    • 不可能非葉子節點命中返回。
    • 非葉子節點相當于葉子節點的索引,葉子節點相當于是存儲(關鍵字)數據的數據層。
    • 更適合文件索引系統。

    如上圖所示,在B+Tree的每個葉子節點增加一個指向相鄰葉子節點的指針,就形成了帶有順序訪問指針的B+Tree。做這個優化的目的是為了提高區間訪問的性能,例如圖4中如果要查詢key為從18到49的所有數據記錄,當找到18后,只需順著節點和指針順序遍歷就可以一次性訪問到所有數據節點,極大提到了區間查詢效率。

    紅黑樹等數據結構也可以用來實現索引,但是文件系統以及數據庫系統普遍采用B樹或者B+樹,這一節將結合計算機組成原理相關知識討論B-/+Tree作為索引的理論基礎。

    一般來說,索引本身也很大,不可能全部存儲在內存中,因此索引往往以索引文件的形式存儲在磁盤上。這樣的話,索引查找過程中就要產生磁盤I/O消耗,相對于內存存取,I/O存取的消耗要高幾個數量級,所以評價一個數據結構作為索引的優劣最重要的指標就是在查找過程中磁盤I/O操作次數的漸進復雜度。換句話說,索引的結構組織要盡量減少查找過程中磁盤I/O的存取次數。

    聚簇索引

    我們上邊介紹的B+樹本身就是一個目錄,或者說本身就是一個索引。它有兩個特點:

    • 使用記錄主鍵值的大小進行記錄和頁的排序,這包括三個方面的含義:
      1. 頁內的記錄是按照主鍵的大小順序排成一個單向鏈表。
      2. 各個存放用戶記錄的頁也是根據頁中用戶記錄的主鍵大小順序排成一個雙向鏈表。
      3. 存放目錄項記錄的頁分為不同的層次,在同一層次中的頁也是根據頁中目錄項記錄的主鍵大小順序排成一個雙向鏈表。
    • B+樹的葉子節點存儲的是完整的用戶記錄。
      所謂完整的用戶記錄,就是指這個記錄中存儲了所有列的值(包括隱藏列)。

    我們把具有這兩種特性的B+樹稱為聚簇索引,所有完整的用戶記錄都存放在這個聚簇索引的葉子節點處。這種聚簇索引并不需要我們在MySQL語句中顯式的使用INDEX語句去創建(后邊會介紹索引相關的語句),InnoDB存儲引擎會自動的為我們創建聚簇索引。另外有趣的一點是,在InnoDB存儲引擎中,聚簇索引就是數據的存儲方式(所有的用戶記錄都存儲在了葉子節點),也就是所謂的索引即數據,數據即索引。

    二級索引

    大家有木有發現,上邊介紹的聚簇索引只能在搜索條件是主鍵值時才能發揮作用,因為B+樹中的數據都是按照主鍵進行排序的。那如果我們想以別的列作為搜索條件該咋辦呢?難道只能從頭到尾沿著鏈表依次遍歷記錄么?

    不,我們可以多建幾棵B+樹,不同的B+樹中的數據采用不同的排序規則。比方說我們用c2列的大小作為數據頁、頁中記錄的排序規則,再建一棵B+樹,效果如下圖所示:

    這個B+樹與上邊介紹的聚簇索引有幾處不同:

    • 使用記錄c2列的大小進行記錄和頁的排序,這包括三個方面的含義:
    • 頁內的記錄是按照c2列的大小順序排成一個單向鏈表。
    • 各個存放用戶記錄的頁也是根據頁中記錄的c2列大小順序排成一個雙向鏈表。
    • 存放目錄項記錄的頁分為不同的層次,在同一層次中的頁也是根據頁中目錄項記錄的c2列大小順序排成一個雙向鏈表。
    • B+樹的葉子節點存儲的并不是完整的用戶記錄,而只是c2列+主鍵這兩個列的值。
    • 目錄項記錄中不再是主鍵+頁號的搭配,而變成了c2列+頁號的搭配。

    所以如果我們現在想通過c2列的值查找某些記錄的話就可以使用我們剛剛建好的這個B+樹了。以查找c2列的值為4的記錄為例,查找過程如下:

  • 確定目錄項記錄頁
    根據根頁面,也就是頁44,可以快速定位到目錄項記錄所在的頁為頁42(因為2 < 4 < 9)。
  • 通過目錄項記錄頁確定用戶記錄真實所在的頁。
    在頁42中可以快速定位到實際存儲用戶記錄的頁,但是由于c2列并沒有唯一性約束,所以c2列值為4的記錄可能分布在多個數據頁中,又因為2 < 4 ≤ 4,所以確定實際存儲用戶記錄的頁在頁34和頁35中。
  • 在真實存儲用戶記錄的頁中定位到具體的記錄。
    到頁34和頁35中定位到具體的記錄。
  • 但是這個B+樹的葉子節點中的記錄只存儲了c2和c1(也就是主鍵)兩個列,所以我們必須再根據主鍵值去聚簇索引中再查找一遍完整的用戶記錄。
  • 各位各位,看到步驟4的操作了么?我們根據這個以c2列大小排序的B+樹只能確定我們要查找記錄的主鍵值,所以如果我們想根據c2列的值查找到完整的用戶記錄的話,仍然需要到聚簇索引中再查一遍,這個過程也被稱為回表。也就是根據c2列的值查詢一條完整的用戶記錄需要使用到2棵B+樹!!!

    為什么我們還需要一次回表操作呢?直接把完整的用戶記錄放到葉子節點不就好了么?你說的對,如果把完整的用戶記錄放到葉子節點是可以不用回表,但是太占地方了呀~相當于每建立一棵B+樹都需要把所有的用戶記錄再都拷貝一遍,這就有點太浪費存儲空間了。因為這種按照非主鍵列建立的B+樹需要一次回表操作才可以定位到完整的用戶記錄,所以這種B+樹也被稱為二級索引(英文名secondary index),或者輔助索引。由于我們使用的是c2列的大小作為B+樹的排序規則,所以我們也稱這個B+樹為為c2列建立的索引。

    聯合索引

    我們也可以同時以多個列的大小作為排序規則,也就是同時為多個列建立索引,比方說我們想讓B+樹按照c2和c3列的大小進行排序,這個包含兩層含義:

    • 先把各個記錄和頁按照c2列進行排序。
    • 在記錄的c2列相同的情況下,采用c3列進行排序

    為c2和c3列建立的索引的示意圖如下:

    如圖所示,我們需要注意一下幾點:

    • 每條目錄項記錄都由c2、c3、頁號這三個部分組成,各條記錄先按照c2列的值進行排序,如果記錄的c2列相同,則按照c3列的值進行排序。
    • B+樹葉子節點處的用戶記錄由c2、c3和主鍵c1列組成。

    千萬要注意一點,以c2和c3列的大小為排序規則建立的B+樹稱為聯合索引,本質上也是一個二級索引。它的意思與分別為c2和c3列分別建立索引的表述是不同的,不同點如下:

    • 建立聯合索引只會建立如上圖一樣的1棵B+樹。
    • 為c2和c3列分別建立索引會分別以c2和c3列的大小為排序規則建立2棵B+樹。

    1.4InnoDB的B+樹索引的注意事項

    根節點萬年不動窩

    我們前邊介紹B+樹索引的時候,為了大家理解上的方便,先把存儲用戶記錄的葉子節點都畫出來,然后接著畫存儲目錄項記錄的內節點,實際上B+樹的形成過程是這樣的:

    • 每當為某個表創建一個B+樹索引(聚簇索引不是人為創建的,默認就有)的時候,都會為這個索引創建一個根節點頁面。最開始表中沒有數據的時候,每個B+樹索引對應的根節點中既沒有用戶記錄,也沒有目錄項記錄。
    • 隨后向表中插入用戶記錄時,先把用戶記錄存儲到這個根節點中。
    • 當根節點中的可用空間用完時繼續插入記錄,此時會將根節點中的所有記錄復制到一個新分配的頁,比如頁a中,然后對這個新頁進行頁分裂的操作,得到另一個新頁,比如頁b。這時新插入的記錄根據鍵值(也就是聚簇索引中的主鍵值,二級索引中對應的索引列的值)的大小就會被分配到頁a或者頁b中,而根節點便升級為存儲目錄項記錄的頁。

    這個過程需要大家特別注意的是:一個B+樹索引的根節點自誕生之日起,便不會再移動。這樣只要我們對某個表建立一個索引,那么它的根節點的頁號便會被記錄到某個地方,然后凡是InnoDB存儲引擎需要用到這個索引的時候,都會從那個固定的地方取出根節點的頁號,從而來訪問這個索引。

    內節點中目錄項記錄的唯一性

    我們知道B+樹索引的內節點中目錄項記錄的內容是索引列 + 頁號的搭配,但是這個搭配對于二級索引來說有點兒不嚴謹。還拿index_demo表為例,假設這個表中的數據是這樣的:

    c1c2c3
    11‘u’
    31‘d’
    51‘y’
    71‘a’

    如果二級索引中目錄項記錄的內容只是索引列 + 頁號的搭配的話,那么為c2列建立索引后的B+樹應該長這樣:

    如果我們想新插入一行記錄,其中c1、c2、c3的值分別是:9、1、‘c’,那么在修改這個為c2列建立的二級索引對應的B+樹時便碰到了個大問題:由于頁3中存儲的目錄項記錄是由c2列 + 頁號的值構成的,頁3中的兩條目錄項記錄對應的c2列的值都是1,而我們新插入的這條記錄的c2列的值也是1,那我們這條新插入的記錄到底應該放到頁4中,還是應該放到頁5中啊?答案是:對不起,懵逼了。

    為了讓新插入記錄能找到自己在那個頁里,我們需要保證在B+樹的同一層內節點的目錄項記錄除頁號這個字段以外是唯一的。所以對于二級索引的內節點的目錄項記錄的內容實際上是由三個部分構成的:

    • 索引列的值
    • 主鍵值
    • 頁號

    也就是我們把主鍵值也添加到二級索引內節點中的目錄項記錄了,這樣就能保證B+樹每一層節點中各條目錄項記錄除頁號這個字段外是唯一的,所以我們為c2列建立二級索引后的示意圖實際上應該是這樣子的:

    這樣我們再插入記錄(9, 1, ‘c’)時,由于頁3中存儲的目錄項記錄是由c2列 + 主鍵 + 頁號的值構成的,可以先把新記錄的c2列的值和頁3中各目錄項記錄的c2列的值作比較,如果c2列的值相同的話,可以接著比較主鍵值,因為B+樹同一層中不同目錄項記錄的c2列 + 主鍵的值肯定是不一樣的,所以最后肯定能定位唯一的一條目錄項記錄,在本例中最后確定新記錄應該被插入到頁5中。

    一個頁面最少存儲2條記錄

    我們前邊說過一個B+樹只需要很少的層級就可以輕松存儲數億條記錄,查詢速度杠杠的!這是因為B+樹本質上就是一個大的多層級目錄,每經過一個目錄時都會過濾掉許多無效的子目錄,直到最后訪問到存儲真實數據的目錄。那如果一個大的目錄中只存放一個子目錄是個啥效果呢?那就是目錄層級非常非常非常多,而且最后的那個存放真實數據的目錄中只能存放一條記錄。費了半天勁只能存放一條真實的用戶記錄?逗我呢?所以InnoDB的一個數據頁至少可以存放兩條記錄,這也是我們之前嘮叨記錄行格式的時候說過一個結論(我們當時依據這個結論推導了表中只有一個列時該列在不發生行溢出的情況下最多能存儲多少字節,忘了的話回去看看吧)。

    MyISAM中的索引方案簡單介紹

    至此,我們介紹的都是InnoDB存儲引擎中的索引方案,為了內容的完整性,以及各位可能在面試的時候遇到這類的問題,我們有必要再簡單介紹一下MyISAM存儲引擎中的索引方案。我們知道InnoDB中索引即數據,也就是聚簇索引的那棵B+樹的葉子節點中已經把所有完整的用戶記錄都包含了,而MyISAM的索引方案雖然也使用樹形結構,但是卻將索引和數據分開存儲:

    • 將表中的記錄按照記錄的插入順序單獨存儲在一個文件中,稱之為數據文件。這個文件并不劃分為若干個數據頁,有多少記錄就往這個文件中塞多少記錄就成了。我們可以通過行號而快速訪問到一條記錄。

    MyISAM記錄也需要記錄頭信息來存儲一些額外數據,我們以上邊嘮叨過的index_demo表為例,看一下這個表中的記錄使用MyISAM作為存儲引擎在存儲空間中的表示:

    由于在插入數據的時候并沒有刻意按照主鍵大小排序,所以我們并不能在這些數據上使用二分法進行查找。

    • 使用MyISAM存儲引擎的表會把索引信息另外存儲到一個稱為索引文件的另一個文件中。MyISAM會單獨為表的主鍵創建一個索引,只不過在索引的葉子節點中存儲的不是完整的用戶記錄,而是主鍵值 + 行號的組合。也就是先通過索引找到對應的行號,再通過行號去找對應的記錄!

    這一點和InnoDB是完全不相同的,在InnoDB存儲引擎中,我們只需要根據主鍵值對聚簇索引進行一次查找就能找到對應的記錄,而在MyISAM中卻需要進行一次回表操作,意味著MyISAM中建立的索引相當于全部都是二級索引!

    • 如果有需要的話,我們也可以對其它的列分別建立索引或者建立聯合索引,原理和InnoDB中的索引差不多,不過在葉子節點處存儲的是相應的列 + 行號。這些索引也全部都是二級索引

    MySQL中創建和刪除索引的語句

    光顧著嘮叨索引的原理了,那我們如何使用MySQL語句去建立這種索引呢?InnoDB和MyISAM會自動為主鍵或者聲明為UNIQUE的列去自動建立B+樹索引,但是如果我們想為其他的列建立索引就需要我們顯式的去指明。為啥不自動為每個列都建立個索引呢?別忘了,每建立一個索引都會建立一棵B+樹,每插入一條記錄都要維護各個記錄、數據頁的排序關系,這是很費性能和存儲空間的。

    我們可以在創建表的時候指定需要建立索引的單個列或者建立聯合索引的多個列:

    CREATE TALBE 表名 (各種列的信息 ··· , [KEY|INDEX] 索引名 (需要被索引的單個列或多個列) )

    其中的KEY和INDEX是同義詞,任意選用一個就可以。我們也可以在修改表結構的時候添加索引:

    ALTER TABLE 表名 ADD [INDEX|KEY] 索引名 (需要被索引的單個列或多個列);

    也可以在修改表結構的時候刪除索引:

    ALTER TABLE 表名 DROP [INDEX|KEY] 索引名;

    比方說我們想在創建index_demo表的時候就為c2和c3列添加一個聯合索引,可以這么寫建表語句:

    CREATE TABLE index_demo(c1 INT,c2 INT,c3 CHAR(1),PRIMARY KEY(c1),INDEX idx_c2_c3 (c2, c3) );

    在這個建表語句中我們創建的索引名是idx_c2_c3,這個名稱可以隨便起,不過我們還是建議以idx_為前綴,后邊跟著需要建立索引的列名,多個列名之間用下劃線_分隔開。

    如果我們想刪除這個索引,可以這么寫:

    ALTER TABLE index_demo DROP INDEX idx_c2_c3;

    二、B+樹索引的使用

    2.1索引的代價

    在熟悉了B+樹索引原理之后,本篇文章的主題是嘮叨如何更好的使用索引,雖然索引是個好東西,可不能亂建,在介紹如何更好的使用索引之前先要了解一下使用這玩意兒的代價,它在空間和時間上都會拖后腿:

    • 空間上的代價

    這個是顯而易見的,每建立一個索引都要為它建立一棵B+樹,每一棵B+樹的每一個節點都是一個數據頁,一個頁默認會占用16KB的存儲空間,一棵很大的B+樹由許多數據頁組成,那可是很大的一片存儲空間呢。

    • 時間上的代價

    每次對表中的數據進行增、刪、改操作時,都需要去修改各個B+樹索引。而且我們講過,B+樹每層節點都是按照索引列的值從小到大的順序排序而組成了雙向鏈表。不論是葉子節點中的記錄,還是內節點中的記錄(也就是不論是用戶記錄還是目錄項記錄)都是按照索引列的值從小到大的順序而形成了一個單向鏈表。而增、刪、改操作可能會對節點和記錄的排序造成破壞,所以存儲引擎需要額外的時間進行一些記錄移位,頁面分裂、頁面回收啥的操作來維護好節點和記錄的排序。如果我們建了許多索引,每個索引對應的B+樹都要進行相關的維護操作,這還能不給性能拖后腿么?

    所以說,一個表上索引建的越多,就會占用越多的存儲空間,在增刪改記錄的時候性能就越差。為了能建立又好又少的索引,我們先得學學這些索引在哪些條件下起作用的。

    2.2B+樹索引適用的條件

    下邊我們將嘮叨許多種讓B+樹索引發揮最大效能的技巧和注意事項,不過大家要清楚,所有的技巧都是源自你對B+樹索引本質的理解,所以如果你還不能保證對B+樹索引充分的理解,那么再次建議回過頭把前邊的內容看完了再來,要不然讀文章對你來說是一種折磨。首先,B+樹索引并不是萬能的,并不是所有的查詢語句都能用到我們建立的索引。下邊介紹幾個我們可能使用B+樹索引來進行查詢的情況。為了故事的順利發展,我們需要先創建一個表,這個表是用來存儲人的一些基本信息的:

    CREATE TABLE person_info(id INT NOT NULL auto_increment,name VARCHAR(100) NOT NULL,birthday DATE NOT NULL,phone_number CHAR(11) NOT NULL,country varchar(100) NOT NULL,PRIMARY KEY (id),KEY idx_name_birthday_phone_number (name, birthday, phone_number) );

    對于這個person_info表我們需要注意兩點:

    • 表中的主鍵是id列,它存儲一個自動遞增的整數。所以InnoDB存儲引擎會自動為id列建立聚簇索引。
    • 我們額外定義了一個二級索引idx_name_birthday_phone_number,它是由3個列組成的聯合索引。所以在這個索引對應的B+樹的葉子節點處存儲的用戶記錄只保留name、birthday、phone_number這三個列的值以及主鍵id的值,并不會保存country列的值。

    從這兩點注意中我們可以再次看到,一個表中有多少索引就會建立多少棵B+樹,person_info表會為聚簇索引和idx_name_birthday_phone_number索引建立2棵B+樹。下邊我們畫一下索引idx_name_birthday_phone_number的示意圖,不過既然我們已經掌握了InnoDB的B+樹索引原理,那我們在畫圖的時候為了讓圖更加清晰,所以在省略一些不必要的部分,比如記錄的額外信息,各頁面的頁號等等,其中內節點中目錄項記錄的頁號信息我們用箭頭來代替,在記錄結構中只保留name、birthday、phone_number、id這四個列的真實數據值,所以示意圖就長這樣(留心的同學看出來了,這其實和《高性能MySQL》里舉的例子的圖差不多,我覺得這個例子特別好,所以就借鑒了一下):

    為了方便大家理解,我們特意標明了哪些是內節點,哪些是葉子節點。再次強調一下,內節點中存儲的是目錄項記錄,葉子節點中存儲的是用戶記錄(由于不是聚簇索引,所以用戶記錄是不完整的,缺少country列的值)。從圖中可以看出,這個idx_name_birthday_phone_number索引對應的B+樹中頁面和記錄的排序方式就是這樣的:

    • 先按照name列的值進行排序。
    • 如果name列的值相同,則按照birthday列的值進行排序。
    • 如果birthday列的值也相同,則按照phone_number的值進行排序。

    這個排序方式十分、特別、非常、巨、very very very重要,因為只要頁面和記錄是排好序的,我們就可以通過二分法來快速定位查找。下邊的內容都仰仗這個圖了,大家對照著圖理解。

    全值匹配

    如果我們的搜索條件中的列和索引列一致的話,這種情況就稱為全值匹配,比方說下邊這個查找語句:

    SELECT * FROM person_info WHERE name = 'Ashburn' AND birthday = '1990-09-27' AND phone_number = '15123983239';

    我們建立的idx_name_birthday_phone_number索引包含的3個列在這個查詢語句中都展現出來了。大家可以想象一下這個查詢過程:

    • 因為B+樹的數據頁和記錄先是按照name列的值進行排序的,所以先可以很快定位name列的值是Ashburn的記錄位置。
    • 在name列相同的記錄里又是按照birthday列的值進行排序的,所以在name列的值是Ashburn的記錄里又可以快速定位birthday列的值是’1990-09-27’的記錄。
    • 如果很不幸,name和birthday列的值都是相同的,那記錄是按照phone_number列的值排序的,所以聯合索引中的三個列都可能被用到。

    有的同學也許有個疑問,WHERE子句中的幾個搜索條件的順序對查詢結果有啥影響么?也就是說如果我們調換name、birthday、phone_number這幾個搜索列的順序對查詢的執行過程有影響么?比方說寫成下邊這樣:

    SELECT * FROM person_info WHERE birthday = '1990-09-27' AND phone_number = '15123983239' AND name = 'Ashburn';

    答案是:沒影響哈。MySQL有一個叫查詢優化器的東東,會分析這些搜索條件并且按照可以使用的索引中列的順序來決定先使用哪個搜索條件,后使用哪個搜索條件。我們后邊兒會有專門的章節來介紹查詢優化器,敬請期待。

    匹配左邊的列

    其實在我們的搜索語句中也可以不用包含全部聯合索引中的列,只包含左邊的就行,比方說下邊的查詢語句

    SELECT * FROM person_info WHERE name = 'Ashburn';

    或者包含多個左邊的列也行:

    SELECT * FROM person_info WHERE name = 'Ashburn' AND birthday = '1990-09-27';

    那為什么搜索條件中必須出現左邊的列才可以使用到這個B+樹索引呢?比如下邊的語句就用不到這個B+樹索引么?

    SELECT * FROM person_info WHERE birthday = '1990-09-27';

    是的,的確用不到,因為B+樹的數據頁和記錄先是按照name列的值排序的,在name列的值相同的情況下才使用birthday列進行排序,也就是說name列的值不同的記錄中birthday的值可能是無序的。而現在你跳過name列直接根據birthday的值去查找,臣妾做不到呀~ 那如果我就想在只使用birthday的值去通過B+樹索引進行查找咋辦呢?這好辦,你再對birthday列建一個B+樹索引就行了,創建索引的語法不用我嘮叨了吧。

    但是需要特別注意的一點是,如果我們想使用聯合索引中盡可能多的列,搜索條件中的各個列必須是聯合索引中從最左邊連續的列。比方說聯合索引idx_name_birthday_phone_number中列的定義順序是name、birthday、phone_number,如果我們的搜索條件中只有name和phone_number,而沒有中間的birthday,比方說這樣:

    SELECT * FROM person_info WHERE name = 'Ashburn' AND phone_number = '15123983239';

    這樣只能用到name列的索引,birthday和phone_number的索引就用不上了,因為name值相同的記錄先按照birthday的值進行排序,birthday值相同的記錄才按照phone_number值進行排序。

    匹配列前綴

    我們前邊說過為某個列建立索引的意思其實就是在對應的B+樹的記錄中使用該列的值進行排序,比方說person_info表上建立的聯合索引idx_name_birthday_phone_number會先用name列的值進行排序,所以這個聯合索引對應的B+樹中的記錄的name列的排列就是這樣的:

    Aaron
    Aaron

    Aaron
    Asa
    Ashburn

    Ashburn
    Baird
    Barlow

    Barlow

    字符串排序的本質就是比較哪個字符串大一點兒,哪個字符串小一點,比較字符串大小就用到了該列的字符集和比較規則,這個我們前邊兒嘮叨過,就不多嘮叨了。這里需要注意的是,一般的比較規則都是逐個比較字符的大小,也就是說我們比較兩個字符串的大小的過程其實是這樣的:

    • 先比較字符串的第一個字符,第一個字符小的那個字符串就比較小。
    • 如果兩個字符串的第一個字符相同,那就再比較第二個字符,第二個字符比較小的那個字符串就比較小。
    • 如果兩個字符串的第二個字符也相同,那就接著比較第三個字符,依此類推。

    所以一個排好序的字符串列其實有這樣的特點:

    • 先按照字符串的第一個字符進行排序。
    • 如果第一個字符相同再按照第二個字符進行排序。
    • 如果第二個字符相同再按照第三個字符進行排序,依此類推。

    也就是說這些字符串的前n個字符,也就是前綴都是排好序的,所以對于字符串類型的索引列來說,我們只匹配它的前綴也是可以快速定位記錄的,比方說我們想查詢名字以’As’開頭的記錄,那就可以這么寫查詢語句:

    SELECT * FROM person_info WHERE name LIKE 'As%';

    但是需要注意的是,如果只給出后綴或者中間的某個字符串,比如這樣:

    SELECT * FROM person_info WHERE name LIKE '%As%';

    MySQL就無法快速定位記錄位置了,因為字符串中間有’As’的字符串并沒有排好序,所以只能全表掃描了。有時候我們有一些匹配某些字符串后綴的需求,比方說某個表有一個url列,該列中存儲了許多url:

    url
    www.baidu.com
    www.google.com
    www.gov.cn
    www.wto.org

    假設已經對該url列創建了索引,如果我們想查詢以com為后綴的網址的話可以這樣寫查詢條件:WHERE url LIKE ‘%com’,但是這樣的話無法使用該url列的索引。為了在查詢時用到這個索引而不至于全表掃描,我們可以把后綴查詢改寫成前綴查詢,不過我們就得把表中的數據全部逆序存儲一下,也就是說我們可以這樣保存url列中的數據:

    url
    moc.udiab.www
    moc.elgoog.www
    nc.vog.www
    gro.otw.www

    這樣再查找以com為后綴的網址時搜索條件便可以這么寫:WHERE url LIKE ‘moc%’,這樣就可以用到索引了。

    匹配范圍值

    回頭看我們idx_name_birthday_phone_number索引的B+樹示意圖,所有記錄都是按照索引列的值從小到大的順序排好序的,所以這極大的方便我們查找索引列的值在某個范圍內的記錄。比方說下邊這個查詢語句:

    SELECT * FROM person_info WHERE name > 'Asa' AND name < 'Barlow';

    由于B+樹中的數據頁和記錄是先按name列排序的,所以我們上邊的查詢過程其實是這樣的:

    • 通過B+樹在葉子節點中找到第一條name值大于Asa的二級索引記錄,讀取該記錄的主鍵值進行回表操作,獲得對應的聚簇索引記錄后發送給客戶端。
    • 根據上一步找到的記錄,沿著記錄所在的鏈表向后查找(同一頁面中的記錄使用單向鏈表連接起來,數據頁之間用雙向鏈表連接起來)下一條二級索引記錄,判斷該記錄是否符合name < 'Barlow’條件,如果符合,則進行回表操作后發送至客戶端。
    • 重復上一步驟,直到某條二級索引記錄不符合name <'Barlow’條件為止。

    不過在使用聯合進行范圍查找的時候需要注意,如果對多個列同時進行范圍查找的話,只有對索引最左邊的那個列進行范圍查找的時候才能用到B+樹索引,比方說這樣

    SELECT * FROM person_info WHERE name > 'Asa' AND name < 'Barlow' AND birthday > '1980-01-01';

    上邊這個查詢可以分成兩個部分:

  • 通過條件name > ‘Asa’ AND name < ‘Barlow’ 來對name進行范圍,查找的結果可能有多條name值不同的記錄,
  • 對這些name值不同的記錄繼續通過birthday > '1980-01-01’條件繼續過濾。
  • 這樣子對于聯合索引idx_name_birthday_phone_number來說,只能用到name列的部分,而用不到birthday列的部分,因為只有name值相同的情況下才能用birthday列的值進行排序,而這個查詢中通過name進行范圍查找的記錄中可能并不是按照birthday列進行排序的,所以在搜索條件中繼續以birthday列進行查找時是用不到這個B+樹索引的。

    精確匹配某一列并范圍匹配另外一列

    對于同一個聯合索引來說,雖然對多個列都進行范圍查找時只能用到最左邊那個索引列,但是如果左邊的列是精確查找,則右邊的列可以進行范圍查找,比方說這樣:

    SELECT * FROM person_info WHERE name = 'Ashburn' AND birthday > '1980-01-01' AND birthday < '2000-12-31' AND phone_number > '15100000000';

    這個查詢的條件可以分為3個部分:

  • name = ‘Ashburn’,對name列進行精確查找,當然可以使用B+樹索引了。
  • birthday > ‘1980-01-01’ AND birthday < ‘2000-12-31’,由于name列是精確查找,所以通過name = 'Ashburn’條件查找后得到的結果的name值都是相同的,它們會再按照birthday的值進行排序。所以此時對birthday列進行范圍查找是可以用到B+樹索引的。
  • phone_number > ‘15100000000’,通過birthday的范圍查找的記錄的birthday的值可能不同,所以這個條件無法再利用B+樹索引了,只能遍歷上一步查詢得到的記錄。
  • 同理,下邊的查詢也是可能用到這個idx_name_birthday_phone_number聯合索引的:

    SELECT * FROM person_info WHERE name = 'Ashburn' AND birthday = '1980-01-01' AND phone_number > '15100000000';

    用于排序

    我們在寫查詢語句的時候經常需要對查詢出來的記錄通過ORDER BY子句按照某種規則進行排序。一般情況下,我們只能把記錄都加載到內存中,再用一些排序算法,比如快速排序、歸并排序、吧啦吧啦排序等等在內存中對這些記錄進行排序,有的時候可能查詢的結果集太大以至于不能在內存中進行排序的話,還可能暫時借助磁盤的空間來存放中間結果,排序操作完成后再把排好序的結果集返回到客戶端。在MySQL中,把這種在內存中或者磁盤上進行排序的方式統稱為文件排序(英文名:filesort),跟文件這個詞兒一沾邊兒,就顯得這些排序操作非常慢了(磁盤和內存的速度比起來,就像是飛機和蝸牛的對比)。但是如果ORDER BY子句里使用到了我們的索引列,就有可能省去在內存或文件中排序的步驟,比如下邊這個簡單的查詢語句:

    SELECT * FROM person_info ORDER BY name, birthday, phone_number LIMIT 10;

    這個查詢的結果集需要先按照name值排序,如果記錄的name值相同,則需要按照birthday來排序,如果birthday的值相同,則需要按照phone_number排序。大家可以回過頭去看我們建立的idx_name_birthday_phone_number索引的示意圖,因為這個B+樹索引本身就是按照上述規則排好序的,所以直接從索引中提取數據,然后進行回表操作取出該索引中不包含的列就好了。簡單吧?是的,索引就是這么牛逼。

    使用聯合索引進行排序注意事項

    對于聯合索引有個問題需要注意,ORDER BY的子句后邊的列的順序也必須按照索引列的順序給出,如果給出ORDER BY phone_number, birthday, name的順序,那也是用不了B+樹索引,這種顛倒順序就不能使用索引的原因我們上邊詳細說過了,這就不贅述了。

    同理,ORDER BY name、ORDER BY name, birthday這種匹配索引左邊的列的形式可以使用部分的B+樹索引。當聯合索引左邊列的值為常量,也可以使用后邊的列進行排序,比如這樣:

    SELECT * FROM person_info WHERE name = 'A' ORDER BY birthday, phone_number LIMIT 10;

    這個查詢能使用聯合索引進行排序是因為name列的值相同的記錄是按照birthday, phone_number排序的,說了好多遍了都。

    2.3不可以使用索引進行排序的幾種情況

    ASC、DESC混用

    對于使用聯合索引進行排序的場景,我們要求各個排序列的排序順序是一致的,也就是要么各個列都是ASC規則排序,要么都是DESC規則排序。
    為啥會有這種奇葩規定呢?這個還得回頭想想這個idx_name_birthday_phone_number聯合索引中記錄的結構:

    • 先按照記錄的name列的值進行升序排列。
    • 如果記錄的name列的值相同,再按照birthday列的值進行升序排列。
    • 如果記錄的birthday列的值相同,再按照phone_number列的值進行升序排列。

    如果查詢中的各個排序列的排序順序是一致的,比方說下邊這兩種情況:

    • ORDER BY name, birthday LIMIT 10
      這種情況直接從索引的最左邊開始往右讀10行記錄就可以了。
    • ORDER BY name DESC, birthday DESC LIMIT 10,
      這種情況直接從索引的最右邊開始往左讀10行記錄就可以了。

    但是如果我們查詢的需求是先按照name列進行升序排列,再按照birthday列進行降序排列的話,比如說這樣的查詢語句:

    SELECT * FROM person_info ORDER BY name, birthday DESC LIMIT 10;

    這樣如果使用索引排序的話過程就是這樣的:

    • 先從索引的最左邊確定name列最小的值,然后找到name列等于該值的所有記錄,然后從name列等于該值的最右邊的那條記錄開始往左找10條記錄。
    • 如果name列等于最小的值的記錄不足10條,再繼續往右找name值第二小的記錄,重復上邊那個過程,直到找到10條記錄為止。

    累不累?累!重點是這樣不能高效使用索引,而要采取更復雜的算法去從索引中取數據,設計MySQL的大叔覺得這樣還不如直接文件排序來的快,所以就規定使用聯合索引的各個排序列的排序順序必須是一致的。

    排序列包含非同一個索引的列

    有時候用來排序的多個列不是一個索引里的,這種情況也不能使用索引進行排序,比方說:

    SELECT * FROM person_info ORDER BY name, country LIMIT 10;

    name和country并不屬于一個聯合索引中的列,所以無法使用索引進行排序,至于為啥我就不想再嘮叨了,自己用前邊的理論自己捋一捋吧~

    排序列使用了復雜的表達式

    要想使用索引進行排序操作,必須保證索引列是以單獨列的形式出現,而不是修飾過的形式,比方說這樣:

    SELECT * FROM person_info ORDER BY UPPER(name) LIMIT 10;

    使用了UPPER函數修飾過的列就不是單獨的列啦,這樣就無法使用索引進行排序啦。

    用于分組

    有時候我們為了方便統計表中的一些信息,會把表中的記錄按照某些列進行分組。比如下邊這個分組查詢:

    SELECT name, birthday, phone_number, COUNT(*) FROM person_info GROUP BY name, birthday, phone_number

    這個查詢語句相當于做了3次分組操作:

  • 先把記錄按照name值進行分組,所有name值相同的記錄劃分為一組。
  • 將每個name值相同的分組里的記錄再按照birthday的值進行分組,將birthday值相同的記錄放到一個小分組里,所以看起來就像在一個大分組里又化分了好多小分組。
  • 再將上一步中產生的小分組按照phone_number的值分成更小的分組,所以整體上看起來就像是先把記錄分成一個大分組,然后把大分組分成若干個小分組,然后把若干個小分組再細分成更多的小小分組。
  • 然后針對那些小小分組進行統計,比如在我們這個查詢語句中就是統計每個小小分組包含的記錄條數。如果沒有索引的話,這個分組過程全部需要在內存里實現,而如果有了索引的話,恰巧這個分組順序又和我們的B+樹中的索引列的順序是一致的,而我們的B+樹索引又是按照索引列排好序的,這不正好么,所以可以直接使用B+樹索引進行分組。

    和使用B+樹索引進行排序是一個道理,分組列的順序也需要和索引列的順序一致,也可以只使用索引列中左邊的列進行分組,吧啦吧啦的~

    2.4回表的代價

    上邊的討論對回表這個詞兒多是一帶而過,可能大家沒啥深刻的體會,下邊我們詳細嘮叨下。還是用idx_name_birthday_phone_number索引為例,看下邊這個查詢:

    SELECT * FROM person_info WHERE name > 'Asa' AND name < 'Barlow';

    在使用idx_name_birthday_phone_number索引進行查詢時大致可以分為這兩個步驟:

  • 從索引idx_name_birthday_phone_number對應的B+樹中取出name值在Asa~Barlow之間的用戶記錄。
  • 由于索引idx_name_birthday_phone_number對應的B+樹用戶記錄中只包含name、birthday、phone_number、id這4個字段,而查詢列表是*,意味著要查詢表中所有字段,也就是還要包括country字段。這時需要把從上一步中獲取到的每一條記錄的id字段都到聚簇索引對應的B+樹中找到完整的用戶記錄,也就是我們通常所說的回表,然后把完整的用戶記錄返回給查詢用戶。
  • 由于索引idx_name_birthday_phone_number對應的B+樹中的記錄首先會按照name列的值進行排序,所以值在Asa~Barlow之間的記錄在磁盤中的存儲是相連的,集中分布在一個或幾個數據頁中,我們可以很快的把這些連著的記錄從磁盤中讀出來,這種讀取方式我們也可以稱為順序I/O。根據第1步中獲取到的記錄的id字段的值可能并不相連,而在聚簇索引中記錄是根據id(也就是主鍵)的順序排列的,所以根據這些并不連續的id值到聚簇索引中訪問完整的用戶記錄可能分布在不同的數據頁中,這樣讀取完整的用戶記錄可能要訪問更多的數據頁,這種讀取方式我們也可以稱為隨機I/O。一般情況下,順序I/O比隨機I/O的性能高很多,所以步驟1的執行可能很快,而步驟2就慢一些。所以這個使用索引idx_name_birthday_phone_number的查詢有這么兩個特點:

    • 會使用到兩個B+樹索引,一個二級索引,一個聚簇索引。
    • 訪問二級索引使用順序I/O,訪問聚簇索引使用隨機I/O

    需要回表的記錄越多,使用二級索引的性能就越低,甚至讓某些查詢寧愿使用全表掃描也不使用二級索引。比方說name值在Asa~Barlow之間的用戶記錄數量占全部記錄數量90%以上,那么如果使用idx_name_birthday_phone_number索引的話,有90%多的id值需要回表,這不是吃力不討好么,還不如直接去掃描聚簇索引(也就是全表掃描)。

    那什么時候采用全表掃描的方式,什么時候使用采用二級索引 + 回表的方式去執行查詢呢?這個就是傳說中的查詢優化器做的工作,查詢優化器會事先對表中的記錄計算一些統計數據,然后再利用這些統計數據根據查詢的條件來計算一下需要回表的記錄數,需要回表的記錄數越多,就越傾向于使用全表掃描,反之傾向于使用二級索引 + 回表的方式。當然優化器做的分析工作不僅僅是這么簡單,但是大致上是個這個過程。一般情況下,限制查詢獲取較少的記錄數會讓優化器更傾向于選擇使用二級索引 + 回表的方式進行查詢,因為回表的記錄越少,性能提升就越高,比方說上邊的查詢可以改寫成這樣:

    SELECT * FROM person_info WHERE name > 'Asa' AND name < 'Barlow' LIMIT 10;

    添加了LIMIT 10的查詢更容易讓優化器采用二級索引 + 回表的方式進行查詢。

    對于有排序需求的查詢,上邊討論的采用全表掃描還是二級索引 + 回表的方式進行查詢的條件也是成立的,比方說下邊這個查詢:

    SELECT * FROM person_info ORDER BY name, birthday, phone_number;

    由于查詢列表是*,所以如果使用二級索引進行排序的話,需要把排序完的二級索引記錄全部進行回表操作,這樣操作的成本還不如直接遍歷聚簇索引然后再進行文件排序(filesort)低,所以優化器會傾向于使用全表掃描的方式執行查詢。如果我們加了LIMIT子句,比如這樣:

    SELECT * FROM person_info ORDER BY name, birthday, phone_number LIMIT 10;

    這樣需要回表的記錄特別少,優化器就會傾向于使用二級索引 + 回表的方式執行查詢。

    覆蓋索引

    為了徹底告別回表操作帶來的性能損耗,我們建議:最好在查詢列表里只包含索引列,比如這樣:

    SELECT name, birthday, phone_number FROM person_info WHERE name > 'Asa' AND name < 'Barlow'

    因為我們只查詢name, birthday, phone_number這三個索引列的值,所以在通過idx_name_birthday_phone_number索引得到結果后就不必到聚簇索引中再查找記錄的剩余列,也就是country列的值了,這樣就省去了回表操作帶來的性能損耗。我們把這種只需要用到索引的查詢方式稱為索引覆蓋。排序操作也優先使用覆蓋索引的方式進行查詢,比方說這個查詢:

    SELECT name, birthday, phone_number FROM person_info ORDER BY name, birthday, phone_number;

    雖然這個查詢中沒有LIMIT子句,但是采用了覆蓋索引,所以查詢優化器就會直接使用idx_name_birthday_phone_number索引進行排序而不需要回表操作了。

    當然,如果業務需要查詢出索引以外的列,那還是以保證業務需求為重。但是我們很不鼓勵用*號作為查詢列表,最好把我們需要查詢的列依次標明。

    2.5如何挑選索引

    上邊我們以idx_name_birthday_phone_number索引為例對索引的適用條件進行了詳細的嘮叨,下邊看一下我們在建立索引時或者編寫查詢語句時就應該注意的一些事項。

    只為用于搜索、排序或分組的列創建索引

    也就是說,只為出現在WHERE子句中的列、連接子句中的連接列,或者出現在ORDER BY或GROUP BY子句中的列創建索引。而出現在查詢列表中的列就沒必要建立索引了:

    SELECT birthday, country FROM person_name WHERE name = 'Ashburn';

    像查詢列表中的birthday、country這兩個列就不需要建立索引,我們只需要為出現在WHERE子句中的name列創建索引就可以了。

    考慮列的基數

    列的基數指的是某一列中不重復數據的個數,比方說某個列包含值2, 5, 8, 2, 5, 8, 2, 5, 8,雖然有9條記錄,但該列的基數卻是3。也就是說,在記錄行數一定的情況下,列的基數越大,該列中的值越分散,列的基數越小,該列中的值越集中。這個列的基數指標非常重要,直接影響我們是否能有效的利用索引。假設某個列的基數為1,也就是所有記錄在該列中的值都一樣,那為該列建立索引是沒有用的,因為所有值都一樣就無法排序,無法進行快速查找了~ 而且如果某個建立了二級索引的列的重復值特別多,那么使用這個二級索引查出的記錄還可能要做回表操作,這樣性能損耗就更大了。所以結論就是:最好為那些列的基數大的列建立索引,為基數太小列的建立索引效果可能不好

    索引列的類型盡量小

    我們在定義表結構的時候要顯式的指定列的類型,以整數類型為例,有TINYINT、MEDIUMINT、INT、BIGINT這么幾種,它們占用的存儲空間依次遞增,我們這里所說的類型大小指的就是該類型表示的數據范圍的大小。能表示的整數范圍當然也是依次遞增,如果我們想要對某個整數列建立索引的話,在表示的整數范圍允許的情況下,盡量讓索引列使用較小的類型,比如我們能使用INT就不要使用BIGINT,能使用MEDIUMINT就不要使用INT~ 這是因為:

    • 數據類型越小,在查詢時進行的比較操作越快(這是CPU層次的東東)
    • 數據類型越小,索引占用的存儲空間就越少,在一個數據頁內就可以放下更多的記錄,從而減少磁盤I/O帶來的性能損耗,也就意味著可以把更多的數據頁緩存在內存中,從而加快讀寫效率。

    這個建議對于表的主鍵來說更加適用,因為不僅是聚簇索引中會存儲主鍵值,其他所有的二級索引的節點處都會存儲一份記錄的主鍵值,如果主鍵適用更小的數據類型,也就意味著節省更多的存儲空間和更高效的I/O。

    索引字符串值的前綴

    我們知道一個字符串其實是由若干個字符組成,如果我們在MySQL中使用utf8字符集去存儲字符串的話,編碼一個字符需要占用1~3個字節。假設我們的字符串很長,那存儲一個字符串就需要占用很大的存儲空間。在我們需要為這個字符串列建立索引時,那就意味著在對應的B+樹中有這么兩個問題:

    • B+樹索引中的記錄需要把該列的完整字符串存儲起來,而且字符串越長,在索引中占用的存儲空間越大。
    • 如果B+樹索引中索引列存儲的字符串很長,那在做字符串比較時會占用更多的時間。

    我們前邊兒說過索引列的字符串前綴其實也是排好序的,所以索引的設計者提出了個方案 — 只對字符串的前幾個字符進行索引也就是說在二級索引的記錄中只保留字符串前幾個字符。這樣在查找記錄時雖然不能精確的定位到記錄的位置,但是能定位到相應前綴所在的位置,然后根據前綴相同的記錄的主鍵值回表查詢完整的字符串值,再對比就好了。這樣只在B+樹中存儲字符串的前幾個字符的編碼,既節約空間,又減少了字符串的比較時間,還大概能解決排序的問題,何樂而不為,比方說我們在建表語句中只對name列的前10個字符進行索引可以這么寫:

    CREATE TABLE person_info(name VARCHAR(100) NOT NULL,birthday DATE NOT NULL,phone_number CHAR(11) NOT NULL,country varchar(100) NOT NULL,KEY idx_name_birthday_phone_number (name(10), birthday, phone_number) );

    name(10)就表示在建立的B+樹索引中只保留記錄的前10個字符的編碼,這種只索引字符串值的前綴的策略是我們非常鼓勵的,尤其是在字符串類型能存儲的字符比較多的時候。

    索引列前綴對排序的影響

    如果使用了索引列前綴,比方說前邊只把name列的前10個字符放到了二級索引中,下邊這個查詢可能就有點兒尷尬了:

    SELECT * FROM person_info ORDER BY name LIMIT 10;

    因為二級索引中不包含完整的name列信息,所以無法對前十個字符相同,后邊的字符不同的記錄進行排序,也就是使用索引列前綴的方式無法支持使用索引排序,只好乖乖的用文件排序嘍。

    讓索引列在比較表達式中單獨出現

    假設表中有一個整數列my_col,我們為這個列建立了索引。下邊的兩個WHERE子句雖然語義是一致的,但是在效率上卻有差別:

  • WHERE my_col * 2 < 4
  • WHERE my_col < 4/2
  • 第1個WHERE子句中my_col列并不是以單獨列的形式出現的,而是以my_col * 2這樣的表達式的形式出現的,存儲引擎會依次遍歷所有的記錄,計算這個表達式的值是不是小于4,所以這種情況下是使用不到為my_col列建立的B+樹索引的。而第2個WHERE子句中my_col列并是以單獨列的形式出現的,這樣的情況可以直接使用B+樹索引。

    所以結論就是:如果索引列在比較表達式中不是以單獨列的形式出現,而是以某個表達式,或者函數調用形式出現的話,是用不到索引的。

    主鍵插入順序

    我們知道,對于一個使用InnoDB存儲引擎的表來說,在我們沒有顯式的創建索引時,表中的數據實際上都是存儲在聚簇索引的葉子節點的。而記錄又是存儲在數據頁中的,數據頁和記錄又是按照記錄主鍵值從小到大的順序進行排序,所以如果我們插入的記錄的主鍵值是依次增大的話,那我們每插滿一個數據頁就換到下一個數據頁繼續插,而如果我們插入的主鍵值忽大忽小的話,這就比較麻煩了,假設某個數據頁存儲的記錄已經滿了,它存儲的主鍵值在1~100之間:

    如果此時再插入一條主鍵值為9的記錄,那它插入的位置就如下圖:

    可這個數據頁已經滿了啊,再插進來咋辦呢?我們需要把當前頁面分裂成兩個頁面,把本頁中的一些記錄移動到新創建的這個頁中。頁面分裂和記錄移位意味著什么?意味著:性能損耗!所以如果我們想盡量避免這樣無謂的性能損耗,最好讓插入的記錄的主鍵值依次遞增,這樣就不會發生這樣的性能損耗了。所以我們建議:讓主鍵具有AUTO_INCREMENT,讓存儲引擎自己為表生成主鍵,而不是我們手動插入 ,比方說我們可以這樣定義person_info表:

    CREATE TABLE person_info(id INT UNSIGNED NOT NULL AUTO_INCREMENT,name VARCHAR(100) NOT NULL,birthday DATE NOT NULL,phone_number CHAR(11) NOT NULL,country varchar(100) NOT NULL,PRIMARY KEY (id),KEY idx_name_birthday_phone_number (name(10), birthday, phone_number) );

    我們自定義的主鍵列id擁有AUTO_INCREMENT屬性,在插入記錄時存儲引擎會自動為我們填入自增的主鍵值。

    冗余和重復索引

    有時候有的同學有意或者無意的就對同一個列創建了多個索引,比方說這樣寫建表語句:

    CREATE TABLE person_info(id INT UNSIGNED NOT NULL AUTO_INCREMENT,name VARCHAR(100) NOT NULL,birthday DATE NOT NULL,phone_number CHAR(11) NOT NULL,country varchar(100) NOT NULL,PRIMARY KEY (id),KEY idx_name_birthday_phone_number (name(10), birthday, phone_number),KEY idx_name (name(10)) );

    我們知道,通過idx_name_birthday_phone_number索引就可以對name列進行快速搜索,再創建一個專門針對name列的索引就算是一個冗余索引,維護這個索引只會增加維護的成本,并不會對搜索有什么好處。

    另一種情況,我們可能會對某個列重復建立索引,比方說這樣:

    CREATE TABLE repeat_index_demo (c1 INT PRIMARY KEY,c2 INT,UNIQUE uidx_c1 (c1),INDEX idx_c1 (c1) );

    我們看到,c1既是主鍵、又給它定義為一個唯一索引,還給它定義了一個普通索引,可是主鍵本身就會生成聚簇索引,所以定義的唯一索引和普通索引是重復的,這種情況要避免。

    2.6總結

    上邊只是我們在創建和使用B+樹索引的過程中需要注意的一些點,后邊我們還會陸續介紹更多的優化方法和注意事項,敬請期待。本集內容總結如下:

  • B+樹索引在空間和時間上都有代價,所以沒事兒別瞎建索引。

  • B+樹索引適用于下邊這些情況:

    • 全值匹配
    • 匹配左邊的列
    • 匹配范圍值
    • 精確匹配某一列并范圍匹配另外一列
    • 用于排序
    • 用于分組
  • 在使用索引時需要注意下邊這些事項:
    • 只為用于搜索、排序或分組的列創建索引
    • 為列的基數大的列創建索引
    • 索引列的類型盡量小
    • 可以只對字符串值的前綴建立索引
    • 只有索引列在比較表達式中單獨出現才可以適用索引
    • 為了盡可能少的讓聚簇索引發生頁面分裂和記錄移位的情況,建議讓主鍵擁有AUTO_INCREMENT屬性。
    • 定位并刪除表中的重復和冗余索引
    • 盡量使用覆蓋索引進行查詢,避免回表帶來的性能損耗。

    總結

    以上是生活随笔為你收集整理的B+树索引及其使用的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    精品一区二区三区无码免费视频 | 蜜桃视频插满18在线观看 | 在线观看免费人成视频 | 日日摸夜夜摸狠狠摸婷婷 | 内射老妇bbwx0c0ck | 午夜福利一区二区三区在线观看 | 九月婷婷人人澡人人添人人爽 | 黑人巨大精品欧美一区二区 | 露脸叫床粗话东北少妇 | 日韩在线不卡免费视频一区 | 免费无码一区二区三区蜜桃大 | 色综合视频一区二区三区 | 国产办公室秘书无码精品99 | 少妇性l交大片 | 亚洲色欲久久久综合网东京热 | 国产明星裸体无码xxxx视频 | 老司机亚洲精品影院 | www国产亚洲精品久久久日本 | 人妻无码αv中文字幕久久琪琪布 | 男女性色大片免费网站 | 一本大道久久东京热无码av | 日韩av无码一区二区三区 | √天堂资源地址中文在线 | 国产成人综合在线女婷五月99播放 | 一本久久伊人热热精品中文字幕 | 国产sm调教视频在线观看 | 97精品国产97久久久久久免费 | 中文字幕人成乱码熟女app | 国产精品丝袜黑色高跟鞋 | 精品久久综合1区2区3区激情 | 国产精品免费大片 | 少妇久久久久久人妻无码 | 久久亚洲精品成人无码 | 国产情侣作爱视频免费观看 | 国产精品久久久久久无码 | 国产极品美女高潮无套在线观看 | 欧美人与物videos另类 | 欧美黑人乱大交 | 日本乱人伦片中文三区 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 亚洲精品综合一区二区三区在线 | 性啪啪chinese东北女人 | 精品无码国产一区二区三区av | 久久精品丝袜高跟鞋 | 亚洲日韩av片在线观看 | 精品国产精品久久一区免费式 | 欧美日本免费一区二区三区 | 欧美性猛交xxxx富婆 | 欧美色就是色 | 熟妇人妻无乱码中文字幕 | 国产片av国语在线观看 | 无码任你躁久久久久久久 | 伊在人天堂亚洲香蕉精品区 | 亚洲国产精品一区二区第一页 | 狠狠cao日日穞夜夜穞av | 国产精品自产拍在线观看 | 国产亚洲精品精品国产亚洲综合 | www国产亚洲精品久久久日本 | 久久久久久久女国产乱让韩 | 亚洲日韩精品欧美一区二区 | 久久精品人人做人人综合 | 97精品人妻一区二区三区香蕉 | 午夜男女很黄的视频 | √天堂中文官网8在线 | 日本一卡二卡不卡视频查询 | 99久久精品无码一区二区毛片 | 欧美日本精品一区二区三区 | 夜夜高潮次次欢爽av女 | 久久精品国产一区二区三区肥胖 | 亚洲中文字幕久久无码 | 精品国产青草久久久久福利 | 动漫av一区二区在线观看 | а√天堂www在线天堂小说 | 人妻人人添人妻人人爱 | 人人妻人人澡人人爽精品欧美 | 国色天香社区在线视频 | 极品嫩模高潮叫床 | 亚洲精品国偷拍自产在线观看蜜桃 | 免费国产成人高清在线观看网站 | 欧美老妇交乱视频在线观看 | 欧美日韩一区二区免费视频 | 人妻人人添人妻人人爱 | 98国产精品综合一区二区三区 | 国产精品久久久午夜夜伦鲁鲁 | 日韩av无码一区二区三区 | www国产亚洲精品久久网站 | 欧美日本免费一区二区三区 | 牛和人交xxxx欧美 | 久久亚洲中文字幕无码 | 中文无码成人免费视频在线观看 | 妺妺窝人体色www婷婷 | 丰满少妇女裸体bbw | 国产免费久久精品国产传媒 | 日本熟妇人妻xxxxx人hd | 熟妇人妻无乱码中文字幕 | 人人澡人人透人人爽 | 99久久99久久免费精品蜜桃 | 欧美性生交活xxxxxdddd | 成人性做爰aaa片免费看不忠 | 午夜不卡av免费 一本久久a久久精品vr综合 | 中文字幕av伊人av无码av | 国产精品va在线观看无码 | 美女黄网站人色视频免费国产 | 国产69精品久久久久app下载 | 欧美阿v高清资源不卡在线播放 | 国产 精品 自在自线 | 7777奇米四色成人眼影 | 中文字幕av伊人av无码av | 丰满人妻翻云覆雨呻吟视频 | 麻豆精品国产精华精华液好用吗 | 人妻少妇被猛烈进入中文字幕 | 小泽玛莉亚一区二区视频在线 | 白嫩日本少妇做爰 | 97色伦图片97综合影院 | 成人av无码一区二区三区 | 国产超碰人人爽人人做人人添 | 亚洲自偷精品视频自拍 | 成熟人妻av无码专区 | 在线观看国产一区二区三区 | 亚洲精品国偷拍自产在线麻豆 | 在线观看免费人成视频 | 欧美熟妇另类久久久久久多毛 | 国产精品亚洲专区无码不卡 | 性色欲网站人妻丰满中文久久不卡 | 亚洲热妇无码av在线播放 | 人人爽人人澡人人高潮 | 无码帝国www无码专区色综合 | 又色又爽又黄的美女裸体网站 | 欧美第一黄网免费网站 | 影音先锋中文字幕无码 | 国产亚洲精品久久久久久久 | 国产精品手机免费 | 国产成人无码专区 | 中文字幕乱妇无码av在线 | 欧美激情一区二区三区成人 | 亚洲精品午夜国产va久久成人 | 中文字幕无码乱人伦 | 精品熟女少妇av免费观看 | 一个人看的视频www在线 | 99麻豆久久久国产精品免费 | 国产成人一区二区三区在线观看 | 国产亚av手机在线观看 | 67194成是人免费无码 | 久久精品中文闷骚内射 | 精品乱子伦一区二区三区 | 亚洲 a v无 码免 费 成 人 a v | 丰满人妻精品国产99aⅴ | 国产亚洲精品久久久久久久久动漫 | 亚洲春色在线视频 | 国产真实乱对白精彩久久 | 色婷婷av一区二区三区之红樱桃 | 内射后入在线观看一区 | 影音先锋中文字幕无码 | 无码人妻丰满熟妇区毛片18 | 亚洲精品久久久久avwww潮水 | 日日摸日日碰夜夜爽av | 国产婷婷色一区二区三区在线 | 国内老熟妇对白xxxxhd | 成人性做爰aaa片免费看 | 免费国产黄网站在线观看 | 欧美大屁股xxxxhd黑色 | 亚洲午夜无码久久 | 131美女爱做视频 | 又粗又大又硬又长又爽 | 2020久久超碰国产精品最新 | 无码国产激情在线观看 | 国产无遮挡又黄又爽免费视频 | 国产口爆吞精在线视频 | 国内精品人妻无码久久久影院蜜桃 | 午夜福利一区二区三区在线观看 | 人妻与老人中文字幕 | 色一情一乱一伦一区二区三欧美 | 国产精品久久国产精品99 | 国产精品亚洲一区二区三区喷水 | 小sao货水好多真紧h无码视频 | 捆绑白丝粉色jk震动捧喷白浆 | 成人无码精品1区2区3区免费看 | 欧美一区二区三区视频在线观看 | 夜先锋av资源网站 | 免费网站看v片在线18禁无码 | 撕开奶罩揉吮奶头视频 | 国精产品一区二区三区 | 人人妻人人澡人人爽精品欧美 | 国产精华av午夜在线观看 | 色综合久久网 | 国产精品理论片在线观看 | 成人亚洲精品久久久久 | 亚洲日本va中文字幕 | 亚洲综合久久一区二区 | 国产精品美女久久久久av爽李琼 | 亚洲精品国偷拍自产在线麻豆 | 人妻夜夜爽天天爽三区 | 欧美人与禽zoz0性伦交 | 亚洲精品www久久久 | 男人和女人高潮免费网站 | 国产三级久久久精品麻豆三级 | 国产亚洲人成在线播放 | 99久久人妻精品免费二区 | 亚洲色欲色欲欲www在线 | 无码人妻丰满熟妇区五十路百度 | 又大又硬又爽免费视频 | 免费乱码人妻系列无码专区 | 精品厕所偷拍各类美女tp嘘嘘 | a片免费视频在线观看 | 亚洲一区二区三区在线观看网站 | 亚洲狠狠婷婷综合久久 | 亚洲一区二区三区 | 国产精品亚洲综合色区韩国 | 久久精品人妻少妇一区二区三区 | 亚洲国产精品成人久久蜜臀 | 成在人线av无码免观看麻豆 | v一区无码内射国产 | 亚洲国产高清在线观看视频 | 内射老妇bbwx0c0ck | 亚洲日本va中文字幕 | 国产精品美女久久久 | 成人综合网亚洲伊人 | 无码人妻黑人中文字幕 | 久久人人爽人人人人片 | 乌克兰少妇性做爰 | 欧美 亚洲 国产 另类 | 日欧一片内射va在线影院 | 东京热无码av男人的天堂 | 亚洲精品中文字幕 | 成人欧美一区二区三区黑人免费 | 欧美三级a做爰在线观看 | 欧美肥老太牲交大战 | 国产成人综合在线女婷五月99播放 | 久久人人爽人人爽人人片av高清 | 久久精品无码一区二区三区 | 人妻与老人中文字幕 | 日本丰满熟妇videos | 久久久久se色偷偷亚洲精品av | 日本一区二区三区免费高清 | 人人爽人人澡人人高潮 | a在线观看免费网站大全 | 97夜夜澡人人双人人人喊 | 欧美成人高清在线播放 | 国产真人无遮挡作爱免费视频 | 国产精品久久久久久亚洲影视内衣 | 日本一区二区三区免费播放 | 久久精品中文闷骚内射 | 久久久成人毛片无码 | 无码人妻少妇伦在线电影 | 最新国产乱人伦偷精品免费网站 | 十八禁真人啪啪免费网站 | 三级4级全黄60分钟 | 国产成人无码av片在线观看不卡 | 国产亚洲精品久久久ai换 | 少女韩国电视剧在线观看完整 | 亚洲成a人片在线观看无码3d | 日欧一片内射va在线影院 | 亚洲一区二区三区偷拍女厕 | 东京热无码av男人的天堂 | 免费乱码人妻系列无码专区 | 国产激情一区二区三区 | 久久久久成人精品免费播放动漫 | 日日摸天天摸爽爽狠狠97 | 久久午夜无码鲁丝片 | 亚洲一区二区三区无码久久 | 夜夜躁日日躁狠狠久久av | 国产片av国语在线观看 | 午夜无码区在线观看 | 六十路熟妇乱子伦 | 日本大香伊一区二区三区 | 国产婷婷色一区二区三区在线 | 国产真实乱对白精彩久久 | 欧美日韩色另类综合 | 国产精品无码永久免费888 | 呦交小u女精品视频 | 亚洲の无码国产の无码步美 | 精品乱子伦一区二区三区 | 久久精品丝袜高跟鞋 | 女人色极品影院 | av无码电影一区二区三区 | 人人爽人人澡人人高潮 | 99精品久久毛片a片 | 国产精品久久久久无码av色戒 | 欧美真人作爱免费视频 | 久久精品国产亚洲精品 | 精品无人国产偷自产在线 | 精品国产一区二区三区四区 | 中文字幕无码乱人伦 | 丰满少妇人妻久久久久久 | 色窝窝无码一区二区三区色欲 | 国内少妇偷人精品视频 | 少妇被粗大的猛进出69影院 | av无码不卡在线观看免费 | 国产熟妇另类久久久久 | 无码乱肉视频免费大全合集 | 国产精品va在线播放 | 又黄又爽又色的视频 | 亚洲理论电影在线观看 | 久久久久久国产精品无码下载 | 无码任你躁久久久久久久 | 亚洲爆乳精品无码一区二区三区 | 四虎4hu永久免费 | 亚洲人成影院在线观看 | 粉嫩少妇内射浓精videos | 性做久久久久久久免费看 | 乱码av麻豆丝袜熟女系列 | 激情内射亚州一区二区三区爱妻 | 人人妻人人澡人人爽欧美精品 | 荫蒂被男人添的好舒服爽免费视频 | 国产精品人人爽人人做我的可爱 | 久久精品国产一区二区三区肥胖 | 日产精品高潮呻吟av久久 | 欧美大屁股xxxxhd黑色 | 强辱丰满人妻hd中文字幕 | 国产精品亚洲а∨无码播放麻豆 | 国产成人精品必看 | 亚洲国产精品无码久久久久高潮 | 欧美成人免费全部网站 | 无人区乱码一区二区三区 | 乱人伦人妻中文字幕无码 | 国产精品-区区久久久狼 | 久久亚洲国产成人精品性色 | 亚洲中文字幕av在天堂 | 熟女俱乐部五十路六十路av | 无码福利日韩神码福利片 | 对白脏话肉麻粗话av | 无码国模国产在线观看 | 人妻少妇精品无码专区二区 | 亚洲精品久久久久avwww潮水 | 四虎4hu永久免费 | 久久99精品久久久久久 | 国产另类ts人妖一区二区 | 丰满诱人的人妻3 | 久久国产精品偷任你爽任你 | 久久精品国产99久久6动漫 | 亚洲一区av无码专区在线观看 | 欧美人与禽zoz0性伦交 | 国产人妻精品一区二区三区不卡 | 亚洲国产精品无码一区二区三区 | 久久精品丝袜高跟鞋 | 国产精品久久久久久久9999 | 国产精品久久久久无码av色戒 | 欧美性生交活xxxxxdddd | 久热国产vs视频在线观看 | 欧美国产日韩久久mv | 国产 浪潮av性色四虎 | 无码帝国www无码专区色综合 | 55夜色66夜色国产精品视频 | 精品午夜福利在线观看 | 亚洲国产精品美女久久久久 | 国内揄拍国内精品少妇国语 | 国精产品一品二品国精品69xx | 无码人妻丰满熟妇区毛片18 | 亚洲乱码国产乱码精品精 | 国产小呦泬泬99精品 | 国产午夜手机精彩视频 | 成人精品视频一区二区 | 国产精品.xx视频.xxtv | 亚洲国产午夜精品理论片 | 亚洲伊人久久精品影院 | 青草青草久热国产精品 | 亚洲自偷精品视频自拍 | 日韩亚洲欧美中文高清在线 | 亚洲自偷自偷在线制服 | 久久久久成人精品免费播放动漫 | 精品日本一区二区三区在线观看 | 久久久久se色偷偷亚洲精品av | 国产成人精品久久亚洲高清不卡 | 欧美人与动性行为视频 | 国产精品手机免费 | 高清国产亚洲精品自在久久 | 国产精品久久久一区二区三区 | 四虎影视成人永久免费观看视频 | 男人的天堂av网站 | 亚洲欧美精品aaaaaa片 | 无码人妻丰满熟妇区五十路百度 | 国产又爽又黄又刺激的视频 | 亚洲s色大片在线观看 | 男女下面进入的视频免费午夜 | 婷婷五月综合激情中文字幕 | www国产亚洲精品久久久日本 | 玩弄少妇高潮ⅹxxxyw | 成人无码精品1区2区3区免费看 | 狠狠综合久久久久综合网 | 中文字幕乱码人妻无码久久 | 久久人人爽人人爽人人片ⅴ | 亚洲啪av永久无码精品放毛片 | 亲嘴扒胸摸屁股激烈网站 | 日韩人妻少妇一区二区三区 | 97人妻精品一区二区三区 | 精品午夜福利在线观看 | 日韩亚洲欧美中文高清在线 | 国产成人一区二区三区别 | 荡女精品导航 | 亚洲成色在线综合网站 | 少女韩国电视剧在线观看完整 | 国产乡下妇女做爰 | 国产精品爱久久久久久久 | 97色伦图片97综合影院 | 99久久精品日本一区二区免费 | 成 人 免费观看网站 | 色婷婷av一区二区三区之红樱桃 | 天干天干啦夜天干天2017 | 亚洲理论电影在线观看 | 精品乱码久久久久久久 | 国产免费观看黄av片 | 精品人人妻人人澡人人爽人人 | 亚洲精品成人av在线 | 国产熟女一区二区三区四区五区 | 中文字幕无码免费久久9一区9 | 18禁黄网站男男禁片免费观看 | 国产综合色产在线精品 | 精品午夜福利在线观看 | 欧美精品一区二区精品久久 | 中文字幕 亚洲精品 第1页 | 亚洲日本va午夜在线电影 | 中文字幕乱码亚洲无线三区 | 久久精品成人欧美大片 | 亚洲欧洲中文日韩av乱码 | 国产精品igao视频网 | 99精品久久毛片a片 | 亚洲伊人久久精品影院 | 国产又爽又黄又刺激的视频 | √天堂中文官网8在线 | 性生交大片免费看女人按摩摩 | 少妇一晚三次一区二区三区 | 98国产精品综合一区二区三区 | 99在线 | 亚洲 | av在线亚洲欧洲日产一区二区 | 男女下面进入的视频免费午夜 | 色综合久久中文娱乐网 | 人妻无码αv中文字幕久久琪琪布 | 亚洲精品综合一区二区三区在线 | 久久精品女人天堂av免费观看 | 人妻插b视频一区二区三区 | 在线观看免费人成视频 | 欧美一区二区三区视频在线观看 | 久久这里只有精品视频9 | 亚洲色欲久久久综合网东京热 | 亚洲成色在线综合网站 | 福利一区二区三区视频在线观看 | 成人免费视频视频在线观看 免费 | 丁香啪啪综合成人亚洲 | 精品久久综合1区2区3区激情 | 在教室伦流澡到高潮hnp视频 | 国产疯狂伦交大片 | 国产亚洲视频中文字幕97精品 | 一区二区三区高清视频一 | 全黄性性激高免费视频 | 国产区女主播在线观看 | 老子影院午夜伦不卡 | 国产成人精品必看 | 麻豆md0077饥渴少妇 | 波多野结衣一区二区三区av免费 | 99久久精品午夜一区二区 | 国产婷婷色一区二区三区在线 | 国产极品美女高潮无套在线观看 | 欧美午夜特黄aaaaaa片 | 中文无码伦av中文字幕 | 亚洲一区二区三区 | 久久精品无码一区二区三区 | 国产人妻久久精品二区三区老狼 | 国产无遮挡又黄又爽免费视频 | 国产乱子伦视频在线播放 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 黑森林福利视频导航 | 老熟女乱子伦 | 欧美freesex黑人又粗又大 | 国产香蕉尹人视频在线 | 亚洲色欲色欲天天天www | 性色欲网站人妻丰满中文久久不卡 | 中文字幕无码人妻少妇免费 | 最新国产乱人伦偷精品免费网站 | 亚洲呦女专区 | 中文字幕日韩精品一区二区三区 | 人妻夜夜爽天天爽三区 | 国产精品沙发午睡系列 | 国产99久久精品一区二区 | 少妇被黑人到高潮喷出白浆 | 欧美亚洲国产一区二区三区 | 亚洲一区av无码专区在线观看 | 狠狠综合久久久久综合网 | 日日摸天天摸爽爽狠狠97 | 亚洲成色在线综合网站 | 人人爽人人爽人人片av亚洲 | 精品一区二区不卡无码av | 天天综合网天天综合色 | 久久熟妇人妻午夜寂寞影院 | 无遮挡国产高潮视频免费观看 | 亚洲大尺度无码无码专区 | 无码人妻av免费一区二区三区 | 玩弄人妻少妇500系列视频 | 国产成人精品视频ⅴa片软件竹菊 | 台湾无码一区二区 | 狠狠综合久久久久综合网 | 亚洲中文字幕乱码av波多ji | 国产精品多人p群无码 | 久热国产vs视频在线观看 | 国产情侣作爱视频免费观看 | 丝袜足控一区二区三区 | 亚洲爆乳无码专区 | 97精品国产97久久久久久免费 | 欧美阿v高清资源不卡在线播放 | 人人超人人超碰超国产 | 欧美 日韩 人妻 高清 中文 | 1000部啪啪未满十八勿入下载 | 人妻少妇精品无码专区二区 | 4hu四虎永久在线观看 | 人妻少妇精品无码专区二区 | aⅴ亚洲 日韩 色 图网站 播放 | 天天爽夜夜爽夜夜爽 | 国产莉萝无码av在线播放 | 一本精品99久久精品77 | 国精产品一品二品国精品69xx | 国产内射爽爽大片视频社区在线 | 亚洲 a v无 码免 费 成 人 a v | 好爽又高潮了毛片免费下载 | 国产精品嫩草久久久久 | 日日躁夜夜躁狠狠躁 | 99久久婷婷国产综合精品青草免费 | 久久精品女人天堂av免费观看 | 亚洲欧美日韩国产精品一区二区 | 亚洲中文字幕av在天堂 | 国产精品二区一区二区aⅴ污介绍 | 成人免费视频在线观看 | 亚洲人成影院在线观看 | 强伦人妻一区二区三区视频18 | 日本爽爽爽爽爽爽在线观看免 | 免费人成在线观看网站 | 国产乱人无码伦av在线a | 红桃av一区二区三区在线无码av | 国产精品久久国产三级国 | 无码av最新清无码专区吞精 | 久久亚洲a片com人成 | 精品无码成人片一区二区98 | 精品国偷自产在线视频 | 丝袜 中出 制服 人妻 美腿 | 中文字幕av无码一区二区三区电影 | 丝袜人妻一区二区三区 | 日韩精品成人一区二区三区 | 免费看男女做好爽好硬视频 | 精品偷自拍另类在线观看 | 精品熟女少妇av免费观看 | 久久久久成人精品免费播放动漫 | 国产一区二区三区四区五区加勒比 | 国产精品香蕉在线观看 | 人妻少妇精品久久 | 国产xxx69麻豆国语对白 | 天天拍夜夜添久久精品 | 欧美三级a做爰在线观看 | 亚洲乱码中文字幕在线 | 欧美午夜特黄aaaaaa片 | 久久亚洲中文字幕精品一区 | 3d动漫精品啪啪一区二区中 | 99精品无人区乱码1区2区3区 | 夜夜夜高潮夜夜爽夜夜爰爰 | 老子影院午夜精品无码 | 国产欧美亚洲精品a | 免费无码肉片在线观看 | 天堂在线观看www | 久久精品99久久香蕉国产色戒 | 日本精品少妇一区二区三区 | 日本精品久久久久中文字幕 | 无码av中文字幕免费放 | 国产无av码在线观看 | 亚洲精品欧美二区三区中文字幕 | 无码吃奶揉捏奶头高潮视频 | 97久久超碰中文字幕 | 国产人妻久久精品二区三区老狼 | 免费人成在线观看网站 | 99国产欧美久久久精品 | 纯爱无遮挡h肉动漫在线播放 | 窝窝午夜理论片影院 | 三上悠亚人妻中文字幕在线 | 亚洲国产高清在线观看视频 | 国产性生大片免费观看性 | 国产女主播喷水视频在线观看 | 中文字幕+乱码+中文字幕一区 | 亚洲欧美色中文字幕在线 | 国产麻豆精品一区二区三区v视界 | 福利一区二区三区视频在线观看 | 男女性色大片免费网站 | 欧洲熟妇精品视频 | 熟女少妇人妻中文字幕 | 亚洲理论电影在线观看 | 一本无码人妻在中文字幕免费 | 亚洲a无码综合a国产av中文 | 亚洲一区av无码专区在线观看 | 国产又粗又硬又大爽黄老大爷视 | 99在线 | 亚洲 | 国产激情综合五月久久 | 精品人人妻人人澡人人爽人人 | 日日噜噜噜噜夜夜爽亚洲精品 | 精品无码国产一区二区三区av | 伊在人天堂亚洲香蕉精品区 | 青春草在线视频免费观看 | 97久久超碰中文字幕 | 野狼第一精品社区 | 亚洲综合无码久久精品综合 | 日本护士毛茸茸高潮 | 男女爱爱好爽视频免费看 | 少妇高潮喷潮久久久影院 | 久久精品国产一区二区三区 | 国产精品第一国产精品 | 天天摸天天碰天天添 | 超碰97人人做人人爱少妇 | 内射老妇bbwx0c0ck | 亚洲精品国偷拍自产在线观看蜜桃 | 野外少妇愉情中文字幕 | 夜夜躁日日躁狠狠久久av | 中文字幕中文有码在线 | 成熟女人特级毛片www免费 | 久青草影院在线观看国产 | 无遮挡啪啪摇乳动态图 | 青春草在线视频免费观看 | 在线观看国产一区二区三区 | 久久亚洲精品中文字幕无男同 | 久激情内射婷内射蜜桃人妖 | 欧美性生交xxxxx久久久 | 久久精品国产日本波多野结衣 | 久久久亚洲欧洲日产国码αv | 沈阳熟女露脸对白视频 | 精品国产一区二区三区av 性色 | 精品乱码久久久久久久 | 樱花草在线播放免费中文 | 国产精品a成v人在线播放 | 日日碰狠狠丁香久燥 | 玩弄少妇高潮ⅹxxxyw | 色窝窝无码一区二区三区色欲 | 欧美 日韩 人妻 高清 中文 | 国产偷抇久久精品a片69 | 精品欧洲av无码一区二区三区 | 无码播放一区二区三区 | 亚洲自偷自拍另类第1页 | 亚洲一区二区三区香蕉 | 日日干夜夜干 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 图片小说视频一区二区 | 亚洲乱码日产精品bd | 亚洲呦女专区 | 国产精品多人p群无码 | 免费人成在线视频无码 | 亚洲综合无码久久精品综合 | 少妇太爽了在线观看 | 人妻尝试又大又粗久久 | 久久精品国产日本波多野结衣 | 欧美精品国产综合久久 | 中文精品无码中文字幕无码专区 | 中文字幕中文有码在线 | 大地资源网第二页免费观看 | 免费无码的av片在线观看 | 免费国产成人高清在线观看网站 | 亲嘴扒胸摸屁股激烈网站 | 亚洲日韩av片在线观看 | 中文字幕 亚洲精品 第1页 | 55夜色66夜色国产精品视频 | 东北女人啪啪对白 | 国产成人无码a区在线观看视频app | 亚洲 高清 成人 动漫 | 色综合久久88色综合天天 | 日韩精品a片一区二区三区妖精 | 最近的中文字幕在线看视频 | 久久精品国产一区二区三区肥胖 | 中文字幕 人妻熟女 | 国精品人妻无码一区二区三区蜜柚 | 亚洲gv猛男gv无码男同 | 国产卡一卡二卡三 | 我要看www免费看插插视频 | 丝袜 中出 制服 人妻 美腿 | 国产精品爱久久久久久久 | 亚洲欧洲无卡二区视頻 | 成人一在线视频日韩国产 | 蜜桃视频韩日免费播放 | 水蜜桃亚洲一二三四在线 | 黑人巨大精品欧美一区二区 | 欧美兽交xxxx×视频 | 亚洲国产精品一区二区美利坚 | 亚洲精品一区二区三区四区五区 | 亚洲色欲久久久综合网东京热 | 精品亚洲韩国一区二区三区 | 亚洲乱码国产乱码精品精 | 在线播放免费人成毛片乱码 | 欧美 日韩 亚洲 在线 | 亚洲一区二区三区香蕉 | 国产内射爽爽大片视频社区在线 | 欧洲美熟女乱又伦 | 大肉大捧一进一出视频出来呀 | 内射后入在线观看一区 | 亚洲成av人片天堂网无码】 | 一区二区传媒有限公司 | 老司机亚洲精品影院 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 国产一精品一av一免费 | 丰满少妇高潮惨叫视频 | 少妇高潮一区二区三区99 | 永久免费观看美女裸体的网站 | 色情久久久av熟女人妻网站 | 欧美喷潮久久久xxxxx | a片在线免费观看 | 人人爽人人澡人人高潮 | 99久久精品日本一区二区免费 | 久9re热视频这里只有精品 | 欧美激情综合亚洲一二区 | 一本精品99久久精品77 | 久久天天躁夜夜躁狠狠 | 国产在线aaa片一区二区99 | 精品人妻人人做人人爽夜夜爽 | 国产成人一区二区三区别 | 老司机亚洲精品影院无码 | 午夜时刻免费入口 | 国产精品久久久久久亚洲影视内衣 | 波多野结衣av在线观看 | 成人欧美一区二区三区黑人 | 亚洲国产精品久久久天堂 | 精品一区二区三区无码免费视频 | 纯爱无遮挡h肉动漫在线播放 | 亚洲精品一区二区三区婷婷月 | 扒开双腿疯狂进出爽爽爽视频 | 18禁止看的免费污网站 | 乱人伦人妻中文字幕无码 | 亚洲人成影院在线观看 | 久久99精品国产麻豆蜜芽 | 国产精品无码久久av | 国精产品一区二区三区 | 亚洲精品久久久久久一区二区 | 天堂亚洲2017在线观看 | 国产艳妇av在线观看果冻传媒 | 中文字幕乱码人妻无码久久 | 99久久精品午夜一区二区 | 成人欧美一区二区三区黑人免费 | 老头边吃奶边弄进去呻吟 | 欧美日韩在线亚洲综合国产人 | 男女猛烈xx00免费视频试看 | 欧美性生交活xxxxxdddd | 日本大香伊一区二区三区 | 国产一区二区不卡老阿姨 | 2019nv天堂香蕉在线观看 | 无套内谢老熟女 | 国产成人精品久久亚洲高清不卡 | 中文字幕久久久久人妻 | 给我免费的视频在线观看 | 国产农村妇女高潮大叫 | 成人综合网亚洲伊人 | 精品国产成人一区二区三区 | 97久久国产亚洲精品超碰热 | 欧美成人午夜精品久久久 | 中文字幕无码免费久久99 | 久久久久久国产精品无码下载 | 精品国产一区二区三区av 性色 | 精品国产一区二区三区四区 | 中文字幕乱码亚洲无线三区 | 国产亚洲欧美日韩亚洲中文色 | 免费网站看v片在线18禁无码 | 久久久久久久久888 | 亚洲国产精品毛片av不卡在线 | 日本精品高清一区二区 | 丝袜人妻一区二区三区 | 色一情一乱一伦 | 黑人大群体交免费视频 | 乌克兰少妇性做爰 | 欧美激情一区二区三区成人 | 国产亚洲tv在线观看 | 在线 国产 欧美 亚洲 天堂 | 亚洲精品美女久久久久久久 | 国产精品国产自线拍免费软件 | 人妻夜夜爽天天爽三区 | 鲁鲁鲁爽爽爽在线视频观看 | 精品无码国产自产拍在线观看蜜 | 老头边吃奶边弄进去呻吟 | 天堂在线观看www | 日日橹狠狠爱欧美视频 | 内射欧美老妇wbb | 日本熟妇乱子伦xxxx | 又大又硬又爽免费视频 | 久久天天躁狠狠躁夜夜免费观看 | 国产精品久久久久久亚洲影视内衣 | 国产精品美女久久久久av爽李琼 | 爱做久久久久久 | 欧美真人作爱免费视频 | 色欲av亚洲一区无码少妇 | 一本加勒比波多野结衣 | 精品国产乱码久久久久乱码 | 中文字幕乱码中文乱码51精品 | 久久aⅴ免费观看 | 亚洲国产日韩a在线播放 | 国产亚洲精品久久久久久国模美 | 51国偷自产一区二区三区 | 亚洲精品一区二区三区四区五区 | 亚洲国产综合无码一区 | 国产9 9在线 | 中文 | 中文毛片无遮挡高清免费 | 少妇高潮喷潮久久久影院 | 免费无码午夜福利片69 | 欧洲精品码一区二区三区免费看 | 美女张开腿让人桶 | 人妻人人添人妻人人爱 | 亚洲の无码国产の无码影院 | 欧美熟妇另类久久久久久不卡 | 亚洲中文字幕在线无码一区二区 | 久久久久99精品成人片 | 亚洲精品国产a久久久久久 | 欧美人与禽猛交狂配 | 国内综合精品午夜久久资源 | 熟妇人妻无乱码中文字幕 | 青青青爽视频在线观看 | 狠狠躁日日躁夜夜躁2020 | 丰满少妇熟乱xxxxx视频 | 麻豆精品国产精华精华液好用吗 | 欧洲欧美人成视频在线 | 丰满人妻被黑人猛烈进入 | 色噜噜亚洲男人的天堂 | 亚洲区欧美区综合区自拍区 | 日韩精品一区二区av在线 | 精品偷拍一区二区三区在线看 | 久久久久久亚洲精品a片成人 | 人妻无码αv中文字幕久久琪琪布 | 久久国产劲爆∧v内射 | 国产精品怡红院永久免费 | 亚洲一区二区三区国产精华液 | 久久久久免费看成人影片 | 一本无码人妻在中文字幕免费 | 福利一区二区三区视频在线观看 | 国产免费无码一区二区视频 | 国产热a欧美热a在线视频 | 99久久久无码国产aaa精品 | 日韩精品无码免费一区二区三区 | 欧美变态另类xxxx | av无码不卡在线观看免费 | 中文字幕av无码一区二区三区电影 | 男女爱爱好爽视频免费看 | 男人扒开女人内裤强吻桶进去 | 99re在线播放 | 国产精品久久久 | 精品一二三区久久aaa片 | 亚洲日韩av片在线观看 | 性色av无码免费一区二区三区 | 色综合视频一区二区三区 | 秋霞特色aa大片 | 国产精品久久久av久久久 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 日韩欧美中文字幕在线三区 | 久久亚洲中文字幕精品一区 | www国产亚洲精品久久久日本 | 正在播放老肥熟妇露脸 | 亚洲爆乳大丰满无码专区 | 亚洲精品国产第一综合99久久 | 大地资源网第二页免费观看 | 麻豆国产丝袜白领秘书在线观看 | 中文字幕av无码一区二区三区电影 | 日本乱偷人妻中文字幕 | 久久久久久久女国产乱让韩 | 国产午夜福利亚洲第一 | 在线视频网站www色 | 乱码午夜-极国产极内射 | 国产精品久久久久久久影院 | 久久精品中文字幕一区 | 综合激情五月综合激情五月激情1 | 欧美成人免费全部网站 | 一本色道久久综合狠狠躁 | 我要看www免费看插插视频 | 精品人妻人人做人人爽夜夜爽 | 青春草在线视频免费观看 | 九九久久精品国产免费看小说 | 久久久久成人精品免费播放动漫 | 成人精品天堂一区二区三区 | 国产亚洲精品久久久ai换 | 男人扒开女人内裤强吻桶进去 | 澳门永久av免费网站 | 亚洲 高清 成人 动漫 | 97se亚洲精品一区 | 精品久久久久香蕉网 | 国产精品99久久精品爆乳 | 欧美日韩一区二区免费视频 | 99久久久无码国产精品免费 | 人妻无码久久精品人妻 | 性色av无码免费一区二区三区 | 成人免费视频视频在线观看 免费 | 精品乱子伦一区二区三区 | 午夜熟女插插xx免费视频 | 日韩少妇白浆无码系列 | 国产小呦泬泬99精品 | 性做久久久久久久久 | 亚洲精品综合五月久久小说 | 人妻少妇精品视频专区 | 国产av久久久久精东av | 亚洲男女内射在线播放 | 免费无码一区二区三区蜜桃大 | 东京无码熟妇人妻av在线网址 | 九九综合va免费看 | 99久久精品无码一区二区毛片 | 性色欲情网站iwww九文堂 | 国语精品一区二区三区 | 国产精品无码久久av | 东京热男人av天堂 | 纯爱无遮挡h肉动漫在线播放 | aⅴ亚洲 日韩 色 图网站 播放 | 露脸叫床粗话东北少妇 | 日韩无套无码精品 | 国产亚洲日韩欧美另类第八页 | 国产精品久久久久久亚洲毛片 | 国内精品久久久久久中文字幕 | аⅴ资源天堂资源库在线 | 久久精品国产一区二区三区肥胖 | 一区二区三区乱码在线 | 欧洲 | 亚洲中文字幕无码一久久区 | 97久久超碰中文字幕 | 久久精品国产亚洲精品 | 成年美女黄网站色大免费全看 | 一本久道高清无码视频 | 97夜夜澡人人双人人人喊 | 亚洲精品国产a久久久久久 | 无码国产色欲xxxxx视频 | 国产精品久久久久久亚洲影视内衣 | 国产免费无码一区二区视频 | 7777奇米四色成人眼影 | 丰满岳乱妇在线观看中字无码 | 精品一区二区不卡无码av | 色 综合 欧美 亚洲 国产 | 久久精品国产精品国产精品污 | 亚洲成在人网站无码天堂 | 国产婷婷色一区二区三区在线 | 99精品无人区乱码1区2区3区 | 久久久久免费看成人影片 | 少妇人妻偷人精品无码视频 | 精品人妻中文字幕有码在线 | 性生交大片免费看女人按摩摩 | 日本一卡2卡3卡四卡精品网站 | 伊人久久大香线蕉亚洲 | 久久精品中文字幕大胸 | 无码国产激情在线观看 | 亚洲欧美国产精品专区久久 | 亚洲色成人中文字幕网站 | 青春草在线视频免费观看 | 亚洲精品欧美二区三区中文字幕 | 久久久久久久久蜜桃 | 黑人大群体交免费视频 | 久久精品国产日本波多野结衣 | 精品久久久中文字幕人妻 | 人人妻人人澡人人爽欧美一区九九 | 亚洲一区二区三区国产精华液 | 美女黄网站人色视频免费国产 | 丰满人妻翻云覆雨呻吟视频 | 天堂久久天堂av色综合 | 国产绳艺sm调教室论坛 | 午夜无码区在线观看 | 久久精品丝袜高跟鞋 | 国产成人精品一区二区在线小狼 | 红桃av一区二区三区在线无码av | 久久久亚洲欧洲日产国码αv | 国产精品资源一区二区 | 精品乱码久久久久久久 | 国产黑色丝袜在线播放 | 99久久人妻精品免费一区 | 欧美日韩一区二区综合 | 久久国产精品萌白酱免费 | 亚洲色在线无码国产精品不卡 | 丰满妇女强制高潮18xxxx | 久久久成人毛片无码 | 国产精品久久国产精品99 | 亚洲欧洲日本无在线码 | 国产成人精品无码播放 | 无码纯肉视频在线观看 | 色婷婷av一区二区三区之红樱桃 | 亚洲日本一区二区三区在线 | 国产农村乱对白刺激视频 | 国产卡一卡二卡三 | аⅴ资源天堂资源库在线 | 亚洲国产精品无码一区二区三区 | 国产成人综合美国十次 | 无码一区二区三区在线观看 | 久久人人爽人人人人片 | 精品厕所偷拍各类美女tp嘘嘘 | 国产精品久久久久久久9999 | 日韩精品成人一区二区三区 | 久久久久久久久888 | 偷窥村妇洗澡毛毛多 | 少妇一晚三次一区二区三区 | 人妻无码αv中文字幕久久琪琪布 | 西西人体www44rt大胆高清 | 亚洲娇小与黑人巨大交 | 高潮毛片无遮挡高清免费 | 中文无码成人免费视频在线观看 | 久久婷婷五月综合色国产香蕉 | 欧美高清在线精品一区 | 日日橹狠狠爱欧美视频 | 成人精品视频一区二区三区尤物 | 一本无码人妻在中文字幕免费 | 免费看男女做好爽好硬视频 | 99久久人妻精品免费一区 | 真人与拘做受免费视频 | 人妻无码久久精品人妻 | 欧美怡红院免费全部视频 | 成人性做爰aaa片免费看不忠 | 成人亚洲精品久久久久软件 | 日韩视频 中文字幕 视频一区 | 97se亚洲精品一区 | 亚洲中文字幕无码中字 | 55夜色66夜色国产精品视频 | 国产精品久久久久久亚洲影视内衣 | 大胆欧美熟妇xx | 亚洲综合精品香蕉久久网 | 日韩欧美群交p片內射中文 | 国产激情无码一区二区app | 亚洲 另类 在线 欧美 制服 | 亚洲自偷精品视频自拍 | 无码国内精品人妻少妇 | 丰满肥臀大屁股熟妇激情视频 | 天天爽夜夜爽夜夜爽 | 国产成人人人97超碰超爽8 | 精品aⅴ一区二区三区 | 天天燥日日燥 | 亚洲精品一区二区三区婷婷月 | 熟妇人妻中文av无码 | 无码帝国www无码专区色综合 | 无码人妻丰满熟妇区毛片18 | 国产黄在线观看免费观看不卡 | 亚洲va中文字幕无码久久不卡 | 精品国产成人一区二区三区 | 夫妻免费无码v看片 | 天堂在线观看www | 人妻尝试又大又粗久久 | 两性色午夜视频免费播放 | 正在播放老肥熟妇露脸 | 丰满肥臀大屁股熟妇激情视频 | 2020最新国产自产精品 | 国产成人一区二区三区别 | 4hu四虎永久在线观看 | 免费观看又污又黄的网站 | 曰本女人与公拘交酡免费视频 | 欧洲精品码一区二区三区免费看 | 国产精品99久久精品爆乳 | 国产又粗又硬又大爽黄老大爷视 | 女人高潮内射99精品 | 国产精品欧美成人 | 又紧又大又爽精品一区二区 | 国产精品怡红院永久免费 | 撕开奶罩揉吮奶头视频 | 欧洲vodafone精品性 | 久久99国产综合精品 | 女人被男人爽到呻吟的视频 | 理论片87福利理论电影 | 国产精品毛片一区二区 | 最新国产乱人伦偷精品免费网站 | 国模大胆一区二区三区 | 久久无码人妻影院 | 爆乳一区二区三区无码 | 天堂а√在线中文在线 | 玩弄少妇高潮ⅹxxxyw | 亚洲成a人一区二区三区 | 国产精品亚洲lv粉色 | 国产精品久久国产三级国 | 无码福利日韩神码福利片 | 久久综合色之久久综合 | 好爽又高潮了毛片免费下载 | 欧美成人高清在线播放 | 日本一区二区三区免费播放 | 久久精品国产99久久6动漫 | 青草青草久热国产精品 | 捆绑白丝粉色jk震动捧喷白浆 | 一本久久a久久精品vr综合 | 日欧一片内射va在线影院 | 国色天香社区在线视频 | 欧美肥老太牲交大战 | 九九在线中文字幕无码 | 性欧美疯狂xxxxbbbb | 久久久av男人的天堂 | 免费看男女做好爽好硬视频 | 亚洲va欧美va天堂v国产综合 | 日韩av无码一区二区三区不卡 | 扒开双腿吃奶呻吟做受视频 | 午夜熟女插插xx免费视频 | 全黄性性激高免费视频 | 捆绑白丝粉色jk震动捧喷白浆 | 亚洲午夜福利在线观看 | 国产成人久久精品流白浆 | 1000部啪啪未满十八勿入下载 | 丝袜足控一区二区三区 | 亚洲欧美国产精品专区久久 | 免费国产成人高清在线观看网站 | 午夜性刺激在线视频免费 | 日日噜噜噜噜夜夜爽亚洲精品 | 狠狠躁日日躁夜夜躁2020 | 色综合久久久无码网中文 | 99久久人妻精品免费一区 | 欧美真人作爱免费视频 | 少妇性俱乐部纵欲狂欢电影 | 亚洲日本va中文字幕 | 久久久久99精品国产片 | 亚洲熟妇色xxxxx欧美老妇 | 狠狠色噜噜狠狠狠7777奇米 | 免费无码一区二区三区蜜桃大 | 色婷婷综合激情综在线播放 | 亚洲国产午夜精品理论片 | 在线观看国产午夜福利片 | 丁香花在线影院观看在线播放 | 久久国产自偷自偷免费一区调 | 女人和拘做爰正片视频 | 天海翼激烈高潮到腰振不止 | 波多野结衣av一区二区全免费观看 | 亚洲男女内射在线播放 | 又大又硬又爽免费视频 | 国产精品无码久久av | 午夜福利一区二区三区在线观看 | 日韩在线不卡免费视频一区 | 香蕉久久久久久av成人 | 国产激情精品一区二区三区 | 国产sm调教视频在线观看 | 日本高清一区免费中文视频 | 亚洲欧洲日本综合aⅴ在线 | 亚洲国产精华液网站w | 欧美日韩色另类综合 | 中文字幕av伊人av无码av | 久久午夜夜伦鲁鲁片无码免费 | 欧美猛少妇色xxxxx | 四虎永久在线精品免费网址 | 婷婷五月综合激情中文字幕 | 久久99精品久久久久久动态图 | 99久久精品国产一区二区蜜芽 | 少妇无码av无码专区在线观看 | 欧美日韩一区二区免费视频 | a国产一区二区免费入口 | 无码国产激情在线观看 | 国产精品久久久久9999小说 | 久久亚洲日韩精品一区二区三区 | 无码福利日韩神码福利片 | 97se亚洲精品一区 | 欧美国产日产一区二区 | 国产精品a成v人在线播放 | 久青草影院在线观看国产 | 少妇被黑人到高潮喷出白浆 | 人人妻人人澡人人爽欧美精品 | 久久午夜夜伦鲁鲁片无码免费 | 亚洲精品无码人妻无码 | 麻豆蜜桃av蜜臀av色欲av | 亚洲中文字幕久久无码 | 久久这里只有精品视频9 | 无套内谢老熟女 | 领导边摸边吃奶边做爽在线观看 | 欧美 日韩 人妻 高清 中文 | 永久黄网站色视频免费直播 | 在线观看国产一区二区三区 | 1000部夫妻午夜免费 | 娇妻被黑人粗大高潮白浆 | 亚洲日本va中文字幕 | 永久免费观看国产裸体美女 | 99riav国产精品视频 | 丝袜美腿亚洲一区二区 | 天天躁夜夜躁狠狠是什么心态 | 国产福利视频一区二区 | 精品久久久无码中文字幕 | 色一情一乱一伦一视频免费看 | 日本大香伊一区二区三区 | 人妻少妇被猛烈进入中文字幕 | 少妇久久久久久人妻无码 | 美女极度色诱视频国产 | 牲交欧美兽交欧美 | 又色又爽又黄的美女裸体网站 | 熟妇女人妻丰满少妇中文字幕 | 丁香花在线影院观看在线播放 | 国产精品对白交换视频 | 精品一二三区久久aaa片 | 天堂一区人妻无码 | 国产高清不卡无码视频 | 国产一精品一av一免费 | 国产激情综合五月久久 | 久青草影院在线观看国产 | 久久婷婷五月综合色国产香蕉 | 国产色xx群视频射精 | 国产农村乱对白刺激视频 | 亚洲国产欧美国产综合一区 | 久在线观看福利视频 | √8天堂资源地址中文在线 | 久久久精品人妻久久影视 | 国产极品视觉盛宴 | 欧美变态另类xxxx | 国内精品久久久久久中文字幕 | 中文字幕日产无线码一区 | 九月婷婷人人澡人人添人人爽 | 国语精品一区二区三区 | 桃花色综合影院 | 国产精品国产三级国产专播 | 精品久久久无码人妻字幂 | 特大黑人娇小亚洲女 | 亚洲精品一区二区三区婷婷月 | 性色av无码免费一区二区三区 | 樱花草在线社区www | 亚洲男人av天堂午夜在 | 色 综合 欧美 亚洲 国产 | 国产成人一区二区三区别 | 久久久久成人片免费观看蜜芽 | 亚洲一区二区三区偷拍女厕 | 欧美一区二区三区 | 精品无码一区二区三区的天堂 | 日本免费一区二区三区最新 | 国产一区二区三区影院 | 亚洲国产高清在线观看视频 | 亚洲精品综合五月久久小说 | 18禁止看的免费污网站 | 十八禁视频网站在线观看 | 久久人人爽人人爽人人片av高清 | 精品一区二区不卡无码av | 欧美黑人巨大xxxxx | 国产香蕉尹人视频在线 | 亚洲aⅴ无码成人网站国产app | 国产精品美女久久久久av爽李琼 | 人妻无码αv中文字幕久久琪琪布 | 动漫av一区二区在线观看 | 亚洲精品久久久久avwww潮水 | 国产在线无码精品电影网 | 精品人人妻人人澡人人爽人人 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 精品久久久久久亚洲精品 | 国产内射老熟女aaaa | 国内老熟妇对白xxxxhd | 国产人妖乱国产精品人妖 | 免费人成在线视频无码 | 国产精品国产三级国产专播 | 久久天天躁夜夜躁狠狠 | 亚洲gv猛男gv无码男同 | 亚洲日韩av一区二区三区四区 | 国产又爽又猛又粗的视频a片 | 亚洲精品国产精品乱码视色 | 日韩精品成人一区二区三区 | 亚洲人成网站色7799 | 国产人妻人伦精品 | 一本一道久久综合久久 | 玩弄人妻少妇500系列视频 | 国产午夜福利100集发布 | 欧美人妻一区二区三区 | 亚洲午夜福利在线观看 | 国产后入清纯学生妹 | 国产精品久久久久无码av色戒 | 色欲久久久天天天综合网精品 | 亚洲日韩中文字幕在线播放 | 欧美三级a做爰在线观看 | 国产亚洲精品久久久久久久久动漫 | 精品久久久久久人妻无码中文字幕 | 精品日本一区二区三区在线观看 | 久久久久久a亚洲欧洲av冫 | 超碰97人人射妻 | 人人爽人人爽人人片av亚洲 | 成人免费视频视频在线观看 免费 | 亚洲综合久久一区二区 | 捆绑白丝粉色jk震动捧喷白浆 | 永久免费精品精品永久-夜色 | 国产人妻精品午夜福利免费 | 亚洲中文字幕无码一久久区 | 精品国产青草久久久久福利 | 国产97色在线 | 免 | 成人精品一区二区三区中文字幕 | 欧美放荡的少妇 | 亚洲精品国偷拍自产在线观看蜜桃 | 久久精品人人做人人综合试看 | 亚洲の无码国产の无码步美 | 丁香花在线影院观看在线播放 | 国产热a欧美热a在线视频 | 奇米影视7777久久精品 | 日日躁夜夜躁狠狠躁 | 性欧美熟妇videofreesex | 日本丰满护士爆乳xxxx | 亚洲综合久久一区二区 | 欧美黑人性暴力猛交喷水 | 亚洲精品国偷拍自产在线麻豆 | 久久久亚洲欧洲日产国码αv | 国产一区二区不卡老阿姨 | 乱码午夜-极国产极内射 | 国产成人无码一二三区视频 | 中文字幕 人妻熟女 | 人人超人人超碰超国产 | 丝袜美腿亚洲一区二区 | 曰韩无码二三区中文字幕 | 欧美 丝袜 自拍 制服 另类 | 亚洲 另类 在线 欧美 制服 | 国产精品美女久久久网av | 樱花草在线社区www | 激情爆乳一区二区三区 | 午夜肉伦伦影院 | 精品国产一区二区三区四区在线看 | www国产亚洲精品久久网站 | 久久久久久a亚洲欧洲av冫 | 一二三四在线观看免费视频 | 精品一区二区不卡无码av | 国产美女精品一区二区三区 | 日欧一片内射va在线影院 | 欧美激情一区二区三区成人 | 300部国产真实乱 | 香蕉久久久久久av成人 | 欧美丰满熟妇xxxx性ppx人交 | а天堂中文在线官网 | 在线观看国产一区二区三区 | 欧洲欧美人成视频在线 | 精品欧美一区二区三区久久久 | 欧美zoozzooz性欧美 | 成人女人看片免费视频放人 | 国产片av国语在线观看 | 国产另类ts人妖一区二区 | 曰韩无码二三区中文字幕 | 成人欧美一区二区三区黑人免费 | 久久精品国产大片免费观看 | 国产精品永久免费视频 | 国产精品18久久久久久麻辣 | 日本精品少妇一区二区三区 | 最近中文2019字幕第二页 | 国产又爽又黄又刺激的视频 | 熟妇人妻激情偷爽文 | 18无码粉嫩小泬无套在线观看 | 亚洲综合无码久久精品综合 | 99精品无人区乱码1区2区3区 | 最新国产麻豆aⅴ精品无码 | 国产精品久久久久久亚洲毛片 | 久久99国产综合精品 | 亚洲中文字幕无码中文字在线 | 日日麻批免费40分钟无码 | 亚洲日韩av片在线观看 | 亚洲成av人片在线观看无码不卡 | 成人亚洲精品久久久久软件 | 亚洲狠狠色丁香婷婷综合 | 亚洲爆乳精品无码一区二区三区 | 中文字幕精品av一区二区五区 | 曰韩少妇内射免费播放 | 亚洲精品一区二区三区在线观看 | 国产精品无套呻吟在线 | 亚洲狠狠色丁香婷婷综合 | 欧美激情综合亚洲一二区 | 十八禁真人啪啪免费网站 | 国产黑色丝袜在线播放 | 成人亚洲精品久久久久 | 香港三级日本三级妇三级 | 狠狠躁日日躁夜夜躁2020 | 国产超级va在线观看视频 | 久久精品成人欧美大片 | 久久99精品国产麻豆 | 熟妇人妻无码xxx视频 | 国产一区二区三区日韩精品 | 久久熟妇人妻午夜寂寞影院 | 亚洲国产av精品一区二区蜜芽 | 老司机亚洲精品影院无码 | 日韩人妻无码一区二区三区久久99 | 一本久道久久综合婷婷五月 | 免费男性肉肉影院 | 久久精品国产一区二区三区肥胖 | 男女爱爱好爽视频免费看 | 久在线观看福利视频 | 少妇久久久久久人妻无码 | 精品一区二区三区波多野结衣 | 无遮无挡爽爽免费视频 | 成人aaa片一区国产精品 | 国产亲子乱弄免费视频 | 欧美 日韩 人妻 高清 中文 | 高潮毛片无遮挡高清免费 | 国产在线aaa片一区二区99 | 久久综合久久自在自线精品自 | 玩弄人妻少妇500系列视频 | 国产精品人妻一区二区三区四 | 香蕉久久久久久av成人 | 久久综合色之久久综合 | 日韩精品乱码av一区二区 | 亚洲欧美中文字幕5发布 | 亚洲第一网站男人都懂 | 国产精品无码mv在线观看 | 亚洲一区二区三区无码久久 | 欧美性黑人极品hd | 久久精品中文字幕一区 | 六月丁香婷婷色狠狠久久 | 亚洲精品鲁一鲁一区二区三区 | 久久国产精品偷任你爽任你 | 牲欲强的熟妇农村老妇女视频 | 精品久久8x国产免费观看 | 中文字幕av无码一区二区三区电影 | 少女韩国电视剧在线观看完整 | 国产69精品久久久久app下载 | 精品人妻av区 | 无码av最新清无码专区吞精 | 妺妺窝人体色www在线小说 | 2020久久超碰国产精品最新 | 亚洲精品一区二区三区四区五区 | 久久久久久av无码免费看大片 | 免费人成在线视频无码 | 兔费看少妇性l交大片免费 | 啦啦啦www在线观看免费视频 | 亚洲精品www久久久 | 爽爽影院免费观看 | 国产精品va在线播放 | 精品亚洲成av人在线观看 | 亚洲中文字幕无码一久久区 | 人人爽人人澡人人高潮 | 欧美丰满少妇xxxx性 | 天堂а√在线中文在线 | 成熟女人特级毛片www免费 | 久久精品国产一区二区三区肥胖 | 国产无遮挡又黄又爽又色 | 人妻尝试又大又粗久久 | 国产精品高潮呻吟av久久 | 久久人人爽人人人人片 | 大乳丰满人妻中文字幕日本 | 无码任你躁久久久久久久 | 色情久久久av熟女人妻网站 | 人妻尝试又大又粗久久 | 日韩在线不卡免费视频一区 | 欧美freesex黑人又粗又大 | 久久精品中文字幕大胸 | 麻豆精产国品 | 亚洲一区二区三区国产精华液 | 日日鲁鲁鲁夜夜爽爽狠狠 | 亚洲区欧美区综合区自拍区 | 亚洲 a v无 码免 费 成 人 a v | 亚洲精品一区二区三区四区五区 | 亚洲热妇无码av在线播放 | 成人性做爰aaa片免费看 | 天堂亚洲2017在线观看 | 成人精品一区二区三区中文字幕 | 少妇久久久久久人妻无码 | 日本www一道久久久免费榴莲 | 六月丁香婷婷色狠狠久久 | 欧美激情综合亚洲一二区 | 亚洲国产精品久久人人爱 | 国精品人妻无码一区二区三区蜜柚 | 国产在热线精品视频 | 国产人妻精品一区二区三区 | 国产精品丝袜黑色高跟鞋 | 亚拍精品一区二区三区探花 | 亚洲日本一区二区三区在线 | 十八禁真人啪啪免费网站 | 高潮毛片无遮挡高清免费视频 | √天堂资源地址中文在线 | 日韩无套无码精品 | 人妻有码中文字幕在线 | 久热国产vs视频在线观看 | 狠狠色欧美亚洲狠狠色www | 思思久久99热只有频精品66 | 爱做久久久久久 | 国产亚洲人成a在线v网站 | 成人一区二区免费视频 | 青青青手机频在线观看 | 精品无码av一区二区三区 | 欧美性猛交内射兽交老熟妇 | 国产香蕉尹人综合在线观看 | 蜜桃视频插满18在线观看 | 一本一道久久综合久久 | 欧美黑人性暴力猛交喷水 | 国产精品无码永久免费888 | 婷婷六月久久综合丁香 | 岛国片人妻三上悠亚 | 欧美兽交xxxx×视频 | 老熟妇仑乱视频一区二区 | www国产精品内射老师 | 日日夜夜撸啊撸 | 国产精品无码永久免费888 | 日韩欧美中文字幕在线三区 | 牲欲强的熟妇农村老妇女 | 国精产品一品二品国精品69xx | 色婷婷av一区二区三区之红樱桃 | 中文字幕日产无线码一区 | 性色av无码免费一区二区三区 | 国产成人精品视频ⅴa片软件竹菊 | 自拍偷自拍亚洲精品被多人伦好爽 | 在线 国产 欧美 亚洲 天堂 | 十八禁真人啪啪免费网站 | 无码播放一区二区三区 | 蜜桃视频插满18在线观看 | 国产精品爱久久久久久久 | 国产无遮挡又黄又爽又色 | 超碰97人人做人人爱少妇 | 老司机亚洲精品影院 | 伊人久久大香线蕉av一区二区 | 日本护士xxxxhd少妇 | 天天躁夜夜躁狠狠是什么心态 | 天天综合网天天综合色 | 老熟妇乱子伦牲交视频 | 无码av最新清无码专区吞精 | 欧美熟妇另类久久久久久不卡 | 精品久久综合1区2区3区激情 | 精品久久久无码中文字幕 | 强伦人妻一区二区三区视频18 | 女人被男人躁得好爽免费视频 | 亚洲精品国偷拍自产在线麻豆 | 亚洲一区二区三区无码久久 | 色 综合 欧美 亚洲 国产 | √天堂中文官网8在线 | 久久成人a毛片免费观看网站 | 国产av一区二区三区最新精品 | 美女张开腿让人桶 | 国产av人人夜夜澡人人爽麻豆 | 久久综合色之久久综合 | 成人精品一区二区三区中文字幕 | 精品无码一区二区三区爱欲 | 国产精品无码一区二区三区不卡 | 蜜臀av在线播放 久久综合激激的五月天 | 欧美丰满熟妇xxxx性ppx人交 | 久久久久久久人妻无码中文字幕爆 | 无码任你躁久久久久久久 | 乌克兰少妇xxxx做受 | 精品久久久无码中文字幕 | 日欧一片内射va在线影院 | 清纯唯美经典一区二区 | 国产综合色产在线精品 | 香港三级日本三级妇三级 | 在线观看国产午夜福利片 | 久精品国产欧美亚洲色aⅴ大片 | 精品国精品国产自在久国产87 | 国产亚洲精品久久久久久 | 亚洲日韩av片在线观看 | 日本一卡二卡不卡视频查询 | 色狠狠av一区二区三区 | 国产成人精品一区二区在线小狼 | 福利一区二区三区视频在线观看 | 青草青草久热国产精品 | 麻豆md0077饥渴少妇 | 国产97人人超碰caoprom | 精品 日韩 国产 欧美 视频 | 久久综合色之久久综合 | 无码av最新清无码专区吞精 | 强开小婷嫩苞又嫩又紧视频 | 国产精品99爱免费视频 | 欧美人与善在线com | 黄网在线观看免费网站 | 国产亚洲精品久久久久久久 | 永久黄网站色视频免费直播 | 久久zyz资源站无码中文动漫 | 亚洲欧美综合区丁香五月小说 | 亚洲精品欧美二区三区中文字幕 | 中文字幕无码免费久久99 | 亚洲精品国产精品乱码视色 | 四虎4hu永久免费 | 麻豆果冻传媒2021精品传媒一区下载 | 狠狠噜狠狠狠狠丁香五月 | 大肉大捧一进一出好爽视频 | 国内揄拍国内精品少妇国语 | 亚洲色在线无码国产精品不卡 | 天海翼激烈高潮到腰振不止 | 少妇人妻大乳在线视频 | 3d动漫精品啪啪一区二区中 | 久久综合给久久狠狠97色 | 一本大道伊人av久久综合 | 国产乱人无码伦av在线a | 午夜福利一区二区三区在线观看 | 97夜夜澡人人双人人人喊 | 成熟人妻av无码专区 | 沈阳熟女露脸对白视频 | 3d动漫精品啪啪一区二区中 | 亚洲无人区午夜福利码高清完整版 | 蜜桃无码一区二区三区 | 牲欲强的熟妇农村老妇女 | 亚洲s色大片在线观看 | 久久久久成人片免费观看蜜芽 | 天海翼激烈高潮到腰振不止 | 国产真人无遮挡作爱免费视频 | 麻豆国产人妻欲求不满 | 亚洲经典千人经典日产 | 婷婷色婷婷开心五月四房播播 | 中文字幕人妻无码一区二区三区 | 荫蒂添的好舒服视频囗交 | 妺妺窝人体色www在线小说 | 青草青草久热国产精品 | 午夜免费福利小电影 | 伊人久久大香线蕉午夜 | 中文字幕无码日韩专区 | 欧美日韩在线亚洲综合国产人 | 日本一卡2卡3卡四卡精品网站 | 国产莉萝无码av在线播放 | 一本色道久久综合狠狠躁 | 久热国产vs视频在线观看 | 亚洲无人区午夜福利码高清完整版 | 天堂а√在线地址中文在线 | 一本大道伊人av久久综合 | 波多野42部无码喷潮在线 | 国产精品va在线播放 | 亚洲精品一区二区三区在线观看 | 欧美freesex黑人又粗又大 | 精品国产一区二区三区四区在线看 | 在线观看国产午夜福利片 | 在线观看国产一区二区三区 | 亚洲人成网站免费播放 | 大屁股大乳丰满人妻 | 日韩少妇内射免费播放 | www成人国产高清内射 | 精品亚洲韩国一区二区三区 | 激情五月综合色婷婷一区二区 | 色窝窝无码一区二区三区色欲 | 日韩在线不卡免费视频一区 | 天天躁日日躁狠狠躁免费麻豆 | 在线天堂新版最新版在线8 | 精品久久8x国产免费观看 | 国内丰满熟女出轨videos | av无码电影一区二区三区 | 成人亚洲精品久久久久 | 国産精品久久久久久久 | 成人免费视频在线观看 | 好男人www社区 | 内射老妇bbwx0c0ck | 国产明星裸体无码xxxx视频 | 日本又色又爽又黄的a片18禁 | 波多野42部无码喷潮在线 | 又湿又紧又大又爽a视频国产 | 樱花草在线社区www | 国产莉萝无码av在线播放 | 亚洲色www成人永久网址 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 丰满人妻精品国产99aⅴ | 国产女主播喷水视频在线观看 | 牲欲强的熟妇农村老妇女 | 成熟人妻av无码专区 | 一本久久伊人热热精品中文字幕 | 色综合久久久无码中文字幕 | а√资源新版在线天堂 | 狠狠综合久久久久综合网 | 亚洲一区二区三区含羞草 | 久久久精品456亚洲影院 | 国产综合色产在线精品 | 在线视频网站www色 | 999久久久国产精品消防器材 | 正在播放老肥熟妇露脸 | 亚洲精品鲁一鲁一区二区三区 | 日韩成人一区二区三区在线观看 | 十八禁真人啪啪免费网站 | 久久综合香蕉国产蜜臀av | 欧美日韩一区二区免费视频 | 国产综合在线观看 | 亚洲第一网站男人都懂 | 国产精品亚洲lv粉色 | 国产va免费精品观看 | 亚洲成熟女人毛毛耸耸多 | 国产成人综合在线女婷五月99播放 | 国产麻豆精品一区二区三区v视界 | 人人超人人超碰超国产 | 亚洲中文字幕在线观看 | 国产成人精品视频ⅴa片软件竹菊 | 日韩av无码一区二区三区 | 少妇无码av无码专区在线观看 | 欧美人与善在线com | 亚洲娇小与黑人巨大交 | 男女猛烈xx00免费视频试看 | 国产综合在线观看 | 国产成人精品一区二区在线小狼 | 久久久久久a亚洲欧洲av冫 | 亚洲狠狠婷婷综合久久 | 人人妻人人澡人人爽欧美一区 | 久久久国产精品无码免费专区 | 日日噜噜噜噜夜夜爽亚洲精品 | 亚洲s色大片在线观看 | 初尝人妻少妇中文字幕 | 人人爽人人爽人人片av亚洲 | 成人无码精品1区2区3区免费看 | 少妇一晚三次一区二区三区 | 成人亚洲精品久久久久软件 | 亚洲中文字幕无码中字 | 少妇被黑人到高潮喷出白浆 | 国产精品久久久久7777 | 一个人免费观看的www视频 | 国产69精品久久久久app下载 | 成人精品视频一区二区 | 久久久久av无码免费网 | 国内精品久久久久久中文字幕 | 99在线 | 亚洲 | 成熟妇人a片免费看网站 | 波多野结衣 黑人 | yw尤物av无码国产在线观看 | 任你躁在线精品免费 | 色噜噜亚洲男人的天堂 | 欧美精品在线观看 | 国产午夜福利100集发布 | 性色欲网站人妻丰满中文久久不卡 | 在线精品国产一区二区三区 | 亚洲精品一区二区三区大桥未久 | 国产一区二区三区四区五区加勒比 | 国产一区二区不卡老阿姨 | 蜜桃视频插满18在线观看 | 中文字幕人成乱码熟女app | 任你躁国产自任一区二区三区 | 欧美国产日韩亚洲中文 | 国产精品毛片一区二区 | 欧美第一黄网免费网站 | 欧美人与牲动交xxxx | 国产精品无码成人午夜电影 | 色欲人妻aaaaaaa无码 | 国产激情精品一区二区三区 | 久久久亚洲欧洲日产国码αv | 在教室伦流澡到高潮hnp视频 | 成年女人永久免费看片 | 国产亚洲精品久久久久久久久动漫 | 欧美性生交xxxxx久久久 |