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

許多SQL性能問題來自于“不必要的強制性工作”

數據庫
在編寫高效 SQL 時,你可能遇到的最有影響的事情就是索引。但是,一個很重要的事實就是很多 SQL 客戶端要求數據庫做很多“不必要的強制性工作”。

[[194306]]

在編寫高效 SQL 時,你可能遇到的最有影響的事情就是索引。但是,一個很重要的事實就是很多 SQL 客戶端要求數據庫做很多“不必要的強制性工作”。

跟我再重復一遍:

不必要的強制性工作

什么是“不必要的強制性工作”?這個意思包括兩個方面:

不必要的

假設你的客戶端應用程序需要這些信息:

 

這沒什么特別的。我們運行著一個電影數據庫(例如 Sakila 數據庫),我們想要給用戶顯示每部電影的名稱和評分。

這是能產生上面結果的查詢:

  1. SELECT title, rating 
  2. FROM film 

然而,我們的應用程序(或者我們的 ORM(LCTT 譯注:對象關系映射(Object-Relational Mapping)))運行的查詢卻是:

  1. SELECT * 
  2. FROM film 

我們得到什么?猜一下。我們得到很多無用的信息:

 

甚至一些復雜的 JSON 數據全程在下列環節中加載:

  • 從磁盤
  • 加載到緩存
  • 通過總線
  • 進入客戶端內存
  • 然后被丟棄

是的,我們丟棄了其中大部分的信息。檢索它所做的工作完全就是不必要的。對吧?沒錯。

強制性

這是最糟糕的部分。現今隨著優化器變得越來越聰明,這些工作對于數據庫來說都是強制執行的。數據庫沒有辦法知道客戶端應用程序實際上不需要其中 95% 的數據。這只是一個簡單的例子。想象一下如果我們連接更多的表...

你想想那會怎樣呢?數據庫還快嗎?讓我們來看看一些之前你可能沒有想到的地方:

內存消耗

當然,單次執行時間不會變化很大。可能是慢 1.5 倍,但我們可以忍受,是吧?為方便起見,有時候確實如此。但是如果你每次都為了方便而犧牲性能,這事情就大了。我們不說性能問題(單個查詢的速度),而是關注在吞吐量上時(系統響應時間),事情就變得困難而難以解決。你就會受阻于規模的擴大。

讓我們來看看執行計劃,這是 Oracle 的:

  1. -------------------------------------------------- 
  2. | Id  | Operation         | Name | Rows  | Bytes | 
  3. -------------------------------------------------- 
  4. |   0 | SELECT STATEMENT  |      |  1000 |   166K| 
  5. |   1 |  TABLE ACCESS FULL| FILM |  1000 |   166K| 
  6. -------------------------------------------------- 

對比一下:

  1. -------------------------------------------------- 
  2. | Id  | Operation         | Name | Rows  | Bytes | 
  3. -------------------------------------------------- 
  4. |   0 | SELECT STATEMENT  |      |  1000 | 20000 | 
  5. |   1 |  TABLE ACCESS FULL| FILM |  1000 | 20000 | 
  6. -------------------------------------------------- 

當執行 SELECT * 而不是 SELECT film, rating 的時候,我們在數據庫中使用了 8 倍之多的內存。這并不奇怪,對吧?我們早就知道了。在很多我們并不需要其中全部數據的查詢中我們都是這樣做的。我們為數據庫產生了不必要的強制性工作,其后果累加了起來,就是我們使用了多達 8 倍的內存(當然,數值可能有些不同)。

而現在,所有其它的步驟(比如,磁盤 I/O、總線傳輸、客戶端內存消耗)也受到相同的影響,我這里就跳過了。另外,我還想看看...

索引使用

如今大部分數據庫都有涵蓋索引(LCTT 譯注:covering index,包括了你查詢所需列、甚至更多列的索引,可以直接從索引中獲取所有需要的數據,而無需訪問物理表)的概念。涵蓋索引并不是特殊的索引。但對于一個特定的查詢,它可以“意外地”或人為地轉變為一個“特殊索引”。

