日本免费精品_最新日韩一区_亚洲视频一区在线_a在线视频观看_天天射夜夜骑_粉嫩av一区二区三区_欧美中日韩免费视频_综合图区欧美_国内精品美女在线观看_午夜精品久久久久久久男人的天堂

首頁 > 編程 > Ruby > 正文

在Ruby on Rails中優化ActiveRecord的方法

2020-10-29 19:40:38
字體:
來源:轉載
供稿:網友

 Ruby on Rails 編程常常會將您寵壞。這一不斷發展的框架會讓您從其他框架的沉悶乏味中解脫出來。您可以用習以為常的幾行代碼片斷表達自己的意圖。而且還可以使用 ActiveRecord。

對于我這樣的一個老 Java? 程序員而言,ActiveRecord 多少有點生疏。通過 Java 框架,我通常都會在獨立的模型和模式之間構建一種映射。像這樣的框架就是映射框架。通過 ActiveRecord,我只定義數據庫模式:或者用 SQL 或者用稱為遷移(migration)的 Ruby 類。將對象模型設計建立于數據庫結構之上的那些框架稱為包裝框架。與大多數包裝框架不同,Rails 能通過查詢數據庫表發現對象模型的特征。與構建復雜查詢不同,我使用模型在 Ruby(而非 SQL)中遍歷關系。這樣一來,我既獲得了包裝框架的簡單性,又具備了映射框架的大部分功能。ActiveRecord 易于使用和擴展。有時,甚至有些過于簡單。

與任何數據庫框架一樣,ActiveRecord 讓我極易做出很多惹麻煩的事。我所能獲取的列太多,又很容易遺漏重要的結構化數據庫特性,比如索引或空約束。我并不是說 ActiveRecord 是個不好的框架。只不過若是需要擴展,您需要知道如何堅固自己的應用程序。在本篇文章中,我將帶您親歷在使用 Rails 這一獨樹一幟的持久性框架時可能需要的一些重要優化。
基礎管理

生成受模式支持的模型異常容易,只需很少的代碼,即 script/generate model model_name。正如您所知,該命令可生成模型、遷移、單元測試甚至一個默認的 fixture。在該遷移中填上一些數據列,并輸入一些測試數據、編寫幾個測試、添加幾個驗證就算大功告成,這樣做真是很有誘惑力。但請您三思而行。您應該考慮總體的數據庫設計,要特別注意以下這些事情:

  •     Rails 不會讓您擺脫基本的數據庫性能問題。數據庫需要信息,這些信息經常以索引的格式才能有不錯的性能。
  •     Rails 不會讓您擺脫數據完整性問題。雖然大多數 Rails 開發人員都不喜歡在數據庫中保留限制,但您應該考慮像空列這樣的事情。
  •     Rails 為很多元素提供了方便的默認屬性。有時,像文本字段的長度這樣的默認屬性對于大多數實用的應用程序而言都會過大。
  •     Rails 不會強制您創建有效的數據庫設計。

在您繼續跋涉,深入學習 ActiveRecord 之前,應該首先確保您已經打好了足夠的基礎。請確保索引結構可以為您所用。如果給定的表很大,如果將在列上而不是 id 上搜索,如果索引能對您有所幫助(更多細節,請參見數據庫管理器文檔 ―― 不同的數據庫以不同方式使用索引),那么就需要創建索引。無需采用 SQL 創建索引 ―― 可以簡單地使用遷移創建。可以輕松地使用 create_table 遷移創建索引,也可以創建一個額外的遷移來創建索引。以下是一個遷移示例,可用來為 ChangingThePresent.org (請參見 參考資料)創建索引:
清單 1. 在遷移中創建索引

class AddIndexesToUsers < ActiveRecord::Migration def self.up  add_index :members, :login  add_index :members, :email  add_index :members, :first_name  add_index :members, :last_name end def self.down  remove_index :members, :login  remove_index :members, :email  remove_index :members, :first_name  remove_index :members, :last_name endend

ActiveRecord 會負責 id 上的索引,我顯式地添加了可在各種搜索中使用的索引,原因是此表很大、不經常更新卻經常被搜索。通常,我們會等到對給定的查詢中的問題有一定的把握后才會采取相應動作。這種策略可以讓我們不必二次猜測數據庫引擎。但從用戶這方面來看,我們知道該表將會很快具有數百萬的用戶,如果在經常搜索的列上沒有索引,該表的效率會很低。

