精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

加速Ruby on Rails 消除N+1查詢問題

開發 后端
Ruby語言常以其靈活性為人所稱道,而Ruby on Rails擴展了核心Ruby語言,這樣一來,無需太多樣板或額外的代碼就可以輕松編寫高度結構化的程序:無需額外工作,就可以獲得大量標準的行為。

Ruby語言常以其靈活性為人所稱道。正如Dick Sites所言,您可以 “為了編程而編程”。Ruby on Rails擴展了核心Ruby 語言,但正是 Ruby 本身使得這種擴展成為了可能。

Ruby on Rails使用了該語言的靈活性,這樣一來,無需太多樣板或額外的代碼就可以輕松編寫高度結構化的程序:無需額外工作,就可以獲得大量標準的行為。雖然這種輕松自由的行為并不總是完美的,但畢竟您可以無需太多工作就可以獲得很多好的架構。

例如,Ruby on Rails 基于模型-視圖-控制器(Model-View-Controller,MVC)模式,這意味著大多數 Rails 應用程序都可以清晰地分成三個部分。模型部分包含了管理應用程序數據所需的行為。

通常,在一個 Ruby on Rails 應用程序中,模型和數據庫表之間的關系是 1:1;Ruby on Rails 默認使用的對象關系映射(ORM)ActiveRecord 負責管理模型與數據庫的交互,這意味著 Ruby on Rails 程序通常都具有(如果有的話)很少量的 SQL 代碼。

第二個部分是視圖,它包含創建發送至用戶的輸出所需要的代碼;它通常由 HTML、JavaScript 等組成。

最后的一個部分是控制器,它將來自用戶的輸入轉變為正確的模型,然后使用適當的視圖呈現響應。

Rails 的倡導者通常都樂于將其易用性方面的提高歸功于 MVC 范型 — 以及 Ruby 和 Rails 二者的其他一些特性,并稱很少有程序員能夠在較短的時間內創建更多的功能。當然,這意味著投入到軟件開發的成本將能夠產生更多的商業價值,因此 Ruby on Rails 開發愈發流行。

不過,最初的開發成本并不是事情的全部,還有其他的后續成本需要考慮,比如應用程序運行的維護成本和硬件成本。Ruby on Rails 開發人員通常會使用測試和其他的敏捷開發技術來降低維護成本,但是這樣一來,很容易忽視具有大量數據的 Rails 應用程序的有效運行。雖然 Rails 能夠簡化對數據庫的訪問,但它并不總是能夠如此有效。

Rails 應用程序為何運行緩慢?

Rails 應用程序之所以運行緩慢,其中有幾個很基本的原因。第一個原因很簡單:Rails 總是會做一些假設為您加速開發。通常,這種假設是正確而有幫助的。不過,它們并不總能有益于性能,并且還會導致資源使用的效率低下 — 尤其是數據庫資源。

例如,使用等同于 SELECT * 的一個 SQL 語句,ActiveRecord 會默認選擇查詢上的所有字段。在具有為數眾多的列的情況下 — 尤其是當有些字段是巨大的 VARCHAR 或 BLOB 字段時 — 就內存使用和性能而言這種行為很有問題。

另一個顯著的挑戰是 N+1 問題,本文將對此進行詳細的探討。這會導致很多小查詢的執行,而不是一個單一的大查詢。例如,ActiveRecord 無從知道一組父記錄中的哪一個會請求一個子記錄,所以它會為每個父記錄生成一個子記錄查詢。由于每查詢的負荷,這種行為將導致明顯的性能問題。

其他的挑戰則更多地與 Ruby on Rails 開發人員的開發習慣和態度相關。由于 ActiveRecord 能夠讓如此眾多的任務變得輕而易舉,Rails 開發人員常常會形成 “SQL 不怎樣” 的一種態度,即便在更適合使用 SQL 的時候,也會避免 SQL。創建和處理數量巨大的 ActiveRecord 對象的速度會非常緩慢,所以在有些情況下,直接編寫一個無需實例化任何對象的 SQL 查詢會更快些。

