欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

Oracle索引分析與比較

系統 1862 0

索引在各種關系型數據庫系統中都是舉足輕重的組成部分,其對于提高檢索數據的速度起至關重要的作用。在Oracle中,索引基本分為以下幾種:B*Tree索引,反向索引,降序索引,位圖索引,函數索引,interMedia全文索引等。本文主要就前6種索引進行分析,由于interMedia全文索引涉及的內容可以單獨寫一篇文章,所以不在此對其做分析。

首先給出各種索引的簡要解釋:

b*tree index:幾乎所有的關系型數據庫中都有b*tree類型索引,也是被最多使用的。其樹結構與二叉樹比較類似,根據rid快速定位所訪問的行。
反向索引:反轉了b*tree索引碼中的字節,是索引條目分配更均勻,多用于并行服務器環境下,用于減少索引葉的競爭。
降序索引:8i中新出現的索引類型,針對逆向排序的查詢。
位圖索引:使用位圖來管理與數據行的對應關系,多用于OLAP系統。
函數索引:這種索引中保存了數據列基于function返回的值,在select * from table where function(column)=value這種類型的語句中起作用。

2 各種索引的結構分析

2.1 B*Tree索引B*Tree索引是最常見的索引結構,默認建立的索引就是這種類型的索引。B*Tree索引在檢索高基數數據列(高基數數據列是指該列有很多不同的值)時提供了最好的性能。當取出的行數占總行數比例較小時B-Tree索引比全表檢索提供了更有效的方法。但當檢查的范圍超過表的10%時就不能提高取回數據的性能。B-Tree索引是基于二叉樹的,由分支塊(branch block)和葉塊(leaf block)組成。在樹結構中,位于最底層底塊被稱為葉塊,包含每個被索引列的值和行所對應的rowid。在葉節點的上面是分支塊,用來導航結構,包含了索引列(關鍵字)范圍和另一索引塊的地址。

假設我們要找索引中值為80的行,從索引樹的最上層入口開始,定位到大于等于50,然后往左找,找到第2個分支塊,定位為75-100,最后再定位到葉塊上,找到80所對應的rowid,然后根據rowid去讀取數據塊獲取數據。如果查詢條件是范圍選擇的,比如where column >20 and column <80,那么會先定位到第一個包含20的葉塊,然后橫向查找其他的葉塊,直到找到包含80的塊為止,不用每次都從入口進去再重新定位。

2.2 反向索引