看看這個查詢:

  1. SELECT * 
  2. FROM actor 
  3. WHERE last_name LIKE 'A%' 

執行計劃中沒有什么特別之處。它只是個簡單的查詢。索引范圍掃描、表訪問,就結束了:

  1. ------------------------------------------------------------------- 
  2. | Id  | Operation                   | Name                | Rows  | 
  3. ------------------------------------------------------------------- 
  4. |   0 | SELECT STATEMENT            |                     |     8 | 
  5. |   1 |  TABLE ACCESS BY INDEX ROWID| ACTOR               |     8 | 
  6. |*  2 |   INDEX RANGE SCAN          | IDX_ACTOR_LAST_NAME |     8 | 
  7. ------------------------------------------------------------------- 

這是個好計劃嗎?如果我們只是想要這些,那么它就不是:

 

當然,我們浪費了內存之類的。再來看看這個查詢:

  1. SELECT first_name, last_name  
  2. FROM actor 
  3. WHERE last_name LIKE 'A%' 

它的計劃是:

  1. ---------------------------------------------------- 
  2. | Id  | Operation        | Name            | Rows  | 
  3. ---------------------------------------------------- 
  4. |   0 | SELECT STATEMENT |                 |     8 | 
  5. |*  1 |  INDEX RANGE SCAN| IDX_ACTOR_NAMES |     8 | 
  6. ---------------------------------------------------- 

現在我們可以完全消除表訪問,因為有一個索引涵蓋了我們查詢需要的所有東西……一個涵蓋索引。這很重要嗎?當然!這種方法可以將你的某些查詢加速一個數量級(如果在某個更改后你的索引不再涵蓋,可能會降低一個數量級)。

你不能總是從涵蓋索引中獲利。索引也有它們自己的成本,你不應該添加太多索引,例如像這種情況就是不明智的。讓我們來做個測試:

  1. SET SERVEROUTPUT ON 
  2. DECLARE 
  3.   v_ts TIMESTAMP
  4.   v_repeat CONSTANT NUMBER := 100000; 
  5. BEGIN 
  6.   v_ts := SYSTIMESTAMP; 
  7.   FOR i IN 1..v_repeat LOOP 
  8.     FOR rec IN ( 
  9.       -- Worst query: Memory overhead AND table access 
  10.       SELECT * 
  11.       FROM actor 
  12.       WHERE last_name LIKE 'A%' 
  13.     ) LOOP 
  14.       NULL
  15.     END LOOP; 
  16.   END LOOP; 
  17.   dbms_output.put_line('Statement 1 : ' || (SYSTIMESTAMP - v_ts)); 
  18.   v_ts := SYSTIMESTAMP; 
  19.   FOR i IN 1..v_repeat LOOP 
  20.     FOR rec IN ( 
  21.       -- Better query: Still table access 
  22.       SELECT /*+INDEX(actor(last_name))*/ 
  23.         first_name, last_name 
  24.       FROM actor 
  25.       WHERE last_name LIKE 'A%' 
  26.     ) LOOP 
  27.       NULL
  28.     END LOOP; 
  29.   END LOOP; 
  30.   dbms_output.put_line('Statement 2 : ' || (SYSTIMESTAMP - v_ts)); 
  31.   v_ts := SYSTIMESTAMP; 
  32.   FOR i IN 1..v_repeat LOOP 
  33.     FOR rec IN ( 
  34.       -- Best query: Covering index 
  35.       SELECT /*+INDEX(actor(last_name, first_name))*/ 
  36.         first_name, last_name 
  37.       FROM actor 
  38.       WHERE last_name LIKE 'A%' 
  39.     ) LOOP 
  40.       NULL
  41.     END LOOP; 
  42.   END LOOP; 
  43.   dbms_output.put_line('Statement 3 : ' || (SYSTIMESTAMP - v_ts)); 
  44. END