由于 Ruby on Rails 常被用來降低開發團隊的規模,又由于 Ruby on Rails 開發人員通常都會執行部署和維護生產中的應用程序所需的一些系統管理任務,因此若對應用程序的環境知之甚少,就很可能出問題。操作系統和數據庫有可能未被正確設置。比如,雖然并不最優,MySQL my.cnf 設置常常在 Ruby on Rails 部署內保留它們的默認設置。此外,可能還會缺少足夠的監控和基準測試工具來提供性能的長期狀況。當然,這并不是在責怪 Ruby on Rails 開發人員;這是非專業化導致的后果;在有些情況下,Rails 開發人員有可能是這兩個領域的專家。

最后一個問題是 Ruby on Rails 鼓勵開發人員在本地環境中進行開發。這么做有幾個好處 — 比如,開發延遲的減少和分布性的提高 — 但它并不意味著您可以因為工作站規模的減少而只處理有限的數據集。他們如何開發以及代碼將被部署于何處之間的差異可能會是一個大問題。即便您在一個性能良好的輕載本地服務器上處理小規模的數據已經很長一段時間,也會發現對于擁塞的服務器上的大型數據此應用程序會有很明顯的性能問題。

當然,Rails 應用程序具有性能問題的原因可能有很多。查出 Rails 應用程序有何潛在性能問題的最佳方法是,利用能為您提供可重復、準確度量的診斷工具。

檢測性能問題

最好的工具之一是 Rails 開發日志,它通常位于每個開發機器上的 log/development.log 文件內。它具有各種綜合指標:響應請求所花費的總時間、花費在數據庫內的時間所占的百分比、生成視圖所花時間的百分比等。此外,還有一些工具可用來分析此日志文件,比如 development-log-analyzer。 在生產期間,通過查看 mysql_slow_log 可以找到很多有價值的信息。

其中一個最強大也是最為有用的工具是 query_reviewer 插件。這個插件可顯示在頁面上有多少查詢在執行以及頁面生成需要多長時間。并且它還會自動分析 ActiveRecord 生成的 SQL 代碼以便發現潛在問題。

例如,它能找到不使用 MySQL 索引的查詢,所以如果您忘記了索引一個重要的列并由此造成了性能問題,那么您將能很容易地找到這個列。此插件在一個彈出的

(只在開發模式下可見)中顯示了所有這類信息。

最后,不要忘記使用類似 Firebug、yslow、Ping 和 tracert 這樣的工具來檢測性能問題是來自于網絡還是資源加載問題。接下來,讓我們來看具體的一些 Rails 性能問題及其解決方案。

#p#

N+1 查詢問題

N+1 查詢問題是 Rails 應用程序最大的問題之一。例如,清單 1 內的代碼能生成多少查詢?此代碼是一個簡單的循環,遍歷了一個假想的 post 表內的所有 post,并顯示 post 的類別和它的主體。

  1. 清單 1. 未優化的 Post.all 代碼  
  2. <%@posts = Post.all(@posts).each do |p|%>   
  3.  <h1><%=p.category.name%>h1> 
  4.  <p><%=p.body%>p> 
  5. <%end%> 

答案:上述代碼生成了一個查詢外加 @posts 內的每行一個查詢。由于每查詢的負荷,這可能會成為一個很大的挑戰。罪魁禍首是對 p.category.name 的調用。這個調用只應用于該特定的 post 對象,而不是整個 @posts 數組。幸好,通過使用立即加載,我們可以修復這個問題。