另外兩個常見問題也與遷移有關。如果字符串和列都不應該為空,那么就請確保正確編寫了遷移。大多數 DBA(數據庫管理員)都會認為 Rails 為空列提供了錯誤的默認屬性:默認情況下列可以為空。如果希望創建一個不能為空的列,您必須顯式地添加參數 :null => false。如果具有字符串列,請務必確保編寫應用程序的限值。默認地,Rails 遷移會將 string 列按 varchar(255) 編碼。通常,這個值過于龐大。應該盡量保持能如實反應應用程序的數據庫結構。與提供無任何限制的 login 相反,如果應用程序限制 login 只能為 10 個字符,那么就應該相應地編寫數據庫,如清單 2 所示:
清單 2. 用限值和非空列編寫遷移

t.column :login, :string, :limit => 10, :null => false

此外,還應該考慮默認值以及其他任何能安全提供的信息。通過一點預備工作,就可以節省日后跟蹤數據完整性問題的大量時間。在考慮數據庫基礎的同時,還應該注意哪些頁是靜態且容易緩存的。在優化查詢和緩存頁面這兩個選項當中,如果您能 “消受” 復雜性,緩存頁面將會帶來更大的回報。有時,頁面或片段都是純靜態的,比如一列狀態或一組經常問到的問題。在這種情況下,緩存更勝一籌。而在其他的一些時候,您可能會決定犧牲數據庫性能,以減少復雜性。對于 ChangingThePresent,根據問題和環境的具體情況,我們二者都嘗試了。如果您也決定要犧牲查詢性能,就請繼續閱讀吧。
N+1 問題

默認情況下,ActiveRecord 關系十分懶散。這意味著框架會一直等待訪問關系直到您實際訪問了該關系。比方說,每個成員都會有一個地址。可以打開一個控制臺并輸入如下命令:member = Member.find 1。可以看到追加到日志的如下內容,如清單 3 所示:
清單 3. 從 Member.find(1) 登錄