反向索引是B*Tree索引的一個分支,它的設計是為了運用在某些特定的環境下的。Oracle推出它的主要目的就是為了降低在并行服務器(Oracle Parallel Server)環境下索引葉塊的爭用。當B*Tree索引中有一列是由遞增的序列號產生的話,那么這些索引信息基本上分布在同一個葉塊,當用戶修改或訪問相似的列時,索引塊很容易產生爭用。反向索引中的索引碼將會被分布到各個索引塊中,減少了爭用。反向索引反轉了索引碼中每列的字節,通過dump()函數我們可以清楚得看見它做了什么。舉個例子:1,2,3三個連續的數,用dump()函數看它們在Oracle內部的表示方法。

      
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> SQL > select ' number ' , dump ( 1 , 16 ) from dual 2 union all select ' number ' , dump ( 2 , 16 ) from dual 3 union all select ' number ' , dump ( 3 , 16 ) from dual; ' NUMBE DUMP(1,16) ------ ----------------- number Typ=2 Len=2: c1,2 (1) number Typ=2 Len=2: c1,3 (2) number Typ=2 Len=2: c1,4 (3) 再對比一下反向以后的情況: SQL> select ' number ' ,dump(reverse(1),16) from dual 2 union all select ' number ' ,dump(reverse(2),16) from dual 3 union all select ' number ' ,dump(reverse(3),16) from dual; ' NUMBE DUMP ( REVERSE ( 1 ), 1 -- ---- ----------------- number Typ = 2 Len = 2 : 2 ,c1 ( 1 number Typ = 2 Len = 2 : 3 ,c1 ( 2 number Typ = 2 Len = 2 : 4 ,c1 ( 3

我們發現索引碼的結構整個顛倒過來了,這樣1,2,3個索引碼基本上不會出現在同一個葉塊里,所以減少了爭用。不過反向索引又一個缺點就是不能在所有使用常規索引的地方使用。在范圍搜索中其不能被使用,例如,where column>value,因為在索引的葉塊中索引碼沒有分類,所以不能通過搜索相鄰葉塊完成區域掃描。

2.3 降序索引

降序索引是8i里面新出現的一種索引,是B*Tree的另一個衍生物,它的變化就是列在索引中的儲存方式從升序變成了降序,在某些場合下降序索引將會起作用。舉個例子,我們來查詢一張表并進行排序:

      
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> SQL > select * from test where a between 1 and 100 order by a desc ,b asc ; 已選擇100行。 Execution Plan -- -------------------------------------------------------- 0 SELECT STATEMENT Optimizer = CHOOSE (Cost = 2 Card = 100 Bytes = 400 ) 1 0 SORT( ORDER BY )(Cost = 2 Card = 100 Bytes = 400 ) 2 1 INDEX (RANGE SCAN) OF ' IND_BT ' (NON - UNIQUE ) (Cost = 2 Card = 100 Bytes = 400 )

這里優化器首先選擇了一個索引范圍掃描,然后還有一個排序的步驟。如果使用了降序索引,排序的過程會被取消。

      
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> SQL > create index test.ind_desc on test.testrev(a desc ,b asc ); 索引已創建。 SQL > analyze index test.ind_desc compute statistics ; 索引已分析

再來看下執行路徑:

      
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> SQL > select * from test where a between 1 and 100 order by a desc ,b asc ; 已選擇100行。 Execution Plan (SQL執行計劃,稍后會講解如何使用)。 -- -------------------------------------------------------- 0 SELECT STATEMENT Optimizer = CHOOSE (Cost = 2 Card = 100 Bytes = 400 ) 1 0 INDEX (RANGE SCAN) OF ' IND_DESC ' (NON - UNIQUE ) (Cost = 2 Card = 100 Bytes = 400 )

我們看到排序過程消失了,這是因為創建降序索引時Oracle已經把數據都按降序排好了。另外一個需要注意的地方是要設置init.ora里面的compatible參數為8.1.0或以上,否則創建時desc關鍵字將被忽略。

2.4 位圖索引

位圖索引主要用于決策支持系統或靜態數據,不支持行級鎖定。位圖索引最好用于低cardinality列(即列的唯一值除以行數為一個很小的值,接近零),例如又一個“性別”列,列值有“Male”,“Female”,“Null”等3種,但一共有300萬條記錄,那么3/3000000約等于0,這種情況下最適合用位圖索引。

位圖索引可以是簡單的(單列)也可以是連接的(多列),但在實踐中絕大多數是簡單的。在這些列上多位圖索引可以與AND或OR操作符結合使用。位圖索引使用位圖作為鍵值,對于表中的每一數據行位圖包含了TRUE(1)、FALSE(0)、或NULL值。位圖索引的位圖存放在B-Tree結構的頁節點中。B-Tree結構使查找位圖非常方便和快速。另外,位圖以一種壓縮格式存放,因此占用的磁盤空間比B-Tree索引要小得多。

如果搜索where gender=’Male’,要統計性別是”Male”的列行數的話,Oracle很快就能從位圖中找到共3行即第1,9,10行是符合條件的;如果要搜索where gender=’Male’ or gender=’Female’的列的行數的話,也很容易從位圖中找到共8行即1,2,3,4,7,8,9,10行是符合條件的。如果要搜索表的值的話,那么Oracle會用內部的轉換函數將位圖中的相關信息轉換成rowid來訪問數據塊。

2.5 函數索引

基于函數的索引也是8i以來的新產物,它有索引計算列的能力,它易于使用并且提供計算好的值,在不修改應用程序的邏輯上提高了查詢性能。使用基于函數的索引有幾個先決條件:

(1)必須擁有QUERY REWRITE(本模式下)或GLOBAL QUERY REWRITE(其他模式下)權限。
(2)必須使用基于成本的優化器,基于規則的優化器將被忽略。
(3)必須設置以下兩個系統參數:

QUERY_REWRITE_ENABLED=TRUE
QUERY_REWRITE_INTEGRITY=TRUSTED

可以通過alter system set,alter session set在系統級或線程級設置,也可以通過在init.ora添加實現。這里舉一個基于函數的索引的例子:

        
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> SQL > create index test.ind_fun on test.testindex( upper (a)); 索引已創建。 SQL > insert into testindex values ( ' a ' , 2 ); 已創建 1 行。 SQL > commit ; 提交完成。 SQL > select /**/ /* + RULE */ * FROM test.testindex where upper (a) = ' A ' ; A B -- ---------- a 2 Execution Plan -- -------------------------------------------------------- 0 SELECT STATEMENT Optimizer = HINT: RULE 1 0 TABLE ACCESS ( FULL ) OF ' TESTINDEX ' (優化器選擇了全表掃描) -- ------------------------------------------------------------------ SQL > select * FROM test.testindex where upper (a) = ' A ' ; A B -- ---------- a 2 Execution Plan -- -------------------------------------------------------- 0 SELECT STATEMENT Optimizer = CHOOSE (Cost = 2 Card = 1 Bytes = 5 ) 1 0 TABLE ACCESS ( BY INDEX ROWID) OF ' TESTINDEX ' (Cost = 2 Card = 1 Bytes = 5 ) 2 1 INDEX (RANGE SCAN) OF ' IND_FUN ' (NON - UNIQUE ) (Cost = 1 Car d = 1 )(使用了ind_fun索引)

3 各種索引的創建方法

(1)*Tree索引。
Create index indexname on tablename(columnname[columnname...])
(2)反向索引。
Create index indexname on tablename(columnname[columnname...]) reverse
(3)降序索引。
Create index indexname on tablename(columnname DESC[columnname...])
(4)位圖索引。
Create BITMAP index indexname on tablename(columnname[columnname...])
(5)函數索引。
Create index indexname on tablename(functionname(columnname))
注意:創建索引后分析要索引才能起作用。
analyze index indexname compute statistics;

4 各種索引使用場合及建議(1)B*Tree索引。

常規索引,多用于oltp系統,快速定位行,應建立于高cardinality列(即列的唯一值除以行數為一個很大的值,存在很少的相同值)。
(2)反向索引。
B*Tree的衍生產物,應用于特殊場合,在ops環境加序列增加的列上建立,不適合做區域掃描。
(3)降序索引。
B*Tree的衍生產物,應用于有降序排列的搜索語句中,索引中儲存了降序排列的索引碼,提供了快速的降序搜索。
(4)位圖索引。
位圖方式管理的索引,適用于OLAP(在線分析)和DSS(決策處理)系統,應建立于低cardinality列,適合集中讀取,不適合插入和修改,提供比B*Tree索引更節省的空間。
(5)函數索引。
B*Tree的衍生產物,應用于查詢語句條件列上包含函數的情況,索引中儲存了經過函數計算的索引碼值。可以在不修改應用程序的基礎上能提高查詢效率。

5 附表(索引什么時候不工作)

首先要聲明兩個知識點:

(1)RBO&CBO。
Oracle有兩種執行優化器,一種是RBO(Rule Based Optimizer)基于規則的優化器,這種優化器是基于sql語句寫法選擇執行路徑的;另一種是CBO(Cost Based Optimizer)基于規則的優化器,這種優化器是Oracle根據統計分析信息來選擇執行路徑,如果表和索引沒有進行分析,Oracle將會使用RBO代替CBO;如果表和索引很久未分析,CBO也有可能選擇錯誤執行路徑,不過CBO是Oracle發展的方向,自8i版本來已經逐漸取代RBO.

(2)AUTOTRACE。
要看索引是否被使用我們要借助Oracle的一個叫做AUTOTRACE功能,它顯示了sql語句的執行路徑,我們能看到Oracle內部是怎么執行sql的,這是一個非常好的輔助工具,在sql調優里廣泛被運用。我們來看一下怎么運用AUTOTRACE:
① 由于AUTOTRACE自動為用戶指定了Execution Plan,因此該用戶使用AUTOTRACE前必須已經建立了PLAN_TABLE。如果沒有的話,請運行utlxplan.sql腳本(它在$ORACLE_HOME/rdbms/admin目錄中)。
② AUTOTRACE可以通過運行plustrce.sql腳本(它在$ORACLE_HOME/sqlplus/admin目錄中)來設置,用sys用戶登陸然后運行plustrce.sql后會建立一個PLUSTRACE角色,然后給相關用戶授予PLUSTRACE角色,然后這些用戶就可以使用AUTOTRACE功能了。
③ AUTOTRACE的默認使用方法是set autotrace on,但是這方法不總是適合各種場合,特別當返回行數很多的時候。Set autotrace traceonly提供了只查看統計信息而不查詢數據的功能。

        
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> SQL > set autotrace on SQL > select * from test; A -- -------- 1 Execution Plan -- -------------------------------------------------------- 0 SELECT STATEMENT Optimizer = CHOOSE 1 0 TABLE ACCESS ( FULL ) OF ' TEST ' Statistics -- -------------------------------------------------------- 0 recursive calls 0 db block gets 0 consistent gets 0 physical reads 0 redo size 0 bytes sent via SQL * Net to client 0 bytes received via SQL * Net from client 0 SQL * Net roundtrips to / from client 0 sorts (memory) 0 sorts ( disk ) rows processed SQL > set autotrace traceonly SQL > select * from test.test; Execution Plan -- -------------------------------------------------------- 0 SELECT STATEMENT Optimizer = CHOOSE 1 0 TABLE ACCESS ( FULL ) OF ' TEST ' Statistics -- -------------------------------------------------------- 0 recursive calls 0 db block gets 0 consistent gets 0 physical reads 0 redo size 0 bytes sent via SQL * Net to client 0 bytes received via SQL * Net from client 0 SQL * Net roundtrips to / from client 0 sorts (memory) 0 sorts ( disk ) rows processed

Hints是Oracle提供的一個輔助用法,按字面理解就是‘提示’的意思,確實它起得作用也是提示優化器按它所提供的關鍵字來選擇執行路徑,特別適用于sql調整的時候。使用方法如下:

{DELETE|INSERT|SELECT|UPDATE} /*+ hint [text] [hint[text]]... */

具體可參考Oracle SQL Reference。有了前面這些知識點,接下來讓我們來看一下什么時候索引是不起作用的。以下列出幾種情況。

(1)類型不匹配時。

        
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> SQL > create table test.testindex (a varchar ( 2 ),b number ); 表已創建。 SQL > create index ind_cola on test.testindex(a); 索引已創建。 SQL > insert into test.testindex values ( ' 1 ' , 1 ); 已創建 1 行。 SQL > commit ; 提交完成。 SQL > analyze table test.testindex compute statistics for all indexes; 表已分析。 SQL > set autotrace on ; SQL > select /**/ /* +RULE */ * FROM test.testindex where a = ' 1 ' ;(使用基于rule的優化器,數據類型匹配的情況下) A B -- ---------- 1 1 Execution Plan -- -------------------------------------------------------- 0 SELECT STATEMENT Optimizer = HINT: RULE 1 0 TABLE ACCESS ( BY INDEX ROWID) OF ' TESTINDEX ' 2 1 INDEX (RANGE SCAN) OF ' IND_COLA ' (NON - UNIQUE )(使用了索引ind_cola) ―――――――――――――――――――――――――――――――――― SQL > select /**/ /* +RULE */ * FROM test.testindex where a = 1 ;(數據類型不匹配的情況) A B -- ---------- 1 1 Execution Plan -- -------------------------------------------------------- 0 SELECT STATEMENT Optimizer = HINT: RULE 1 0 TABLE ACCESS ( FULL ) OF ' TESTINDEX ' (優化器選擇了全表掃描)
(2)條件列包含函數但沒有創建函數索引。
        
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> SQL > select /**/ /* + RULE */ * FROM test.testindex where upper (a) = ' A ' ;(使用了函數upper()在列a上); A B -- ---------- a 2 Execution Plan -- -------------------------------------------------------- 0 SELECT STATEMENT Optimizer = HINT: RULE 1 0 TABLE ACCESS ( FULL ) OF ' TESTINDEX ' (優化器選擇全表掃描) -- -------------------------------------------------------- 創建基于函數的索引 SQL > create index test.ind_fun on test.testindex( upper (a)); 索引已創建。 SQL > insert into testindex values ( ' a ' , 2 ); 已創建1行。 SQL > commit ; 提交完成。 SQL > select /**/ /* + RULE */ * FROM test.testindex where upper (a) = ' A ' ; A B -- ---------- a 2 Execution Plan -- -------------------------------------------------------- 0 SELECT STATEMENT Optimizer = HINT: RULE 1 0 TABLE ACCESS ( FULL ) OF ' TESTINDEX ' (在RULE優化器下忽略了函數索引選擇了全表掃描) -- --------------------------------------------------------- SQL > select * FROM test.testindex where upper (a) = ' A ' ; A B -- ---------- a 2 Execution Plan -- -------------------------------------------------------- 0 SELECT STATEMENT Optimizer = CHOOSE (Cost = 2 Card = 1 Bytes = 5 ) 1 0 TABLE ACCESS ( BY INDEX ROWID) OF ' TESTINDEX ' (Cost = 2 Card = 1 Bytes = 5 ) 2 1 INDEX (RANGE SCAN) OF ' IND_FUN ' (NON - UNIQUE ) (Cost = 1 Car d = 1 )(CBO優化器使用了ind_fun索引)

(3)復合索引中的前導列沒有被作為查詢條件。

        
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> 創建一個復合索引 SQL > create index ind_com on test.testindex(a,b); 索引已創建。 SQL > select /**/ /* + RULE */ * from test.testindex where a = ' 1 ' ; A B -- ---------- 1 2 Execution Plan -- -------------------------------------------------------- 0 SELECT STATEMENT Optimizer = HINT: RULE 1 0 INDEX (RANGE SCAN) OF ' IND_COM ' (NON - UNIQUE )(條件列表包含前導列時使用索引ind_com) SQL > select /**/ /* + RULE */ * from test.testindex where b = 1 ; 未選定行 Execution Plan -- -------------------------------------------------------- 0 SELECT STATEMENT Optimizer = HINT: RULE 1 0 TABLE ACCESS ( FULL ) OF ' TESTINDEX ' (條件列表不包括前導列是選擇全表掃描) -- ---------------------------------------------------------

(4)CBO模式下選擇的行數比例過大,優化器采取了全表掃描。

        
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> SQL > select * from test.testindex where a = ' 1 ' ; A B -- ---------- 1 2 Execution Plan -- -------------------------------------------------------- 0 SELECT STATEMENT Optimizer = CHOOSE (Cost = 1 Card = 1 Bytes = 5 ) 1 0 TABLE ACCESS ( FULL ) OF ' TESTINDEX ' (Cost = 1 Card = 1 Bytes = 5 ) (表一共2行,選擇比例為50 % ,所以優化器選擇了全表掃描) ―――――――――――――――――――――――――――――――――― 下面增加表行數 SQL > declare i number ; 2 begin 3 for i in 1 .. 100 loop 4 insert into test.testindex values (to_char(i),i); 5 end loop; 6 end ; 7 / PL / SQL 過程已成功完成。 SQL > commit ; 提交完成。 SQL > select count ( * ) from test.testindex; COUNT ( * ) -- -------- 102 SQL > select * from test.testindex where a = ' 1 ' ; A B -- -- ---------- 1 1 1 2 Execution Plan SELECT STATEMENT Optimizer = CHOOSE (Cost = 1 Card = 1 Bytes = 5 ) 1 0 INDEX (RANGE SCAN) OF ' IND_COM ' (NON - UNIQUE ) (Cost = 1 Card = 1 Bytes = 5 ) (表一共102行,選擇比例為2 / 102 = 2 % ,所以優化器選擇了索引掃描)
(5)CBO模式下表很久沒分析,表的增長明顯,優化器采取了全表掃描。
        
<!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> SQL > select * from test.testindex where a like ' 1% ' ; A B -- -- ---------- 1 2 1 1 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 100 100 已選擇13行。 Execution Plan -- -------------------------------------------------------- 0 SELECT STATEMENT Optimizer = CHOOSE (Cost = 1 Card = 13 Bytes = 52 ) 1 0 TABLE ACCESS ( FULL ) OF ' TESTINDEX ' (Cost = 1 Card = 13 Bytes = 52 ) (表一共102行,選擇比例為13 / 102 > 10 % ,優化器選擇了全表掃描) ―――――――――――――――――――――――――――――――――― 增加表行數 SQL > declare i number ; 2 begin 3 for i in 200 .. 1000 loop 4 insert into test.testindex values (to_char(i),i); 5 end loop; 6 end ; 7 / PL / SQL 過程已成功完成。 SQL > commit ; 提交完成。 SQL > select count ( * ) from test.testindex; COUNT ( * ) -- -------- 903 SQL > select * from test.testindex where a like ' 1% ' ; A B -- -- ---------- 1 2 1 1 10 10 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 100 100 1000 1000 已選擇14行。 Execution Plan -- -------------------------------------------------------- 0 SELECT STATEMENT Optimizer = CHOOSE (Cost = 1 Card = 13 Bytes = 52 ) 1 0 TABLE ACCESS ( FULL ) OF ' TESTINDEX ' (Cost = 1 Card = 13 Bytes = 52 ) (表一共903行,選擇比例為14 / 903 < 5 % ,優化器選擇了全表掃描,選擇路徑是錯誤的) ――――――――――――――――――――――――――――― 給表做分析 SQL > analyze table test.testindex compute statistics for table for all indexed c olumns for all indexes; 表已分析。 SQL > select * from test.testindex where a like ' 1% ' ; A B -- -- ---------- 1 2 1 1 10 10 100 100 1000 1000 11 11 12 12 13 13 14 14 15 15 16 16 17 17 18 18 19 19 已選擇14行。 Execution Plan -- -------------------------------------------------------- 0 SELECT STATEMENT Optimizer = CHOOSE (Cost = 4 Card = 24 Bytes = 120 ) 1 0 TABLE ACCESS ( BY INDEX ROWID) OF ' TESTINDEX ' (Cost = 4 Card = 24 Bytes = 120 ) 2 1 INDEX (RANGE SCAN) OF ' IND_COLA ' (NON - UNIQUE ) (Cost = 2 Ca rd = 24 ) (經過分析后優化器選擇了正確的路徑,使用了ind_cola索引) ――――――――――――――――――――――――――――――――――

小結

這篇文章介紹了oracle數據庫中的各種索引,通過分析它們的結構,我們知道了它們的特點和應用范圍,同時介紹了如何去避免索引失效,希望對大家有所幫助。

Oracle索引分析與比較


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 999热精品视频 | 欧美激情精品久久久久 | 香蕉成人国产精品免费看网站 | 久久久久久久国产精品 | 王骏迪的个人资料 | av在线电影网址 | 好爽~好硬~好紧~蜜芽 | 91成人精品| 午夜影院在线观看视频 | 91精品国产色综合久久不卡蜜臀 | 日本黄大片视频在线播放 | 999国产一区二区三区四区 | 国产成人免费 | 青青久久| 500av导航大全精品 | 日韩精品资源 | a毛片在线 | 国产成人一级片 | 日韩精品一区二区三区中文字幕 | 国产一区二区精品在线观看 | 精品亚洲成a人片在线观看 在线看片h站 | 91亚洲精品丁香在线观看 | 欧美在线观看一区二区 | 午夜影院在线免费观看 | 成人 日韩 | 欧美一级久久久久久久大片 | 波多野衣结在线精品二区 | 女同久久另类99精品国产 | 涩色婷婷狠狠第四四房社区奇米 | 色就是色网站 | 九九九九精品视频在线播放 | 丁香婷婷综合五月六月 | 一级毛片一级毛片一级毛片 | 在线中文视频 | 成人18免费观看的软件 | 国产精品亚洲视频 | 日韩无套 | 超碰97最新 | 国产色网 | 超碰在线观看97 | 欧美一级片在线视频 |