立即加載 意味著 Rails 將自動執行所需的查詢來加載任何特定子對象的對象。Rails 將使用一個 JOIN SQL 語句或一個執行多個查詢的策略。不過,假設指定了將要使用的所有子對象,那么將永遠不會導致 N+1 的情形,在 N+1 情形下,一個循環的每個迭代都會生成額外的一個查詢。清單 2 是對 清單 1 內代碼的修訂,它使用了立即加載來避免 N+1 問題。

  1. 清單 2. 用立即加載優化后的 Post.all 代碼  
  2. <%@posts = Post.find(:all, :include=>[:category]  
  3.  @posts.each do |p|%>   
  4.  <h1><%=p.category.name%>h1> 
  5.  <p><%=p.body%>p> 
  6. <%end%> 

該代碼最多生成兩個查詢,而不管在此 posts 表內有多少行。當然,并不是所有情況都如此簡單。處理復雜的 N+1 查詢情況需要更多的工作。那么做這么多努力值得么?讓我們來做一些快速的測試。

測試 N+1

使用清單 3 內的腳本,可以發現查詢可以達到 — 多慢 — 或多快。 清單 3 展示了如何在一個獨立腳本中使用 ActiveRecord 來建立一個數據庫連接、定義表并加載數據。然后,可以使用 Ruby 的內置基準測試庫來查看哪種方式更快,快多少。

  1. 清單 3. 立即加載基準測試腳本  
  2. require 'rubygems'  
  3. require 'faker'  
  4. require 'active_record'  
  5. require 'benchmark'  
  6.  
  7. # This call creates a connection to our database.  
  8.  
  9. ActiveRecord::Base.establish_connection(  
  10.  :adapter  => "mysql",  
  11.  :host     => "127.0.0.1",  
  12.  :username => "root", # Note that while this is the default setting for MySQL,  
  13.  :password => "",     # a properly secured system will have a different MySQL  
  14.                             # username and password, and if so, you'll need to  
  15.                             # change these settings.  
  16.  :database => "test")  
  17.  
  18. # First, set up our database...   
  19. class Category <  ActiveRecord::Base 
  20. end  
  21.  
  22. unless Category.table_exists?  
  23.  ActiveRecord::Schema.define do  
  24.   create_table :categories do |t|  
  25.     t.column :name, :string  
  26.   end  
  27.  end   
  28. end  
  29.  
  30. Category.create(:name=>'Sara Campbell\'s Stuff')  
  31. Category.create(:name=>'Jake Moran\'s Possessions')  
  32. Category.create(:name=>'Josh\'s Items')  
  33. number_of_categories = Category.count  
  34.  
  35. class Item <  ActiveRecord::Base   
  36.  belongs_to :category   
  37. end  
  38.  
  39. # If the table doesn't exist, we'll create it.  
  40.  
  41. unless Item.table_exists?  
  42.  ActiveRecord::Schema.define do  
  43.   create_table :items do |t|  
  44.     t.column :name, :string  
  45.     t.column :category_id, :integer   
  46.   end  
  47.  end   
  48. end  
  49.  
  50. puts "Loading data..."  
  51.  
  52. item_count = Item.count  
  53. item_table_size = 10000 
  54.  
  55. if item_count < item_table_size 
  56.  (item_table_size - item_count).times do  
  57.   Item.create!(:name=>Faker.name,   
  58.                  :category_id=>(1+rand(number_of_categories.to_i)))  
  59.  end  
  60. end  
  61.  
  62. puts "Running tests..."  
  63.  
  64. Benchmark.bm do |x|   
  65.  [100,1000,10000].each do |size|   
  66.   x.report "size:#{size}, with n+1 problem" do   
  67.    @items=Item.find(:all, :limit=>size)  
  68.    @items.each do |i|   
  69.     i.category  
  70.    end   
  71.   end   
  72.   x.report "size:#{size}, with :include" do   
  73.    @items=Item.find(:all, :include=>:category, :limit=>size)  
  74.    @items.each do |i|   
  75.     i.category  
  76.    end   
  77.   end   
  78.  end   
  79. end 

這個腳本使用 :include 子句測試在有和沒有立即加載的情況下對 100、1,000 和 10,000 個對象進行循環操作的速度如何。為了運行此腳本,您可能需要用適合于您的本地環境的參數替換此腳本頂部的這些數據庫連接參數。此外,需要創建一個名為 test 的 MySQL 數據庫。最后,您還需要 ActiveRecord 和 faker 這兩個 gem,二者可通過運行 gem install activerecord faker 獲得。 在我的機器上運行此腳本生成的結果如清單 4 所示。

  1. 清單 4. 立即加載的基準測試腳本輸出  
  2. -- create_table(:categories)  
  3.   -> 0.1327s  
  4. -- create_table(:items)  
  5.   -> 0.1215s  
  6. Loading data...  
  7. Running tests...  
  8.    user     system      total        real  
  9. size:100, with n+1 problem  0.030000   0.000000   0.030000 (  0.045996)  
  10. size:100, with :include  0.010000   0.000000   0.010000 (  0.009164)  
  11. size:1000, with n+1 problem  0.260000   0.040000   0.300000 (  0.346721)  
  12. size:1000, with :include  0.060000   0.010000   0.070000 (  0.076739)  
  13. size:10000, with n+1 problem  3.110000   0.380000   3.490000 (  3.935518)  
  14. size:10000, with :include  0.470000   0.080000   0.550000 (  0.573861) 

在所有情況下,使用 :include 的測試總是更為迅速 — 分別快 5.02、4.52 和 6.86 倍。當然,具體的輸出取決于您的特定情況,但立即加載可明顯導致顯著的性能改善。

#p#

嵌套的立即加載

如果您想要引用一個嵌套的關系 — 關系的關系,又該如何呢? 清單 5 展示了這樣一個常見的情形:循環遍歷所有的 post 并顯示作者的圖像,其中 Author 與 Image 是 belongs_to 的關系。

  1. 清單 5. 嵌套的立即加載用例  
  2. @posts = Post.all   
  3. @posts.each do |p|    
  4.  <h1><%=p.category.name%>h1> 
  5.  <%=image_tag p.author.image.public_filename %>   
  6.  <p><%=p.body%>   
  7.  <%end%>  


此代碼與之前一樣亦遭遇了相同的 N+1 問題,但修復的語法卻沒有那么明顯,因為這里所使用的是關系的關系。那么如何才能立即加載嵌套關系呢?正確的答案是使用 :include 子句的哈希語法。清單 6 給出了使用哈希語法的一個嵌套的立即加載。

  1. 清單 6. 嵌套的立即加載解決方案  
  2. @posts = Post.find(:all, :include=>:category=>[],  
  3.         :author=>:image=>[]}} )  
  4. @posts.each do |p|    
  5.  <h1><%=p.category.name%>h1> 
  6.  <%=image_tag p.author.image.public_filename %>   
  7.  <p><%=p.body%>   
  8.  <%end%>  