結果是:

  1. Statement 1 : +000000000 00:00:02.479000000 
  2. Statement 2 : +000000000 00:00:02.261000000 
  3. Statement 3 : +000000000 00:00:01.857000000 

注意,表 actor 只有 4 列,因此語句 1 和 2 的差別并不是太令人印象深刻,但仍然很重要。還要注意我使用了 Oracle 的提示來強制優化器為查詢選擇一個或其它索引。在這種情況下語句 3 明顯勝利。這是一個好很多的查詢,也是一個十分簡單的查詢。

當我們寫 SELECT * 語句時,我們為數據庫帶來了不必要的強制性工作,這是無法優化的。它不會使用涵蓋索引,因為比起它所使用的 LAST_NAME 索引,涵蓋索引開銷更多一點,不管怎樣,它都要訪問表以獲取無用的 LAST_UPDATE 列。

使用 SELECT * 會變得更糟。考慮一下……

SQL 轉換

優化器工作的很好,因為它們轉換了你的 SQL 查詢(看我最近在 Voxxed Days Zurich 關于這方面的演講)。例如,其中有一個稱為“表連接消除”的轉換,它真的很強大。看看這個輔助視圖,我們寫了這個視圖是因為我們非常討厭總是連接所有這些表:

  1. CREATE VIEW v_customer AS 
  2. SELECT 
  3.   c.first_name, c.last_name,  
  4.   a.address, ci.city, co.country 
  5. FROM customer c 
  6. JOIN address a USING (address_id) 
  7. JOIN city ci USING (city_id) 
  8. JOIN country co USING (country_id) 

這個視圖僅僅是把 CUSTOMER 和他們不同的 ADDRESS 部分所有“對一”關系連接起來。謝天謝地,它很工整。

現在,使用這個視圖一段時間之后,想象我們非常習慣這個視圖,我們都忘了所有它底層的表。然后,我們運行了這個查詢:

  1. SELECT * 
  2. FROM v_customer 

我們得到了一個相當令人印象深刻的計劃:

  1. ---------------------------------------------------------------- 
  2. | Id  | Operation            | Name     | Rows  | Bytes | Cost | 
  3. ---------------------------------------------------------------- 
  4. |   0 | SELECT STATEMENT     |          |   599 | 47920 |   14 | 
  5. |*  1 |  HASH JOIN           |          |   599 | 47920 |   14 | 
  6. |   2 |   TABLE ACCESS FULL  | COUNTRY  |   109 |  1526 |    2 | 
  7. |*  3 |   HASH JOIN          |          |   599 | 39534 |   11 | 
  8. |   4 |    TABLE ACCESS FULL | CITY     |   600 | 10800 |    3 | 
  9. |*  5 |    HASH JOIN         |          |   599 | 28752 |    8 | 
  10. |   6 |     TABLE ACCESS FULL| CUSTOMER |   599 | 11381 |    4 | 
  11. |   7 |     TABLE ACCESS FULL| ADDRESS  |   603 | 17487 |    3 | 
  12. ---------------------------------------------------------------- 

當然是這樣。我們運行了所有這些表連接以及全表掃描,因為這就是我們讓數據庫去做的:獲取所有的數據。

現在,再一次想一下,對于一個特定場景,我們真正想要的是:

 

是啊,對吧?現在你應該知道我的意圖了。但想像一下,我們確實從前面的錯誤中學到了東西,現在我們實際上運行下面一個比較好的查詢:

  1. SELECT first_name, last_name 
  2. FROM v_customer 