^[[4;35;1mMember Columns (0.006198)^[[0m  ^[[0mSHOW FIELDS FROM members^[[0m^[[4;36;1mMember Load (0.002835)^[[0m  ^[[0;1mSELECT * FROM members WHERE (members.`id` = 1) ^[[0m

Member 具有到此地址的關系,并由宏 has_one :address, :as => :addressable, :dependent => :destroy 定義。注意當 ActiveRecord 加載了 Member 時,您并不會看到地址字段。但如果在控制臺中鍵入 member.address,就可以在 development.log 中看到清單 4 中的內容:
清單 4. 訪問關系會強制數據庫訪問

 ^[[36;2m./vendor/plugins/paginating_find/lib/paginating_find.rb:98:in `find'^[[0m^[[4;35;1mAddress Load (0.252084)^[[0m  ^[[0mSELECT * FROM addresses WHERE (addresses.addressable_id = 1 AND addresses.addressable_type = 'Member') LIMIT 1^[[0m ^[[35;2m./vendor/plugins/paginating_find/lib/paginating_find.rb:98:in `find'^[[0m

所以 ActiveRecord 并不會為地址關系執行查詢,直到您實際訪問 member.address。通常,這種懶散設計會工作得很好,因為持久性框架無需移動如此多的數據來加載成員。但如果您想要訪問很多成員以及所有成員的地址,如清單 5 所示:
清單 5. 用地址檢索多個成員

Member.find([1,2,3]).each {|member| puts member.address.city}

由于您應該看到針對每個地址的查詢,所以就性能而言,結果并不盡如人意。清單 6 給出了問題的全部:
清單 6. N+1 問題的查詢

^[[4;36;1mMember Load (0.004063)^[[0m  ^[[0;1mSELECT * FROM members WHERE (members.`id` IN (1,2,3)) ^[[0m ^[[36;2m./vendor/plugins/paginating_find/lib/paginating_find.rb:98:in `find'^[[0m^[[4;35;1mAddress Load (0.000989)^[[0m  ^[[0mSELECT * FROM addresses WHERE (addresses.addressable_id = 1 AND addresses.addressable_type = 'Member') LIMIT 1^[[0m ^[[35;2m./vendor/plugins/paginating_find/lib/paginating_find.rb:98:in `find'^[[0m^[[4;36;1mAddress Columns (0.073840)^[[0m  ^[[0;1mSHOW FIELDS FROM addresses^[[0m^[[4;35;1mAddress Load (0.002012)^[[0m  ^[[0mSELECT * FROM addresses WHERE (addresses.addressable_id = 2 AND addresses.addressable_type = 'Member') LIMIT 1^[[0m ^[[35;2m./vendor/plugins/paginating_find/lib/paginating_find.rb:98:in `find'^[[0m^[[4;36;1mAddress Load (0.000792)^[[0m  ^[[0;1mSELECT * FROM addresses WHERE (addresses.addressable_id = 3 AND addresses.addressable_type = 'Member') LIMIT 1^[[0m ^[[36;2m./vendor/plugins/paginating_find/lib/paginating_find.rb:98:in `find'^[[0m

結果正如我所預見的那樣糟糕。所有成員共用一個查詢,而每個地址各用一個查詢。我們檢索了三個成員,所以一共用了四個查詢。如果是 N 個成員,就會有 N+1 個查詢。這就是可怕的 N+1 問題。大多數持久性框架都采用熱關聯(eager association)來解決該問題。Rails 也不例外。如果需要訪問關系,就可以選擇將其包括到初始查詢中。ActiveRecord 使用 :include 選項來實現此目的。如果將查詢更改為 Member.find([1,2,3], :include => :address).each {|member| puts member.address.city},結果就會稍好一些:
清單 7. 解決 N+1 問題

^[[4;35;1mMember Load Including Associations (0.004458)^[[0m  ^[  [0mSELECT members.`id` AS t0_r0, members.`type` AS t0_r1,  members.`about_me` AS t0_r2, members.`about_philanthropy`  ...  addresses.`id` AS t1_r0, addresses.`address1` AS t1_r1,  addresses.`address2` AS t1_r2, addresses.`city` AS t1_r3,  ...  addresses.`addressable_id` AS t1_r8 FROM members  LEFT OUTER JOIN addresses ON addresses.addressable_id  = members.id AND addresses.addressable_type =  'Member' WHERE (members.`id` IN (1,2,3)) ^[  [0m ^[[35;2m./vendor/plugins/paginating_find/lib/paginating_find.rb: 98:in `find'^[[0m

該查詢的速度也會更快。一個查詢會檢索所有成員和地址。這就是熱關聯的工作原理。

通過 ActiveRecord,還可以嵌套 :include 選項,但嵌套深度只有一級。例如,有多個 contacts 的 Member 以及有一個 address 的 Contact 就屬于這種情況。如果想要為某個成員的聯系人顯示所有城市,就可以使用清單 8 中所示的代碼:
清單 8: 為某個成員的聯系人獲取城市

member = Member.find(1)member.contacts.each {|contact| puts contact.address.city}

該代碼應該能夠工作,但必須要針對此成員、每個聯系人以及每個聯系人的地址進行查詢。通過用 :include => :contacts 包括 :contacts,可以稍許提高性能。也可以通過將二者都包括進來進一步地改進,如清單 9 所示:
清單 9: 為某個成員的聯系人獲取城市

member = Member.find(1)member.contacts.each {|contact| puts contact.address.city}

通過使用嵌套包含選項還能獲得更好的改進:

member = Member.find(1, :include => {:contacts => :address})member.contacts.each {|contact| puts contact.address.city}

該嵌套包含可讓 Rails 熱包含 contacts 和 address 關系。一旦要在給定的查詢中使用關系,就可以采用熱加載技術。此技術是我們在 ChangingThePresent.org 中使用得最為頻繁的一種性能優化技術,但它還是有一些限制的。當必須要連接兩個以上的表時,最好還是采用 SQL。如果需要進行報告,最好是簡單地采取數據庫連接,跨過 ActiveRecord 以及 ActiveRecord::Base.execute("SELECT * FROM...")。通常來講,熱關聯足夠解決問題。現在,我將轉變話題,探討 Rails 開發人員所關心的另一個麻煩問題:繼承。
繼承和 Rails

當大多數 Rails 開發人員第一次接觸到 Rails 時,他們就會立刻被迷住。它太簡單了。您只需在數據庫表上創建一個 type 類,然后再從父類中繼承子類即可。Rails 會負責其余的事情。比如,有一個名為 Customer 表,它可以從名為 Person 類繼承。一個客戶可以有 Person 的所有列,外加信譽度和訂購歷史。清單 10 顯示了該種解決方案的簡潔之美。主表具有父類和子類的所有列。
清單 10. 實現繼承

create_table "people" do |t| t.column "type", :string t.column "first_name", :string t.column "last_name", :string t.column "loyalty_number", :stringendclass Person < ActiveRecord::Baseendclass Customer < Person has_many :ordersend

在很多方面,這種解決方案都可以很好地工作。代碼簡單且無重復性。這些查詢簡單且性能很好,因為您無需進行任何連接來訪問多個子類,ActiveRecord 可以使用 type 列決定哪個記錄能夠返回。

在某些方面,ActiveRecord 繼承十分有限。如果已有的繼承等級非常寬,繼承就會失效。例如,在 ChangingThePresent,內容有很多類型,每種類型都有自己的名稱、或短或長的描述、某些常見的表示屬性以及幾個定制屬性。我們很希望 cause、nonprofit、gift、member、drive、registry 以及其他一些類型的對象都能夠從通用的基類中繼承,以便我們能以同樣的方式處理所有類型的內容。但我們卻不能如此,因為 Rails 模型將會在單一表中擁有我們所有對象模型的實質內容,這不是一個可行的解決方案。
探索其他可選方案

我們針對此問題試驗了三種解決方案。第一,我們在類自身的表中放置每個類,使用視圖為內容構建通用表。我們很快拋棄了此種解決方案,因為 Rails 不能很好地處理數據庫視圖。

我們的第二個解決方案是使用簡單的多態。通過這種策略,每個子類都會擁有其自身的表。我們將通用列推入每個表。例如,比方說我需要一個名為 Content 的子類,它只包含 name 屬性,以及 Gift、Cause 和 Nonprofit 子類。Gift、Nonprofit 和 Cause 都可有 name 屬性。由于 Ruby 是動態類型的,所以這些子類無需從通用基類中繼承。它們只需對相同的一組方法進行響應。ChangingThePresent 在幾個地方使用了多態以提供通用的行為,尤其是在處理圖像的時候。

第三種方法是提供一種通用的功能,但采用的是關聯而非繼承。ActiveRecord 具有一種稱為多態關聯的特性,非常適合將通用行為附加給類,完全無需繼承。在之前的 Address,您已經看到了多態關聯的示例。我可以使用相同的技術(而非繼承)附加通用屬性用于內容管理。考慮名為 ContentBase 的類。通常,為了將該類關聯到另一個類,可以使用 has_one 關系和一個簡單的外鍵。但您可能更想讓 ContentBase 能與多個類共同工作。這時,您需要一個外鍵,還需要一個能定義目標類的類型的列。而這恰好是 ActiveRecord 多態關聯所擅長的方面。請參看清單 11。
清單 11. 站點內容關系的兩個方面

class Cause < ActiveRecord::Base has_one :content_base, :as => :displayable, :dependent => :destroy ...endclass Nonprofit < ActiveRecord::Base has_one :content_base, :as => :displayable, :dependent => :destroy ...endclass ContentBase < ActiveRecord::Base belongs_to :displayable, :polymorphic => trueend

通常,belongs_to 關系只有一個類,但 ContentBase 中的關系卻是多態的。外鍵不僅具有標識記錄的標識符,而且還具有標識表的一個類型。使用這種技術,我獲得了繼承的諸多益處。常見的功能在單一類中就都包括了。但這也帶來了幾個副作用。我無需將 Cause 和 Nonprofit 中的所有列都放在單一表中。

一些數據庫管理員不太看好多態關聯,原因是他們不怎么使用真正意義上的外鍵,但對于 ChangingThePresent,我們自由地使用了多態關聯。實際上,數據模型并不像理論上那樣美好。不能使用諸如引用完整性這樣的數據庫特性,也不能依賴于工具來基于列的名稱發現這些關系。簡潔的對象模型的好處對我們來說要比此方式所存在的問題更為重要。

create_table "content_bases", :force => true do |t| t.column "short_description",     :string ... t.column "displayable_type", :string t.column "displayable_id",  :integerend

結束語

ActiveRecord 是一種功能完善的持久性框架。用它可以構建可伸縮的可靠系統,但與其他數據庫框架一樣,您必須要格外注意框架所生成的 SQL。當偶爾遇到問題時,您必須調整自己的方式和策略。保留索引、借助 include 使用熱加載和在某些地方使用多態關聯代替繼承是三種可用來改進代碼庫的方法。在下月,我將帶您親歷另一個示例去領略如何編寫真實世界中的 Rails。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
在线一区av| 成片免费观看| 九一精品国产| 欧美在线观看视频一区| 中文字幕日韩第一页| 欧美一级搡bbbb搡bbbb| 精品久久九九| 日韩欧美999| 免费在线亚洲| 午夜一区二区视频| 91精品久久久久| 日韩精品一级| 黄色国产在线| 国产偷久久久精品专区| 国产在线欧美日韩| 久久69成人| 91九色在线看| 亚洲国产欧美日韩在线| 深夜福利一区二区| 日韩av二区| 精品国产乱码久久久久久牛牛| 中文字幕最新精品| 久久中文免费视频| 91精品国产91久久久| 精品日韩欧美在线| 亚洲 欧美 中文字幕| 国产在线观看精品| 一区二区91| 国产一区精品| 中文字幕高清在线播放| 日韩欧美国产免费播放| 91精品观看| 久久精品日韩无码| 日韩中文字幕国产| 91精品在线免费观看| 91精品久久久久久久91蜜桃| 国产网站欧美日韩免费精品在线观看 | 国产视频一区二| 日韩美女视频一区二区在线观看| 日韩在线播放一区二区| 青青国产91久久久久久| 欧美日韩国产中字| 又黄又www的网站| 成人无遮挡免费网站视频在线观看| 欧美高清一级片在线| 欧美日韩精品综合在线| 国产日韩中文字幕在线| 日韩中文字幕视频在线| 日韩亚洲欧美中文三级| 韩国av一区二区| 久久在线91| www..com日韩| 国产99在线 | 亚洲| 亚洲福利在线视频| 91一区二区| 国产区高清在线| 国产导航在线| 国产99在线 | 亚洲| 天天综合天天| 中文字幕在线观看国产| 高清1区2区| 欧美一级欧美三级在线观看| 日韩国产成人| 久久 天天综合| 中文字幕成人乱码在线电影| 欧美日韩一级黄| 日韩欧美在线中文字幕| 国产激情在线播放| 欧美日韩国产高清一区| 欧美一级免费在线观看| 国产三级在线播放| 日韩在线一区二区| 日韩精品在线看| 国产黄在线看| 亚洲黄色www| 国产午夜精品一区二区三区视频| 国产激情在线观看| 中文字幕精品国产| 一区二区三区精品99久久| 日韩免费视频| 一区二区精品| 国产一区不卡在线| 91精品国产综合久久久久久 | 精品日韩在线| 亚洲国内精品视频| 欧美在线视频一区二区| 欧美在线中文字幕| 欧美日韩高清在线| 国产日韩第一页v| 欧美一级在线观看| 久久99久久久久久久噜噜| 亚洲欧洲三级| 亚洲三级网站| 91精品国产高清| 国产劲爆久久| 国产欧美日韩91| 精品久久在线| 亚洲一区二区三区精品中文字幕| 国产小视频在线| 色一区在线观看| 69av亚洲| 欧美日韩亚洲综合| 精品国产欧美日韩| 婷婷综合福利| 日韩欧美亚洲国产一区| 日韩欧美三级| 91久久中文| 日韩欧美一级视频| 1024国产在线| 在线三级av| 红桃视频亚洲| 国产劲爆久久| 91精品国产日韩91久久久久久| 亚洲免费在线观看av| 国产欧美久久久精品免费| 久久中文免费视频| 中文字幕高清在线播放| 尤物在线精品| 国产欧美日韩在线看| 色偷偷一区二区三区| 国产午夜在线观看| 一区二区精品区| 欧美日韩精品综合| 国产美女主播视频一区| 美女在线视频一区| av免费在线网站| 精品日韩视频| 一区视频在线播放| 综合图区亚洲白拍在线| 欧美日韩免费精品| 最新中文字幕在线| 午夜私人影院在线观看| 国产欧美日韩最新| 国产三级在线观看视频| 精品国产999| 日韩精品在线私人| 久久久精品免费免费| 国产成人精品免费在线| 在线观看精品国产| 日韩色在线观看| 精品免费久久久| 欧美不卡一二三| 日韩午夜一区| 日韩中文字幕二区| 黄色在线播放网站| 日韩精品视频免费| 国产99在线|亚洲| 国产高潮久久久| 国产91久久久久蜜臀青青天草二 | 精品久久久91| www中文字幕| 欧美亚洲免费高清在线观看| 伊人国产视频| 国产在成人精品线拍偷自揄拍| 久久久精品国产免费观看同学| 一区视频在线播放| 中文字幕2020第一页| 亚洲国产一区自拍| 日韩欧美不卡视频| 不卡一区2区| 亚洲欧洲国产视频| 中文字幕第一页在线播放| 欧美熟妇乱码在线一区| 日韩欧美中文字幕在线观看| 亚洲羞羞网站| 国产成人va亚洲电影| 久久精品卡一| 日韩 欧美 亚洲| 日韩中文首页| 日韩精品高清不卡| 久久久91精品国产| 国产91大片| 欧美专区中文字幕| 欧美一级免费看| 国产高清视频一区二区| 中文字幕在线视频网| 亚洲第一页中文字幕| 日韩精品视频网| 黄色一区二区在线| 91精品久久久久| 欧美久久久精品| 免费视频一区三区| 日韩视频在线一区二区| 欧美性生交大片免费| 久久99久久久久| 中文字幕在线观看欧美| 日韩在线 中文字幕| 欧美国产三级| 日韩在线 中文字幕| 日韩欧美在线1卡| 国产三级中文字幕| 色99中文字幕| 中文精品视频| 国产高清大尺度一区二区不卡| 亚洲成年人影院在线| 国产在线拍揄自揄拍| 亚洲人线精品午夜| 91欧美日韩在线| 精品久久久91| 一区二区三区免费看视频| 国产午夜在线观看| 日韩在线精品视频| 久久久精品国产99久久精品芒果| 欧美激情视频一区二区三区在线播放 | 视频一区二区国产| 亚洲免费精品| 91一区二区| 中文字幕亚洲一区二区av在线| 中文字幕在线视频日韩| aaa欧美日韩| 国产欧美日韩高清| 本道综合精品| 日韩精品视频在线播放| 日韩中文字幕在线一区| 中文字幕一区免费| 日韩精品视频中文字幕| 欧美三级网址| 久久精品夜夜夜夜久久| 亚洲黄色一区二区| 久久99蜜桃精品| 日韩欧美国产亚洲| 中文av字幕一区| 欧美婷婷精品激情| 国产欧美日韩不卡| 伊人永久在线| 亚洲 国产 欧美 日韩| 欧美午夜影院在线视频| 一区在线免费| 欧美色视频一区二区三区在线观看| 亚洲福利精品在线| 一区二区三区视频网站| 日韩视频中文字幕| 91精品国产综合久久久久久漫画| 亚洲丝袜一区| 欧美一级二级三级区| a级在线免费观看| wwwwww国产| 中文字幕在线观看国产| 国产视频2区| 国产日韩精品在线看| 国产视频2区| 国产婷婷一区二区| 91精品久久久久久蜜臀| 国产免费一级片| 精品欧美日韩在线| 成年人黄国产| 国产一级一片免费播放| 欧美日韩激情一区二区三区| 欧美日韩综合在线免费观看| 国产不卡视频在线| 国产欧美久久久久久久久| 中文字幕久精品免费视频| 最新日韩中文字幕| 日本精品专区| 欧美日韩中文国产| 日韩欧美国产成人一区二区| 欧美日韩激情一区二区三区| 国产福利三区| 中文字幕在线导航| 91精品啪在线观看国产60岁 | 黄色国产网站在线观看| 精品三级av| 高清中文字幕在线| 午夜国产在线| 亚洲娇小xxxx欧美娇小| 日韩免费看网站| 三级精品视频| 一区二区三区在线|网站| 国产 欧美 在线| 男人的天堂网av| 日韩欧美在线中字| 日韩不卡在线观看| 99精品视频99| 九色蝌蚪视频在线| 欧美日韩国产免费观看视频| 亚洲专区一区| 一区二区三区在线不卡| 在线视频一区二区三区在线播放| 在线看av的网址| 欧美日韩在线国产| 欧美日韩一级视频| 精品国产乱码一区二区| 日韩欧美中文字幕精品| 日韩wumaV| 欧美日韩亚洲视频| 成人禁用看黄a在线| 国产在线二区| av中文在线播放| 91精品国产91| 日韩在线播放一区二区| 日韩国产欧美| 国产 欧美 日韩 在线| 亚洲视频 中文字幕| 尤物av一区二区| 第一页在线观看| 国产中文在线| www在线播放| 最近中文字幕在线中文高清版| 精品亚洲永久免费| 青青国产91久久久久久| 最近中文字幕第一页| 日韩在线欧美| 欧美激情一区二区在线| 91精品免费观看| 日本一级一片免费视频| 97国产视频| 中文字幕不卡三区| 日韩av综合在线观看| 黄色一区二区视频| 欧美日韩国产黄色| 欧美日韩精品在线观看| 亚洲成a人片在线www| 国产一级粉嫩xxxx| 一区二区高清视频| 日韩欧美高清在线| 欧美日韩国产一级片| 国产黄色网页| 国产字幕中文| 91精品久久久久久久久久| 国产蜜臀在线| 日韩欧美看国产| 欧美日韩精品免费看| 欧美日韩人人澡狠狠躁视频| 欧美日韩精品免费在线观看视频| 国产欧美一级| 一区二区三区在线播放视频| 亚洲成av人片| 国产欧美日韩第一页| 日韩欧美字幕| 深夜福利亚洲| 欧美99久久| 国产日韩精品在线| 免费视频最近日韩| 日韩欧美亚洲区| www在线视频| 国产在线欧美日韩| www.久久久精品| 欧美日韩国产免费观看视频| 日韩在线视频一区二区三区| 欧美精选午夜久久久乱码6080| 日韩欧美中文字幕在线视频| 精品在线网站观看| www.中文字幕在线观看| 精品日韩一区二区三区免费视频| 欧美日韩精品综合| 中文字幕最新精品| 91精品国产综合久久久久久| 欧美日韩性视频一区二区三区 | 91精品婷婷国产综合久久竹菊| 亚洲高清免费一级二级三级| 欧美久久综合性欧美| 精品福利二区三区| 欧美日韩一二三| 欧美三级在线视频| 国产小视频在线观看| 国产激情在线播放| 影音先锋中文字幕在线观看| 91精品国产欧美日韩| 99久久婷婷| 最新中文字幕在线播放| 亚洲欧美日本另类| 午夜成人鲁丝片午夜精品| 中文字幕久久精品| 天天综合天天添夜夜添狠狠添| 一本久久a久久精品亚洲| 午夜av一区二区| 精品国产不卡一区二区| 久久精品蜜桃| 成年人看的羞羞网站| 欧美不卡视频一区发布| 国产高清不卡av| 色综合天天综合网国产成人综合天| 亚洲第一页中文字幕| 一区二区三区精品在线| 51精品免费网站| 中文字幕在线播出| 久久99精品国产| 亚洲视频日韩| 樱花草www在线| www日韩在线观看| 国产视频一二区| 国产丝袜欧美中文另类| 亚洲综合在线视频| 在线视频你懂得一区| 久久久久久久久99精品| 91精品国产91久久久久青草| 91精品国产综合久久久久久| 亚洲乱码中文字幕综合| 在线视频色在线| 日韩在线视频网| 91精品久久久久久久久久| 亚洲高清在线免费| 国产一卡2卡3卡四卡网站| www..com日韩| 日韩区欧美区| 日韩欧美在线第一页| 日韩三级视频中文字幕| 九色蝌蚪视频在线| 日韩欧美999| 在线观看一区|