正如您所見,您可以嵌套哈希和數組實量(literal)。請注意在本例中哈希和數組之間的惟一區別是哈??梢院星短椎淖訔l目,而數組則不能。否則,二者是等效的。

間接的立即加載

并非所有的 N+1 問題都能很容易地察覺到。例如,清單 7 能生成多少查詢?

  1. 清單 7. 間接的立即加載示例用例  
  2. <%@user = User.find(5)  
  3.     @user.posts.each do |p|%>     
  4.       <%=render :partial=>'posts/summary',  :locals=>:post=>p  
  5.      %> <%end%> 


當然,決定查詢的數量需要對 posts/summary partial 有所了解。清單 8 中顯示了這個 partial。

  1. 清單 8. 間接立即加載 partial: posts/_summary.html.erb   
  2. <h1><%=post.user.name%>h1> 

 

不幸的是,答案是 清單 7 和 清單 8 在 post 內每行生成一個額外查詢,查找用戶的名字 — 即便 post 對象由 ActiveRecord 從一個已在內存中的 User 對象自動生成。簡言之,Rails 并不能關聯子記錄與其父記錄。

修復方法是使用自引用的立即加載?;旧?,由于 Rails 重載由父記錄生成的子記錄,所以需要立即加載這些父記錄,就如同父與子記錄之間是完全分開的關系一樣。代碼如清單 9 所示。

  1. 清單 9. 間接的立即加載解決方案  
  2. <%@user = User.find(5, :include=>{:posts=>[:user]})  
  3. ...snip... 

 

雖然有悖于直覺,但這種技術與上述技術的工作原理大致相似。但是,很容易使用這種技術進行過多的嵌套,尤其是在體系結構復雜的情況下。簡單的用例還好,比如 清單 9 內所示的,但繁復的嵌套也會出問題。在一些情況下,過多地加載 Ruby 對象有可能會比處理 N+1 問題還要緩慢 — 尤其是當每個對象并沒有被整個樹遍歷時。在該種情況下,N+1 問題的其他解決方案可能更為適合。

一種方式是使用緩存技術。Rails V2.1 內置了簡單的緩存訪問。使用 Rails.cache.read、 Rails.cache.write 及相關方法,可以輕松創建自己的簡單緩存機制,并且后端可以是一個簡單的內存后端、一個基于文件的后端或一個分布式緩存服務器。

當然,并不是所有的 Rails 問題都與查詢的數量有關。

#p#

Rails 分組和聚合計算