再來看看結果!

  1. ------------------------------------------------------------------ 
  2. | Id  | Operation          | Name        | Rows  | Bytes | Cost  | 
  3. ------------------------------------------------------------------ 
  4. |   0 | SELECT STATEMENT   |             |   599 | 16173 |     4 | 
  5. |   1 |  NESTED LOOPS      |             |   599 | 16173 |     4 | 
  6. |   2 |   TABLE ACCESS FULL| CUSTOMER    |   599 | 11381 |     4 | 
  7. |*  3 |   INDEX UNIQUE SCAN| SYS_C007120 |     1 |     8 |     0 | 
  8. ------------------------------------------------------------------ 

這是執行計劃一個極大的進步。我們的表連接被消除了,因為優化器可以證明它們是不必要的,因此一旦它可以證明這點(而且你不會因使用 select * 而使其成為強制性工作),它就可以移除這些工作并不執行它。為什么會發生這種情況?

每個 CUSTOMER.ADDRESS_ID 外鍵保證了有且只有一個 ADDRESS.ADDRESS_ID 主鍵值,因此可以保證 JOIN 操作是對一連接,它不會產生或者刪除行。如果我們甚至不選擇行或查詢行,當然我們就不需要真正地去加載行。可以證實地移除 JOIN 并不會改變查詢的結果。