您可能遇到的一個問題是在 Ruby 所做的工作本應由數據庫完成。這考驗了 Ruby 的強大程度。很難想象在沒有任何重大激勵的情況下人們會自愿在 C 中重新實現其數據庫代碼的各個部分,但很容易在 Rails 內對 ActiveRecord 對象組進行類似的計算。但是,Ruby 總是要比數據庫代碼慢。所以請不要使用純 Ruby 的方式執行計算,如清單 10 所示。

  1. 清單 10. 執行分組計算的不正確方式  
  2. all_ages = Person.find(:all).group_by(&:age).keys.uniq  
  3. oldest_age = Person.find(:all).max 

相反,Rails 提供了一系列的分組和聚合函數。可以像清單 11 所示的那樣使用它們。

  1. 清單 11. 執行分組計算的正確方式  
  2. all_ages = Person.find(:all, :group=>[:age])    
  3. oldest_age = Person.calcuate(:max, :age) 

ActiveRecord::Base#find 有大量選項可用于模仿 SQL。更多信息可以在 Rails 文檔內找到。注意,calculate 方法可適用于受數據庫支持的任何有效的聚合函數,比如 :min、:sum 和 :avg。此外,calculate 能夠接受若干實參,比如 :conditions。查閱 Rails 文檔以獲得更詳細的信息。

不過,并不是在 SQL 內能做的所有事情在 Rails 內也能做。如果插件不夠,可以使用定制 SQL。

用 Rails 定制 SQL

假設有這樣一個表,內含人的職業、年齡以及在過去一年中涉及到他們的事故的數量??梢允褂靡粋€定制 SQL 語句來檢索此信息,如清單 12 所示。

  1. 清單 12. 用 ActiveRecord 定制 SQL 的例子  
  2. sql = "SELECT profession,  
  3.               AVG(age) as average_age,    
  4.               AVG(accident_count)   
  5.          FROM persons   
  6.         GROUP   
  7.            BY profession"  
  8.  
  9. Person.find_by_sql(sql).each do |row|     
  10.   puts "#{row.profession}, " << 
  11.        "avg. age: #{row.average_age}, " << 
  12.        "avg. accidents: #{row.average_accident_count}"  
  13. end 

這個腳本應該能生成清單 13 所示的結果。

  1. 清單 13. 用 ActiveRecord 定制 SQL 的輸出  
  2. Programmer, avg. age: 18.010, avg. accidents: 9  
  3. System Administrator, avg. age: 22.720, avg. accidents: 8 

當然,這是最簡單的例子。您可以自己想象一下如何能將此例中的 SQL 擴展成一個有些復雜性的 SQL 語句。您還可以使用 ActiveRecord::Base.connection.execute 方法運行其他類型的 SQL 語句,比如 ALTER TABLE 語句,如清單 14 所示。

  1. 清單14. 用 ActiveRecord 定制非查找型 SQL  
  2. ActiveRecord::Base.connection.execute "ALTER TABLE some_table CHANGE COLUMN..." 

大多數的模式操作,比如添加和刪除列,都可以使用 Rails 的內置方法完成。但如果需要,也可以使用執行任意 SQL 代碼的能力。

結束語

與所有的框架一樣,如果不多加小心和注意,Ruby on Rails 也會遭遇性能問題。所幸的是,監控和修復這些問題的技術相對簡單且易學,而且即便是復雜的問題,只要有耐心并對性能問題的源頭有所了解,也是可以解決的。

原文作者:David Berube

原文鏈接:http://www.ibm.com/developerworks/cn/opensource/os-railsn1/index.html

【編輯推薦】

  1. Ruby on Rails性能優化七劍
  2. 基于Ruby On Rails開發高品質Web應用
  3. Ruby on Rails應用技巧全解析
  4. 大改動小變化 Ruby On Rails 3蓄勢待發
  5. 跑起來吧 Ruby on Rails開發初體驗
責任編輯:王曉東 來源: IBM DW
相關推薦

2010-09-06 09:03:17

SQLselect語句

2023-06-13 18:27:29

數量Java定期測試

2019-05-24 08:36:33

MySQL查詢SQL

2009-08-27 10:21:22

Ruby on Rai

2009-08-06 09:13:36

Ruby on Rai

2018-11-30 08:38:24

裁員互聯網電商

2013-02-26 09:42:09

RailsRuby

2010-07-27 09:06:11

Ruby on Rai

2009-02-26 08:42:31

聯想裁員賠償標準

2009-12-17 14:29:50

Ruby on Rai

2015-10-14 17:27:18

性能

2009-12-14 15:30:43

安裝Ruby on R

2009-12-16 16:37:59