數據庫總是會做這些事情。你可以在大部分數據庫上嘗試它:

  1. -- Oracle 
  2. SELECT CASE WHEN EXISTS ( 
  3.   SELECT 1 / 0 FROM dual 
  4. THEN 1 ELSE 0 END 
  5. FROM dual 
  6. -- 更合理的 SQL 語句,例如 PostgreSQL 
  7. SELECT EXISTS (SELECT 1 / 0) 

在這種情況下,當你運行這個查詢時你可能預料到會拋出算術異常:

  1. SELECT 1 / 0 FROM dual 

產生了:

  1. ORA-01476: divisor is equal to zero 

但它并沒有發生。優化器(甚至解析器)可以證明 EXISTS (SELECT ..) 謂詞內的任何 SELECT 列表達式不會改變查詢的結果,因此也就沒有必要計算它的值。呵!

同時……

大部分 ORM 最不幸問題就是事實上他們很隨意就寫出了 SELECT * 查詢。事實上,例如 HQL / JPQL,就設置默認使用它。你甚至可以完全拋棄 SELECT 從句,因為畢竟你想要獲取所有實體,正如聲明的那樣,對吧?

例如:

FROM v_customer

例如 Vlad Mihalcea(一個 Hibernate 專家和 Hibernate 開發倡導者)建議你每次確定不想要在獲取后進行任何更改時再使用查詢。ORM 使解決對象圖持久化問題變得簡單。注意:持久化。真正修改對象圖并持久化修改的想法是固有的。

但如果你不想那樣做,為什么要抓取實體呢?為什么不寫一個查詢?讓我們清楚一點:從性能角度,針對你正在解決的用例寫一個查詢總是會勝過其它選項。你可以不會在意,因為你的數據集很小,沒關系。可以。但最終,你需要擴展并重新設計你的應用程序以便在強制實體圖遍歷之上支持查詢語言,就會變得很困難。你也需要做其它事情。

計算出現次數

資源浪費最嚴重的情況是在只是想要檢驗存在性時運行 COUNT(*) 查詢。例如:

這個用戶有沒有訂單?

我們會運行:

  1. SELECT count(*) 
  2. FROM orders 
  3. WHERE user_id = :user_id 

很簡單。如果 COUNT = 0:沒有訂單。否則:是的,有訂單。

性能可能不會很差,因為我們可能有一個 ORDERS.USER_ID 列上的索引。但是和下面的這個相比你認為上面的性能是怎樣呢:

  1. -- Oracle 
  2. SELECT CASE WHEN EXISTS ( 
  3.   SELECT * 
  4.   FROM orders 
  5.   WHERE user_id = :user_id 
  6. THEN 1 ELSE 0 END 
  7. FROM dual 
  8. -- 更合理的 SQL 語句,例如 PostgreSQL 
  9. SELECT EXISTS ( 
  10.   SELECT * 
  11.   FROM orders 
  12.   WHERE user_id = :user_id 

它不需要火箭科學家來確定,一旦它找到一個,實際存在謂詞就可以馬上停止尋找額外的行。因此,如果答案是“沒有訂單”,速度將會是差不多。但如果結果是“是的,有訂單”,那么結果在我們不計算具體次數的情況下就會大幅加快。

因為我們不在乎具體的次數。我們告訴數據庫去計算它(不必要的),而數據庫也不知道我們會丟棄所有大于 1 的結果(強制性)。

當然,如果你在 JPA 支持的集合上調用 list.size() 做同樣的事情,情況會變得更糟!

近期我有關于該情況的博客以及在不同數據庫上的測試。去看看吧。

總結

這篇文章的立場很“明顯”。別讓數據庫做不必要的強制性工作。

它不必要,因為對于你給定的需求,你知道一些特定的工作不需要完成。但是,你告訴數據庫去做。

它強制性,因為數據庫無法證明它是不必要的。這些信息只包含在客戶端中,對于服務器來說無法訪問。因此,數據庫需要去做。

這篇文章大部分在介紹 SELECT *,因為這是一個很簡單的目標。但是這并不僅限于數據庫。這關系到客戶端要求服務器完成不必要的強制性工作的任何分布式算法。你的 AngularJS 應用程序平均有多少個 N+1 問題,UI 在服務結果 A 上循環,多次調用服務 B,而不是把所有對 B 的調用打包為一個調用?這是一個復發的模式。

解決方法總是相同。你給執行你命令的實體越多信息,(理論上)它能更快執行這樣的命令。每次都寫一個好的查詢。你的整個系統都會為此感謝你的。

如果你喜歡這篇文章...

再看看近期我在 Voxxed Days Zurich 的演講,其中我展示了一些在數據處理算法上為什么 SQL 總是會勝過 Java 的雙曲線例子。

(題圖:Pixabay, CC0)

責任編輯:龐桂玉 來源: Linux中國
相關推薦

2020-07-10 15:03:08

緩存架構計算

2018-08-24 11:52:15

成本公共云云服務

2021-02-10 15:54:48

Windows 10Windows微軟

2023-05-04 07:06:25

微軟Windows

2024-01-05 07:41:08

Go語言語句

2016-08-05 16:13:50

Android性能優化對象

2011-08-18 09:51:21

2021-05-07 15:59:15

自動駕駛安全系統

2010-05-21 14:09:41

2015-11-25 13:37:52

磁盤空間LinuxUbuntu

2011-08-18 09:46:01

2020-12-18 10:01:11

GitHub開源Cookies

2011-08-10 11:12:03

2010-09-01 09:53:28

敏捷運維

2011-02-18 11:02:28

2010-05-20 17:36:09

IIS安全

2011-04-18 14:35:53

2009-11-26 09:52:05

jQuery選擇器

2011-04-18 14:27:50

2017-06-26 09:55:31

前端后端開發
點贊
收藏

51CTO技術棧公眾號

亚洲午夜国产成人av电影男同| 中文字幕在线观看不卡| 国内精品一区二区三区| 国产激情视频网站| 成人天堂yy6080亚洲高清| 国产精品久久夜| 91偷拍精品一区二区三区| 日韩少妇裸体做爰视频| 国产毛片一区二区三区| 日韩一级片在线观看| 日韩中字在线观看| 精品久久久久一区二区三区 | 黄色精品视频网站| 一区二区在线观看免费 | 精品国产精品| 日韩三级中文字幕| 男人舔女人下面高潮视频| 精品麻豆一区二区三区 | 国产伦精品一区二区三区四区视频| 亚洲日本韩国在线| 亚洲色图网站| 亚洲欧洲在线看| 三年中文在线观看免费大全中国| 男人av在线播放| 国产精品国产精品国产专区不片| 国产伦精品一区二区三区照片91 | 成人p站proumb入口| 国产成人精品三级| 国产精品午夜视频| 99视频在线看| 亚洲一区欧美| 在线精品播放av| 欧美日韩一区二区三区四区五区六区| 日韩网站中文字幕| 亚洲电影在线免费观看| 亚洲视频电影| 欧美婷婷久久五月精品三区| 国产精品香蕉一区二区三区| 国产精品一区二区三区在线播放| 日本高清www免费视频| 亚洲天堂免费| 精品国产依人香蕉在线精品| 在线免费观看成年人视频| 亚洲一区二区av| 91福利社在线观看| 国产成人精品视频免费看| 天天色天天射天天综合网| 国产精品久久夜| 日韩精品国内| 免费在线性爱视频| 99精品欧美一区| 国产不卡一区二区在线观看| 一二三四区视频| 美腿丝袜亚洲三区| 国产精品入口免费视频一| 日本中文字幕久久| 免费在线亚洲| 欧美亚洲国产精品| 欧美日韩一二三四区| 99re国产精品| 91精品国产九九九久久久亚洲| 国产一级久久久| 好吊视频一区二区三区四区| 久精品免费视频| 免费三片在线播放| 国内久久视频| 午夜精品久久久久久99热| 国产午夜精品无码一区二区| 亚洲一级影院| 午夜精品久久久久久久99热 | 国产区在线视频| 国产午夜精品理论片a级大结局| 秋霞久久久久久一区二区| 黄网在线免费| 中文字幕一区二区三区精华液 | 日本r级电影在线观看| 欧洲午夜精品| 欧美一区二区三区在线电影 | 无码人妻久久一区二区三区不卡| 香蕉久久夜色精品| 国产精品美乳一区二区免费| 一级α片免费看刺激高潮视频| 国产一区二区三区在线观看免费 | 中文字幕第一页在线播放| 七七婷婷婷婷精品国产| 91网在线免费观看| 少妇高潮久久久| 国产亚洲综合在线| 一区二区欧美日韩| 中文字幕中文字幕在线十八区| 亚洲三级在线免费| 亚洲精品电影在线一区| 97影院秋霞午夜在线观看| 一区二区三区国产| 2022亚洲天堂| 四虎影视4hu4虎成人| 欧美三级在线播放| 波多野结衣免费观看| 高潮久久久久久久久久久久久久| 日韩精品亚洲精品| 少妇人妻好深好紧精品无码| 天天做天天爱综合| 欧美精品videossex88| 久久一区二区三区视频| 日本在线不卡视频| 91精品视频观看| 亚洲av无码乱码国产麻豆| 成人免费视频视频在线观看免费| 成人精品一二区| 黄色小视频免费观看| 99视频有精品| 午夜精品一区二区三区在线观看| 欧美极品另类| 午夜久久久久久久久久一区二区| 精品少妇一区二区三区在线| 亚洲成人激情社区| 91精品欧美综合在线观看最新| 久久无码人妻精品一区二区三区 | 欧美日韩大陆一区二区| 2025中文字幕| 精品久久对白| 日韩在线视频播放| 日本三级午夜理伦三级三| 秋霞国产午夜精品免费视频| 亚洲xxxx做受欧美| 国自产拍在线网站网址视频| 综合在线观看色| av动漫在线看| 国产精品igao视频网网址不卡日韩| 亚洲国产精品久久久久秋霞蜜臀| 亚洲不卡的av| 国产精品女主播一区二区三区| 国产a∨精品一区二区三区不卡| www.香蕉视频| 国产精品毛片久久久久久| 九九热只有这里有精品| 久久女人天堂| 亚洲欧美综合精品久久成人| www.超碰在线观看| 青青草精品视频| 狠狠爱一区二区三区| 免费观看成人高潮| 91高清视频免费看| 特级西西人体4444xxxx| 婷婷亚洲图片| 91高清免费在线观看| 国产v片在线观看| 国产免费观看久久| 97成人在线观看视频| 伊色综合久久之综合久久| 中文字幕av一区中文字幕天堂| 日本一级片免费看| 久久er精品视频| 一本一生久久a久久精品综合蜜| 91av亚洲| 日韩av一区二区在线| 久草福利资源在线观看| 精品一区二区在线播放| 日韩影视精品| 综合在线影院| 伊人久久免费视频| 国产一级片免费在线观看| 波多野结衣91| r级无码视频在线观看| 日本免费精品| 欧美日韩xxxxx| 97人妻精品一区二区三区软件| 国产精品高潮呻吟久久| 亚洲 激情 在线| 欧美日韩在线观看视频小说| 日韩美女主播视频| 国产中文在线观看| 91九色最新地址| 国产手机在线观看| 久久综合影音| 日韩亚洲视频| 四虎地址8848精品| 欧美久久精品一级黑人c片| 国产片高清在线观看| 亚洲色图欧美在线| 三上悠亚 电影| 欧美久久99| 国产在线一区二区三区欧美| 91超碰在线免费| 亚洲精品美女久久久| av大片免费在线观看| 国产免费观看久久| 老司机久久精品| 91精品国产成人观看| 亚洲a成v人在线观看| 免费电影视频在线看 | 色一情一乱一乱一区91av| 午夜日韩在线观看| 永久免费看mv网站入口78| 日韩成人一级片| 在线看成人av电影| 久久久91麻豆精品国产一区| 国模吧一区二区| 手机av在线免费观看| 91福利国产精品| 91高清免费观看| 97精品电影院| 手机在线成人免费视频| 欧美二区视频| 国产区二精品视| 日韩专区视频网站| 久久久在线观看| 国产精品免费观看| 日韩午夜精品视频| 久久久久亚洲av成人毛片韩| 国产欧美日韩另类一区| 中文字幕人妻一区| 日韩高清在线不卡| 久久艹国产精品| 欧美亚洲在线日韩| 成人免费视频观看视频| 黄色美女视频在线观看| 久久韩剧网电视剧| 天堂√在线中文官网在线| 欧美日韩www| 国产精品美女久久久久av爽| 中文字幕av一区 二区| 亚洲一区二区图片| 久久精品国产77777蜜臀| 分分操这里只有精品| 成人毛片免费看| 国产精品一区二区三区精品| 成人国产激情在线| 国语自产在线不卡| 日本一级理论片在线大全| 国产小视频91| 秋霞视频一区二区| 日韩一区二区三区四区| 精品人妻一区二区三区潮喷在线 | 亚洲在线成人| 国产树林野战在线播放| 综合国产视频| 国产精品免费一区二区三区在线观看 | 国产精品刘玥久久一区| 亚洲欧美激情四射在线日| www.久久成人| 欧美精选午夜久久久乱码6080| 西西44rtwww国产精品| 一区二区三区四区不卡在线| 欧美激情 一区| 国产日韩高清在线| 亚洲成人av免费在线观看| 国产乱国产乱300精品| 自拍偷拍21p| 日韩精品国产精品| 欧美三级一级片| 男人天堂欧美日韩| av之家在线观看| 激情成人亚洲| 日本久久久网站| 欧美影院一区| 中文字幕一区二区三区四区五区人| av亚洲免费| 免费在线观看一区二区| 欧美人妖在线观看| 久久riav二区三区| 国产精品45p| 久久超碰亚洲| 亚洲理论电影| 免费试看一区| 国产一区二区三区四区五区传媒 | 老头吃奶性行交视频| 免费看亚洲片| 欧美日韩在线成人| 日韩av网站免费在线| 最新av免费在线观看| 精品系列免费在线观看| 欧美大片久久久| 韩国一区二区在线观看| 日韩高清在线一区二区| 国产一区二区在线电影| 丰满少妇一区二区三区专区| 国产精品一区二区在线观看网站| 中文字幕第10页| 国产99久久久精品| 大乳护士喂奶hd| 99久久伊人久久99| 香蕉网在线播放| 国产日韩三级在线| 国产在线免费av| 亚洲欧洲精品一区二区三区| 久久久久久久麻豆| 午夜欧美在线一二页| 亚洲男人的天堂在线视频| 欧美午夜视频一区二区| 国产精品欧美综合| 91精品一区二区三区在线观看| av片免费播放| 国产视频久久久久| 求av网址在线观看| 欧美黄色成人网| 亚洲三级欧美| 青青在线视频一区二区三区| 免费成人高清在线视频| 99久久精品无码一区二区毛片| 全国精品免费看| 亚州欧美一区三区三区在线| 99精品在线免费在线观看| 日韩国产高清一区| 狠狠干综合网| aa免费在线观看| 美女视频黄频大全不卡视频在线播放| 天天久久综合网| 91原创在线视频| 99精品欧美一区二区| 亚洲va天堂va国产va久| 国产精品第6页| 精品福利在线导航| 国产福利第一视频在线播放| 日韩在线视频观看正片免费网站| 男人久久天堂| 成人自拍性视频| 日韩在线影视| 日本一区二区免费高清视频| 亚洲乱码久久| 日本在线视频播放| 亚洲国产精品成人综合 | 亚洲一区在线观| 日韩一级片网址| 国产三级在线观看| 97色伦亚洲国产| 国产精品一站二站| 日韩福利影院| 久久一区欧美| 不许穿内裤随时挨c调教h苏绵| 国产人成亚洲第一网站在线播放 | 亚洲午夜激情av| 中文在线a天堂| 亚洲大胆美女视频| 手机在线免费看av| 国产精品一区av| 亚洲老女人视频免费| 国产曰肥老太婆无遮挡| 国产一区二区福利| 国产探花视频在线播放| 亚洲va韩国va欧美va精品| 国产精品无码久久久久成人app| 亚洲欧美日韩在线高清直播| 国产蜜臀一区二区打屁股调教| 国产精品永久在线| 九九综合在线| 欧美视频在线观看网站| 国产黄色精品视频| 国产小视频你懂的| 在线观看不卡一区| 久青青在线观看视频国产| 45www国产精品网站| 日韩三区四区| 国产女主播av| 狠狠色丁香久久婷婷综合_中| 91视频免费看片| 91搞黄在线观看| 国产在线电影| 日本在线观看天堂男亚洲| 国产精品极品在线观看| 免费看欧美黑人毛片| 国产激情视频一区二区三区欧美| 麻豆一区二区三区精品视频| 日韩亚洲欧美在线观看| www.久久久久.com| 成人观看高清在线观看免费| 人人狠狠综合久久亚洲婷| 国产欧美激情视频| 日韩理论在线观看| 欧美一级黄视频| 亚洲欧洲午夜一线一品| 欧美黑人粗大| 国产在线精品一区二区三区》| 国产欧美精品| 丝袜美腿中文字幕| 日本乱人伦aⅴ精品| 蜜桃成人在线视频| 91精品久久久久久久久久另类 | 国产高清av片| 亚洲一区二区av电影| 亚洲精品一区二区三区蜜桃| 欧美日韩成人网| 国内精品偷拍| 久久久久免费精品| 国产精品久久毛片av大全日韩| 中文字幕观看在线| www国产91| 国产精品白丝久久av网站| 加勒比成人在线| www激情久久| 亚洲综合精品在线| 九九热这里只有精品6| 欧美美女在线直播| 爱情岛论坛vip永久入口| 国产精品全国免费观看高清| 99久久亚洲精品日本无码 | 国产日韩欧美精品| 久久激情久久| 国产精品白丝喷水在线观看| 欧美一区二区在线不卡|