Ruby on Rai

2015-10-10 11:00:05

RubyRails性能

2009-12-17 17:37:42

Ruby on Rai

2009-12-16 17:37:31

Ruby on Rai

2010-09-25 14:39:29

Bruce Tate

2009-12-16 15:41:10

Ruby on Rai

2009-12-16 15:23:33

Ruby on rai

2013-03-28 12:42:02

RubyRails
點贊
收藏

51CTO技術棧公眾號

日韩成人在线电影网| 欧美日韩加勒比精品一区| 91日本视频在线| 久久99久久98精品免观看软件| 超碰精品在线观看| 精品国产福利视频| 亚洲天堂电影网| 高潮毛片7777777毛片| 久久国产毛片| 九九综合九九综合| 国产高清一区二区三区四区| 欧美女激情福利| 亚洲人成电影网站色mp4| 国产精品一区二区三区免费 | 亚洲欧美色图小说| 精品一区二区三区自拍图片区| 中文字幕av资源| 极品日韩av| 最新亚洲国产精品| 又黄又爽的网站| 宅男噜噜噜66国产精品免费| 欧美日韩国内自拍| 国产精品视频网站在线观看 | 久久婷婷国产综合精品青草 | 国产精品-色哟哟| 国产视频一区在线观看一区免费| 久久精品久久久久久国产 免费| 天天插天天射天天干| 狂野欧美xxxx韩国少妇| 在线观看www91| 日本韩国欧美在线观看| 成年人黄视频在线观看| 久久精品一区八戒影视| 91精品啪aⅴ在线观看国产| 无码人妻熟妇av又粗又大| 欧美午夜在线| 不卡av日日日| 国产中文字幕久久| 波多野结衣的一区二区三区 | 精品成人一区| 久久艳片www.17c.com| 少妇精品无码一区二区免费视频| 欧美黑人巨大videos精品| 日韩一区二区三区av| av亚洲天堂网| 成人在线中文| 欧美天堂亚洲电影院在线播放| 92看片淫黄大片一级| sm性调教片在线观看| 亚洲午夜免费视频| 欧美精品在欧美一区二区| а√中文在线8| 国产精品盗摄一区二区三区| 小说区图片区图片区另类灬| 九色视频在线观看免费播放 | 农村寡妇一区二区三区| 五月婷婷在线播放| 99精品国产视频| 精品一卡二卡三卡四卡日本乱码| 性xxxx视频| 久久精品这里都是精品| 日韩精品伦理第一区| 国产在线视频资源| 中文字幕乱码一区二区免费| 亚洲乱码国产乱码精品天美传媒| 春暖花开成人亚洲区| 国产精品蜜臀av| 日韩第一页在线观看| yellow91字幕网在线| 亚洲一区二区三区在线| 日本阿v视频在线观看| av福利导福航大全在线| 日韩欧美第一页| 国产精品沙发午睡系列| 校园春色亚洲色图| 欧美日韩久久久| 97人人模人人爽人人澡| 伊人精品综合| 亚洲精品国产电影| 91成年人网站| 久久视频国产| 欧美国产日韩一区二区三区| 国产香蕉视频在线| 肉肉av福利一精品导航| 91免费高清视频| 高潮毛片7777777毛片| 久久久久久久综合色一本| 亚洲午夜精品福利| 欧美黑人猛交| 色八戒一区二区三区| 中文字幕一区二区在线观看视频| 亚洲一区二区三区在线免费| 亚洲精品一区中文字幕乱码| 成人黄色短视频| 黄色工厂这里只有精品| 国产精品电影观看| 亚洲国产精品一| 国产日韩欧美亚洲| 久久久国内精品| 亚洲承认视频| 欧美成人a视频| a天堂中文字幕| 国产一区二区三区四区三区四| 欧美中文字幕第一页| 一级黄色片在线观看| 成人白浆超碰人人人人| 亚洲精品一区二区三区av| 51精品在线| 欧美性极品少妇| 男男一级淫片免费播放| 99久久综合| 欧美在线一区二区三区四| 国产毛片在线视频| 国产日韩欧美综合在线| 日本丰满少妇xxxx| 亚洲国产欧美在线观看| 在线免费观看羞羞视频一区二区| 四虎永久在线精品| 国产一区二区免费看| 日韩欧美亚洲日产国| free性m.freesex欧美| 欧美一级淫片007| 国产综合精品在线| 亚洲专区免费| 成人精品一二区| 超碰在线无需免费| 欧美日韩中文字幕一区| 国产毛片久久久久久久| 亚洲国产激情| 国产精品免费一区二区三区| 黄色国产网站在线播放| 在线观看亚洲精品视频| 成人精品999| 国产视频亚洲| 精品视频免费观看| 都市激情国产精品| 精品国产污网站| 欧美日韩人妻精品一区二区三区| 日韩二区在线观看| 欧洲在线视频一区| 欧美理论影院| 亚洲色图18p| 中文字幕国产在线观看| 久久亚洲二区三区| 男人天堂1024| 夜夜春成人影院| 欧洲一区二区视频| 精品av中文字幕在线毛片| 欧美日韩在线免费| 91网站免费入口| 日韩精品1区2区3区| 日日夜夜精品网站| 亚洲四虎影院| 中文字幕欧美在线| 一级爱爱免费视频| 亚洲欧洲精品天堂一级| 国产乱女淫av麻豆国产| 久久久久午夜电影| 91亚色免费| 黄色美女视频在线观看| 亚洲电影免费观看| 国偷自拍第113页| 久久久久综合网| xx欧美撒尿嘘撒尿xx| 天天久久综合| 成人午夜电影免费在线观看| 青青草视频在线免费直播| 精品处破学生在线二十三| 日本熟妇色xxxxx日本免费看| av午夜一区麻豆| 国产91在线免费| 日本一区二区在线看| 成人免费视频在线观看超级碰| av色综合久久天堂av色综合在| 日韩精品一区二区三区swag| 成年人午夜视频| 久久久亚洲精品一区二区三区| 久久撸在线视频| 欧美国产三级| 国产亚洲二区| 麻豆久久久久| 国内外成人免费激情在线视频| 欧美69xxxxx| 欧美精品久久天天躁| 久热精品在线观看| 国产日韩欧美在线一区| 色姑娘综合天天| 国产麻豆综合| 影音先锋欧美在线| 欧美影院天天5g天天爽| 国产欧美日韩高清| 青春草免费在线视频| 亚洲品质视频自拍网| www.天堂av.com| 欧洲av在线精品| 国产一级大片在线观看| 日本一区二区三级电影在线观看| 善良的小姨在线| 日本欧美一区二区三区| 免费视频爱爱太爽了| 人人狠狠综合久久亚洲婷| wwwxx欧美| 九色成人搞黄网站| 久久久亚洲福利精品午夜| 中文日本在线观看| 日韩精品电影网| 99热这里精品| 欧美色手机在线观看| www..com国产| 一区二区三区在线视频观看| 中文字幕免费高清| 成人激情动漫在线观看| 亚洲美女性囗交| 欧美专区一区二区三区| 国产精品久久久久久久久电影网| 第一会所sis001亚洲| 国产亚洲自拍偷拍| 欧美一区一区| 国产精品视频xxxx| 国产精品粉嫩| 性欧美在线看片a免费观看| 免费大片在线观看www| 亚洲人成自拍网站| 亚洲色偷精品一区二区三区| 日韩一区二区三区av| 国产精品高潮呻吟av| 欧美亚洲高清一区| 9i看片成人免费看片| 亚洲高清在线视频| 18岁成人毛片| 亚洲欧洲日产国产综合网| 91导航在线观看| 国产婷婷色一区二区三区四区 | 国产精品久久久久久久久久白浆 | 精品中文字幕视频| 日韩av中文| 中文字幕在线成人| av资源在线观看免费高清| 亚洲天堂av在线免费| 久久精品国产亚洲a∨麻豆| 亚洲国产精品女人久久久| 色婷婷av一区二区三| 欧美成va人片在线观看| 囯产精品久久久久久| 日韩视频免费观看高清在线视频| 国产欧美熟妇另类久久久| 538在线一区二区精品国产| 亚洲综合免费视频| 欧美挠脚心视频网站| 亚洲视频在线观看免费视频| 精品视频在线看| 在线观看日韩一区二区| 欧美日韩国产首页在线观看| 亚洲天堂中文字幕在线| 欧美人伦禁忌dvd放荡欲情| 91麻豆国产在线| 91麻豆精品国产| 精品人妻av一区二区三区| 精品国产乱码久久久久久图片| 成人午夜免费在线观看| 日韩激情视频在线| 狠狠v欧美ⅴ日韩v亚洲v大胸| 亚洲午夜久久久影院| 91在线高清| 久久亚洲精品一区| 免费在线中文字幕| 97精品伊人久久久大香线蕉| sese综合| 成人美女免费网站视频| 视频精品国内| 国产亚洲福利社区| 国产精品探花在线观看| 影音先锋欧美在线| 亚洲大胆在线| 人人爽人人av| 国产原创一区二区| 蜜臀av粉嫩av懂色av| 久久人人97超碰com| 中国美女黄色一级片| 亚洲自拍偷拍麻豆| 探花视频在线观看| 777久久久精品| 老牛影视av牛牛影视av| 国产香蕉一区二区三区在线视频 | 久久久久久久激情视频| 亚洲女同av| 91精品中文在线| 久久动漫网址| 亚洲欧美电影在线观看| 国产一在线精品一区在线观看| 亚洲自偷自拍熟女另类| 久久精品99国产精品| 亚洲av成人精品一区二区三区| 国产欧美一区二区精品性色超碰| 少妇影院在线观看| 色94色欧美sute亚洲13| xxxx国产精品| 这里只有视频精品| 大香伊人久久| 国产日韩在线视频| 日本成人7777| 97久久国产亚洲精品超碰热 | 国产精品免费一区| 91在线一区| 中文字幕日韩精品久久| 99国产精品久久久久久久| 欧美成人乱码一二三四区免费| 不卡电影免费在线播放一区| 日本女人性生活视频| 欧美日韩国产页| www.日日夜夜| 日日摸夜夜添一区| 欧美成人ⅴideosxxxxx| 国产不卡一区二区在线观看| 久久综合av| av动漫在线观看| 国产成人在线视频网站| 一本在线免费视频| 一本一道综合狠狠老| 韩国av永久免费| 成人97在线观看视频| 日韩精品麻豆| 欧美极品一区| 99精品国产在热久久| 丰满饥渴老女人hd| 中文字幕一区二区三| 亚洲第一区av| 亚洲色图激情小说| 中文字幕成在线观看| 国产一级二级三级精品| 欧美另类综合| 三大队在线观看| 亚洲精品国产一区二区三区四区在线| 日韩av免费播放| 亚洲欧美另类中文字幕| 女人高潮被爽到呻吟在线观看| 国产精品高清一区二区三区| 欧美一区综合| 久久精品国产99久久99久久久| 国产精品久久久久久久第一福利 | 91精品久久久久久蜜臀| 午夜在线视频| 成人黄色片网站| 婷婷伊人综合| 亚洲男人天堂2021| 亚洲欧美视频在线观看| 国产女人高潮时对白| 超在线视频97| 1313精品午夜理伦电影| 日本免费a视频| 成人涩涩免费视频| 国产无码精品久久久| 亚洲黄色av女优在线观看| 免费h视频在线观看| 麻豆一区区三区四区产品精品蜜桃| 国产欧美大片| 国产精品毛片一区二区| 欧美综合久久久| 日本三级在线视频| 亚洲影影院av| 999在线观看精品免费不卡网站| 国产精品一区二区入口九绯色| 色综合久久久久久久久| www.亚洲视频| 91免费视频网站| 欧美日韩国产欧| 99re久久精品国产| 在线看国产一区| 黄网站免费在线观看| 1卡2卡3卡精品视频| 亚洲激情成人| 一级黄色片大全| 69成人精品免费视频| 欧美精品videossex少妇| 国内一区在线| 奇米精品一区二区三区四区| 老熟妇高潮一区二区三区| 精品国产伦理网| 精品亚洲美女网站| 国产日产欧美一区二区| av资源站一区| 欧美激情一区二区三区免费观看 | 亚洲天堂导航| 亚洲永久一区二区三区在线| 国产成人综合在线| 一级黄色av片| 色综合91久久精品中文字幕 | 国产视频在线观看一区二区| 99只有精品| 91大学生片黄在线观看| 久久综合色天天久久综合图片| ,亚洲人成毛片在线播放| 午夜精品久久17c| 国产精品国产三级国产在线观看 | 福利片在线一区二区| 国产成人手机视频| 亚洲高清不卡在线| 在线观看的av| 久久久水蜜桃| 高清av一区二区|