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

后端程序員必備:書寫高質量SQL的30條建議

運維 數(shù)據(jù)庫運維
本文將結合實例demo,闡述30條有關于優(yōu)化SQL的建議,多數(shù)是實際開發(fā)中總結出來的,希望對大家有幫助。

前言

本文將結合實例demo,闡述30條有關于優(yōu)化SQL的建議,多數(shù)是實際開發(fā)中總結出來的,希望對大家有幫助。

1、查詢SQL盡量不要使用select *,而是select具體字段。

反例子: 

  1. select * from employee; 

正例子: 

  1. select id,name from employee; 

理由:

  •  只取需要的字段,節(jié)省資源、減少網絡開銷。
  •  select * 進行查詢時,很可能就不會使用到覆蓋索引了,就會造成回表查詢。

2、如果知道查詢結果只有一條或者只要最大/最小一條記錄,建議用limit 1

假設現(xiàn)在有employee員工表,要找出一個名字叫jay的人.   

  1. CREATE TABLE `employee` (  
  2.       `id` int(11) NOT NULL,  
  3.       `name` varchar(255) DEFAULT NULL,  
  4.       `age` int(11) DEFAULT NULL,  
  5.       `date` datetime DEFAULT NULL,  
  6.       `sex` int(1) DEFAULT NULL,  
  7.       PRIMARY KEY (`id`)  
  8.     ) ENGINE=InnoDB DEFAULT CHARSET=utf8

反例:   

  1. select id,name from employee where name='jay' 

正例 

  1. select id,name from employee where name='jay' limit 1; 

理由:

  •  加上limit 1后,只要找到了對應的一條記錄,就不會繼續(xù)向下掃描了,效率將會大大提高。
  •  當然,如果name是唯一索引的話,是不必要加上limit 1了,因為limit的存在主要就是為了防止全表掃描,從而提高性能,如果一個語句本身可以預知不用全表掃描,有沒有l(wèi)imit ,性能的差別并不大。

3、應盡量避免在where子句中使用or來連接條件

新建一個user表,它有一個普通索引userId,表結構如下:   

  1. CREATE TABLE `user` (  
  2.       `id` int(11) NOT NULL AUTO_INCREMENT,  
  3.       `userId` int(11) NOT NULL,  
  4.       `age` int(11) NOT NULL,  
  5.       `name` varchar(255) NOT NULL, 
  6.       PRIMARY KEY (`id`),  
  7.       KEY `idx_userId` (`userId`)  
  8.     ) ENGINE=InnoDB DEFAULT CHARSET=utf8

假設現(xiàn)在需要查詢userid為1或者年齡為18歲的用戶,很容易有以下SQL

反例:   

  1. select * from user where userid=1 or age =18 

正例: 

  1. //使用union all  
  2.   select * from user where userid=1   
  3.   union all  
  4.   select * from user where age = 18  
  5.   //或者分開兩條sql寫:  
  6.   select * from user where userid=1  
  7.   select * from user where age = 18 

理由:

  •  使用or可能會使索引失效,從而全表掃描。

 對于or+沒有索引的age這種情況,假設它走了userId的索引,但是走到age查詢條件時,它還得全表掃描,也就是需要三步過程:全表掃描+索引掃描+合并如果它一開始就走全表掃描,直接一遍掃描就完事。mysql是有優(yōu)化器的,處于效率與成本考慮,遇到or條件,索引可能失效,看起來也合情合理。

4、優(yōu)化limit分頁

我們日常做分頁需求時,一般會用 limit 實現(xiàn),但是當偏移量特別大的時候,查詢效率就變得低下。

反例:   

  1. select id,name,age from employee limit 10000,10 

正例: 

  1. //方案一 :返回上次查詢的最大記錄(偏移量)  
  2. select id,name from employee where id>10000 limit 10.  
  3. //方案二:order by + 索引  
  4. select id,name from employee order by id  limit 10000,10  
  5. //方案三:在業(yè)務允許的情況下限制頁數(shù): 

理由:

  •  當偏移量最大的時候,查詢效率就會越低,因為Mysql并非是跳過偏移量直接去取后面的數(shù)據(jù),而是先把偏移量+要取的條數(shù),然后再把前面偏移量這一段的數(shù)據(jù)拋棄掉再返回的。
  •  如果使用優(yōu)化方案一,返回上次最大查詢記錄(偏移量),這樣可以跳過偏移量,效率提升不少。
  •  方案二使用order by+索引,也是可以提高查詢效率的。
  •  方案三的話,建議跟業(yè)務討論,有沒有必要查這么后的分頁啦。因為絕大多數(shù)用戶都不會往后翻太多頁。

5、優(yōu)化你的like語句

日常開發(fā)中,如果用到模糊關鍵字查詢,很容易想到like,但是like很可能讓你的索引失效。

反例: 

  1. select userId,name from user where userId like '%123'; 

正例: 

  1. select userId,name from user where userId like '123%'; 

理由:

  •  把%放前面,并不走索引,如下:    

  • 把% 放關鍵字后面,還是會走索引的。如下: 

6、使用where條件限定要查詢的數(shù)據(jù),避免返回多余的行

假設業(yè)務場景是這樣:查詢某個用戶是否是會員。曾經看過老的實現(xiàn)代碼是這樣。。。

反例: 

  1. List<Long> userIds = sqlMap.queryList("select userId from user where isVip=1");  
  2.  boolean isVip = userIds.contains(userId); 

正例:   

  1. Long userId = sqlMap.queryObject("select userId from user where userId='userId' and isVip='1' ")  
  2.    boolean isVip = userId!=null; 

理由:

  •  需要什么數(shù)據(jù),就去查什么數(shù)據(jù),避免返回不必要的數(shù)據(jù),節(jié)省開銷。

7、盡量避免在索引列上使用mysql的內置函數(shù)

業(yè)務需求:查詢最近七天內登陸過的用戶(假設loginTime加了索引)

反例:   

  1. select userId,loginTime from loginuser where Date_ADD(loginTime,Interval 7 DAY) >=now(); 

正例:   

  1. explain  select userId,loginTime from loginuser where  loginTime >= Date_ADD(NOW(),INTERVAL - 7 DAY); 

理由:

  •  索引列上使用mysql的內置函數(shù),索引失效 

  • 如果索引列不加內置函數(shù),索引還是會走的。 

8、應盡量避免在where子句中對字段進行表達式操作,這將導致系統(tǒng)放棄使用索引而進行全表掃

反例:   

  1. select * from user where age-1 =10; 

正例:   

  1. select * from user where age =11; 

理由:

  •  雖然age加了索引,但是因為對它進行運算,索引直接迷路了。。。 

9、Inner join 、left join、right join,優(yōu)先使用Inner join,如果是left join,左邊表結果盡量小

  •   Inner join 內連接,在兩張表進行連接查詢時,只保留兩張表中完全匹配的結果集
  •   left join 在兩張表進行連接查詢時,會返回左表所有的行,即使在右表中沒有匹配的記錄。
  •   right join 在兩張表進行連接查詢時,會返回右表所有的行,即使在左表中沒有匹配的記錄。

都滿足SQL需求的前提下,推薦優(yōu)先使用Inner join(內連接),如果要使用left join,左邊表數(shù)據(jù)結果盡量小,如果有條件的盡量放到左邊處理。

反例: 

  1. select * from tab1 t1 left join tab2 t2  on t1.size = t2.size where t1.id>2; 

正例: 

  1. select * from (select * from tab1 where id >2) t1 left join tab2 t2 on t1.size = t2.size; 

理由:

  •  如果inner join是等值連接,或許返回的行數(shù)比較少,所以性能相對會好一點。
  •  同理,使用了左連接,左邊表數(shù)據(jù)結果盡量小,條件盡量放到左邊處理,意味著返回的行數(shù)可能比較少。

10、應盡量避免在where子句中使用!=或<>操作符,否則將引擎放棄使用索引而進行全表掃描。

反例:   

  1. select age,name  from user where age <>18; 

正例:   

  1. //可以考慮分開兩條sql寫  
  2.     select age,name  from user where age <18 
  3.     select age,name  from user where age >18; 

理由:

  •  使用!=和<>很可能會讓索引失效

11、使用聯(lián)合索引時,注意索引列的順序,一般遵循最左匹配原則。

表結構:(有一個聯(lián)合索引idxuseridage,userId在前,age在后)   

  1. CREATE TABLE `user` (  
  2.       `id` int(11) NOT NULL AUTO_INCREMENT,  
  3.       `userId` int(11) NOT NULL,  
  4.       `age` int(11) DEFAULT NULL,  
  5.       `name` varchar(255) NOT NULL,  
  6.       PRIMARY KEY (`id`),  
  7.       KEY `idx_userid_age` (`userId`,`age`) USING BTREE  
  8.     ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8

反例: 

  1. select * from user where age = 10

正例:   

  1. //符合最左匹配原則  
  2.    select * from user where userid=10 and age =10;  
  3.    //符合最左匹配原則  
  4.    select * from user where userid =10

理由:

  •  當我們創(chuàng)建一個聯(lián)合索引的時候,如(k1,k2,k3),相當于創(chuàng)建了(k1)、(k1,k2)和(k1,k2,k3)三個索引,這就是最左匹配原則。
  •  聯(lián)合索引不滿足最左原則,索引一般會失效,但是這個還跟Mysql優(yōu)化器有關的。

12、對查詢進行優(yōu)化,應考慮在where及order by涉及的列上建立索引,盡量避免全表掃描。

反例: 

  1. select * from user where address ='深圳' order by age ; 

正例:   

  1. 添加索引  
  2.     alter table user add index idx_address_age (address,age) 

13、如果插入數(shù)據(jù)過多,考慮批量插入。

反例: 

  1. for(User u :list){  
  2.    INSERT into user(name,age) values(#name#,#age#)  
  3.   } 

正例:   

  1. //一次500批量插入,分批進行  
  2.    insert into user(name,age) values  
  3.    <foreach collection="list" item="item" index="index" separator=",">  
  4.        (#{item.name},#{item.age})  
  5.    </foreach> 

理由:

  •  批量插入性能好,更加省時間

打個比喻:假如你需要搬一萬塊磚到樓頂,你有一個電梯,電梯一次可以放適量的磚(最多放500),你可以選擇一次運送一塊磚,也可以一次運送500塊磚,你覺得哪個時間消耗大?

14、在適當?shù)臅r候,使用覆蓋索引。

覆蓋索引能夠使得你的SQL語句不需要回表,僅僅訪問索引就能夠得到所有需要的數(shù)據(jù),大大提高了查詢效率。

反例:   

  1. // like模糊查詢,不走索引了  
  2.    select * from user where userid like '%123%' 

正例: 

  1. //id為主鍵,那么為普通索引,即覆蓋索引登場了。 
  2.  
  3.   select id,name from user where userid like '%123%'; 

15、慎用distinct關鍵字

distinct 關鍵字一般用來過濾重復記錄,以返回不重復的記錄。在查詢一個字段或者很少字段的情況下使用時,給查詢帶來優(yōu)化效果。但是在字段很多的時候使用,卻會大大降低查詢效率。

反例:   

  1. SELECT DISTINCT * from  user; 

正例:   

  1. select DISTINCT name from user; 

理由:

  •  帶distinct的語句cpu時間和占用時間都高于不帶distinct的語句。因為當查詢很多字段時,如果使用distinct,數(shù)據(jù)庫引擎就會對數(shù)據(jù)進行比較,過濾掉重復數(shù)據(jù),然而這個比較、過濾的過程會占用系統(tǒng)資源,cpu時間。

16、刪除冗余和重復索引

反例:     

  1. KEY `idx_userId` (`userId`)    
  2.       KEY `idx_userId_age` (`userId`,`age`) 

正例:     

  1. //刪除userId索引,因為組合索引(A,B)相當于創(chuàng)建了(A)和(A,B)索引  
  2.       KEY `idx_userId_age` (`userId`,`age`) 

理由:

  •  重復的索引需要維護,并且優(yōu)化器在優(yōu)化查詢的時候也需要逐個地進行考慮,這會影響性能的。

17、如果數(shù)據(jù)量較大,優(yōu)化你的修改/刪除語句。

避免同時修改或刪除過多數(shù)據(jù),因為會造成cpu利用率過高,從而影響別人對數(shù)據(jù)庫的訪問。

反例:   

  1. //一次刪除10萬或者100萬+?  
  2.    delete from user where id <100000 
  3.    //或者采用單一循環(huán)操作,效率低,時間漫長  
  4.    for(User user:list){  
  5.       delete from user;   
  6.    } 

正例: 

  1. //分批進行刪除,如每次500  
  2.   delete user where id<500  
  3.   delete product where id>=500 and id<1000; 

理由:

  •  一次性刪除太多數(shù)據(jù),可能會有l(wèi)ock wait timeout exceed的錯誤,所以建議分批操作。

18、where子句中考慮使用默認值代替null。

反例:   

  1. select * from user where age is not null; 

正例: 

  1. //設置0為默認值  
  2. select * from user where age>0; 

理由:

  •  并不是說使用了is null 或者 is not null 就會不走索引了,這個跟mysql版本以及查詢成本都有關。

如果mysql優(yōu)化器發(fā)現(xiàn),走索引比不走索引成本還要高,肯定會放棄索引,這些條件 !=,>isnull,isnotnull經常被認為讓索引失效,其實是因為一般情況下,查詢的成本高,優(yōu)化器自動放棄索引的。

  •  如果把null值,換成默認值,很多時候讓走索引成為可能,同時,表達意思會相對清晰一點。

19、不要有超過5個以上的表連接

  •  連表越多,編譯的時間和開銷也就越大。
  •  把連接表拆開成較小的幾個執(zhí)行,可讀性更高。
  •  如果一定需要連接很多表才能得到數(shù)據(jù),那么意味著糟糕的設計了。

20、exist&in的合理利用

假設表A表示某企業(yè)的員工表,表B表示部門表,查詢所有部門的所有員工,很容易有以下SQL:   

  1. select * from A where deptId in (select deptId from B); 

這樣寫等價于:

先查詢部門表B

select deptId from B

再由部門deptId,查詢A的員工

select * from A where A.deptId = B.deptId

可以抽象成這樣的一個循環(huán):       

  1. List<> resultSet ;  
  2.         for(int i=0;i<B.length;i++) {  
  3.               for(int j=0;j<A.length;j++) {  
  4.               if(A[i].id==B[j].id) {  
  5.                  resultSet.add(A[i]);  
  6.                  break;  
  7.               }  
  8.            }  
  9.         } 

顯然,除了使用in,我們也可以用exists實現(xiàn)一樣的查詢功能,如下:   

  1. select * from A where exists (select 1 from B where A.deptId = B.deptId); 

因為exists查詢的理解就是,先執(zhí)行主查詢,獲得數(shù)據(jù)后,再放到子查詢中做條件驗證,根據(jù)驗證結果(true或者false),來決定主查詢的數(shù)據(jù)結果是否得意保留。

那么,這樣寫就等價于:

select * from A,先從A表做循環(huán)

select * from B where A.deptId = B.deptId,再從B表做循環(huán).

同理,可以抽象成這樣一個循環(huán):       

  1. List<> resultSet ;  
  2.         for(int i=0;i<A.length;i++) {  
  3.               for(int j=0;j<B.length;j++) {  
  4.               if(A[i].deptId==B[j].deptId) {  
  5.                  resultSet.add(A[i]);  
  6.                  break;  
  7.               }  
  8.            }  
  9.         } 

數(shù)據(jù)庫最費勁的就是跟程序鏈接釋放。假設鏈接了兩次,每次做上百萬次的數(shù)據(jù)集查詢,查完就走,這樣就只做了兩次;相反建立了上百萬次鏈接,申請鏈接釋放反復重復,這樣系統(tǒng)就受不了了。即mysql優(yōu)化原則,就是小表驅動大表,小的數(shù)據(jù)集驅動大的數(shù)據(jù)集,從而讓性能更優(yōu)。

因此,我們要選擇最外層循環(huán)小的,也就是,如果B的數(shù)據(jù)量小于A,適合使用in,如果B的數(shù)據(jù)量大于A,即適合選擇exist。

21、盡量用union all替換 union

如果檢索結果中不會有重復的記錄,推薦union all 替換 union。

反例: 

  1. select * from user where userid=1   
  2.  union    
  3.  select * from user where age = 10 

正例: 

  1. select * from user where userid=1   
  2. union all  
  3. select * from user where age = 10 

理由:

  •  如果使用union,不管檢索結果有沒有重復,都會嘗試進行合并,然后在輸出最終結果前進行排序。如果已知檢索結果沒有重復記錄,使用union all 代替union,這樣會提高效率。

22、索引不宜太多,一般5個以內。

  •  索引并不是越多越好,索引雖然提高了查詢的效率,但是也降低了插入和更新的效率。
  •  insert或update時有可能會重建索引,所以建索引需要慎重考慮,視具體情況來定。
  •  一個表的索引數(shù)最好不要超過5個,若太多需要考慮一些索引是否沒有存在的必要。

23、盡量使用數(shù)字型字段,若只含數(shù)值信息的字段盡量不要設計為字符型

反例:   

  1. `king_id` varchar(20) NOT NULL COMMENT '守護者Id' 

正例:   

  1. `king_id` int(11) NOT NULL COMMENT '守護者Id' 

理由:

  •  相對于數(shù)字型字段,字符型會降低查詢和連接的性能,并會增加存儲開銷。

24、索引不適合建在有大量重復數(shù)據(jù)的字段上,如性別這類型數(shù)據(jù)庫字段。

因為SQL優(yōu)化器是根據(jù)表中數(shù)據(jù)量來進行查詢優(yōu)化的,如果索引列有大量重復數(shù)據(jù),Mysql查詢優(yōu)化器推算發(fā)現(xiàn)不走索引的成本更低,很可能就放棄索引了。

25、盡量避免向客戶端返回過多數(shù)據(jù)量。

假設業(yè)務需求是,用戶請求查看自己最近一年觀看過的直播數(shù)據(jù)。

反例: 

  1. //一次性查詢所有數(shù)據(jù)回來  
  2.   select * from LivingInfo where watchId =useId and watchTime >= Date_sub(now(),Interval 1 Y) 

正例:   

  1. //分頁查詢  
  2.     select * from LivingInfo where watchId =useId and watchTime>= Date_sub(now(),Interval 1 Y) limit offset,pageSize  
  3.     //如果是前端分頁,可以先查詢前兩百條記錄,因為一般用戶應該也不會往下翻太多頁,  
  4.     select * from LivingInfo where watchId =useId and watchTime>= Date_sub(now(),Interval 1 Y) limit 200 ; 

26、當在SQL語句中連接多個表時,請使用表的別名,并把別名前綴于每一列上,這樣語義更加清晰。

反例: 

  1. select  * from A inner  
  2. join B on A.deptId = B.deptId; 

正例:   

  1. select  memeber.name,deptment.deptName from A member inner  
  2.     join B deptment on member.deptId = deptment.deptId; 

27、盡可能使用varchar/nvarchar 代替 char/nchar。

反例:   

  1. `deptName` char(100) DEFAULT NULL COMMENT '部門名稱' 

正例: 

  1. `deptName` varchar(100) DEFAULT NULL COMMENT '部門名稱' 

理由:

  •  因為首先變長字段存儲空間小,可以節(jié)省存儲空間。
  •  其次對于查詢來說,在一個相對較小的字段內搜索,效率更高。

28、為了提高group by 語句的效率,可以在執(zhí)行到該語句前,把不需要的記錄過濾掉。

反例:   

  1. select job,avg(salary) from employee  group by job having job ='president'   
  2.     or job = 'managent' 

正例:   

  1. select job,avg(salary) from employee where job ='president'   
  2.    or job = 'managent' group by job; 

29、如果字段類型是字符串,where時一定用引號括起來,否則索引失效

反例: 

  1. select * from user where userid =123

正例: 

  1. select * from user where userid ='123'

理由:

  •  為什么第一條語句未加單引號就不走索引了呢?這是因為不加單引號時,是字符串跟數(shù)字的比較,它們類型不匹配,MySQL會做隱式的類型轉換,把它們轉換為浮點數(shù)再做比較。

30、使用explain 分析你SQL的計劃

日常開發(fā)寫SQL的時候,盡量養(yǎng)成一個習慣吧。用explain分析一下你寫的SQL,尤其是走不走索引這一塊。   

  1. explain select * from user where userid =10086 or age =18

 

 

責任編輯:龐桂玉 來源: 數(shù)據(jù)庫開發(fā)
相關推薦

2020-03-25 09:01:34

SQL建議索引

2021-08-08 14:26:24

SQL數(shù)據(jù)庫開發(fā)

2023-09-08 07:06:36

技術網站工具

2021-01-09 22:35:51

程序員編碼代碼

2011-04-01 09:13:19

VB程序員

2009-11-23 20:38:51

PHP開發(fā)工具

2025-07-01 00:45:00

2012-09-13 10:44:18

Python代碼

2016-12-19 14:42:32

2022-10-24 08:10:21

SQL代碼業(yè)務

2020-11-20 14:14:14

SQL數(shù)據(jù)庫語言

2012-06-28 11:11:39

jQuery

2012-03-31 10:05:51

WEBCSS

2017-07-14 09:54:47

代碼函數(shù)程序

2019-09-19 10:15:15

程序員人生第一份工作文章

2015-09-28 10:09:05

程序員新手

2023-10-31 16:22:31

代碼質量軟件開發(fā)Java

2023-02-13 23:43:06

程序員網站

2011-05-31 13:43:46

外鏈
點贊
收藏

51CTO技術棧公眾號

中国老熟女重囗味hdxx| 欧美一级黄色录像片| 中文字幕免费视频观看| 午夜精品一区二区三区国产 | 每日在线更新av| 成人高清免费观看mv| 美女精品一区二区| 欧美国产日韩在线| 特级西西www444人体聚色| 国产精品一区二区精品| 狠狠色狠色综合曰曰| 亚洲在线色站| 水中色av综合| 韩国欧美国产一区| 日韩av成人在线观看| 永久久久久久久| 欧美一区二区三区激情视频| 精品欧美久久久| 国产精品视频分类| 97在线超碰| 亚洲男人的天堂在线观看| 国产午夜精品一区| av片免费播放| 久久久久久久高潮| 久操成人在线视频| 性少妇xx生活| 久久99精品久久久久久园产越南| 精品三级在线观看| 日韩精品aaa| 日韩免费电影| 精品日韩视频在线观看| a级黄色片免费| 精品国产丝袜高跟鞋| 国产亚洲美州欧州综合国| 国产一区在线观| 国产福利资源在线| 精久久久久久久久久久| 国产精品99久久久久久人| 国产情侣在线视频| 在线播放日韩| 久久久久久久一| 欧美精品99久久久| 雨宫琴音一区二区三区| 日韩在线视频导航| 黄色裸体一级片| 国产一区二区亚洲| 亚洲天堂免费在线| 91成人在线免费视频| 亚洲精品中文字幕99999| 亚洲国产免费av| 亚洲熟女乱综合一区二区三区| 一区二区三区四区精品视频| 日韩欧美成人激情| av影片在线播放| 风间由美中文字幕在线看视频国产欧美| 91精品久久久久久久99蜜桃| 99久久99精品| 秋霞影院一区| 欧美精品一区二区三区高清aⅴ| 波多野结衣三级视频| 日韩在线观看一区二区三区| 欧美成人aa大片| 色哟哟视频在线| 国产精品17p| 日韩黄在线观看| 日本精品在线观看视频| 日韩电影二区| 欧美老女人性生活| 国产性猛交普通话对白| 亚洲精品韩国| 国产极品jizzhd欧美| 中国一区二区视频| 国产一区二区网址| 国产免费高清一区| 伦理片一区二区三区| 国产日韩欧美精品一区| 自拍偷拍一区二区三区| av理论在线观看| 亚洲国产精品欧美一二99| 草草久久久无码国产专区| av亚洲一区二区三区| 欧美精品1区2区| 1314成人网| 色橹橹欧美在线观看视频高清 | 999视频在线观看| 亚洲女同志亚洲女同女播放| 久久综合九色综合欧美98| 日韩偷拍一区二区| 精品国产白色丝袜高跟鞋| 亚洲综合一二三区| 免费激情视频在线观看| 伊人久久精品| 亚洲国产小视频| 亚洲女同二女同志奶水| 影音先锋亚洲电影| 国产精品久久电影观看| 亚洲精品国产精品国| 久久精品欧美一区二区三区不卡 | 精品白丝av| 国产精品极品在线| 蜜桃视频久久一区免费观看入口| 久久免费偷拍视频| 国产精品三级一区二区| av激情成人网| 亚洲黄一区二区| www中文在线| 香蕉国产精品偷在线观看不卡| 成人免费视频在线观看超级碰| 五月天久久久久久| 亚洲人成影院在线观看| 国产xxxxx在线观看| 欧美午夜在线播放| 在线观看成人黄色| 久久艹免费视频| 国产成人午夜电影网| 亚洲成人一区二区三区| 亚洲国产福利| 精品999在线播放| 永久久久久久久| 毛片一区二区三区| 欧美一级爱爱| 中文字幕影音在线| 精品999在线播放| 青娱乐免费在线视频| 麻豆精品精品国产自在97香蕉| 久久99精品久久久久久青青日本 | 中文字幕在线播放一区二区| 成人羞羞视频在线看网址| 欧美一区二区色| 手机看片一区二区| 一区二区三区小说| 日韩视频在线观看一区二区三区| 精品国产不卡| 国产ts人妖一区二区三区| 午夜一区在线观看| 亚洲电影一区二区三区| 免费黄色在线播放| 亚洲五月综合| 亚洲精品欧美一区二区三区| 免费网站黄在线观看| 欧美日韩激情一区二区三区| 夫妇露脸对白88av| 青青草国产成人av片免费| 日本不卡免费新一二三区| 欧美18—19sex性hd| 日韩精品欧美国产精品忘忧草 | 免费日韩精品中文字幕视频在线| 国产日韩精品推荐| 98色花堂精品视频在线观看| 亚洲成人网久久久| 国产无遮挡又黄又爽| 成人免费福利片| 免费av观看网址| 亚洲第一福利专区| 国产精品第10页| av在线免费观看网| 在线成人免费观看| 免费国产羞羞网站美图| 国产精品538一区二区在线| 国产高清不卡无码视频| 91精品啪在线观看国产爱臀 | 日本少妇激情视频| 91亚洲精品一区二区乱码| 黄色片视频在线免费观看| 亚洲免费福利一区| 国产精品麻豆va在线播放| 日本中文字幕伦在线观看| 欧美一级在线免费| 国产中文字字幕乱码无限| 久久综合色天天久久综合图片| 亚洲爆乳无码专区| 国产精品不卡| 国产精品大全| 高清电影一区| 久久夜色精品国产| 日本黄色免费视频| 欧美专区日韩专区| 男人的天堂久久久| 91麻豆成人久久精品二区三区| 欧美精品一区二区三区免费播放| 97精品中文字幕| 国产成人精品一区二区三区福利 | 亚洲色图14p| 日本大胆欧美人术艺术动态| 青青草免费在线视频观看| 欧美男人操女人视频| 国产精品久久二区| 欧美24videosex性欧美| 亚洲人成欧美中文字幕| 国产精品无码免费播放| 偷拍与自拍一区| 三级黄色片在线观看| 成人国产精品免费| 国产原创精品在线| 亚洲精品国产日韩| 国产a级片免费看| 日韩伦理一区二区三区| 成人免费视频网| 中文字幕高清在线播放| 欧美精品免费在线观看| 可以免费看污视频的网站在线| 欧美一区二区三区在线看| 免费av网站在线| 日韩美女久久久| 欧美激情aaa| 不卡电影一区二区三区| av亚洲天堂网| 日精品一区二区| 精品无码一区二区三区爱欲| 色婷婷热久久| 日本高清一区| 精品欧美午夜寂寞影院| 亚洲自拍偷拍区| 日韩电影精品| 国产精品久久久久久av| 松下纱荣子在线观看| 欧美高清视频在线播放| 男人天堂久久久| 在线观看日韩av| 国产在线色视频| 日韩av在线网页| 性一交一乱一色一视频麻豆| 欧美久久久久久久久| 国产成人麻豆免费观看| 色综合天天综合在线视频| 国产精品 欧美 日韩| 一区二区三区av电影 | 国产最新视频在线观看| 日韩av在线电影网| 亚洲爱情岛论坛永久| 欧美一级高清大全免费观看| 亚洲在线观看av| 欧美日韩在线三区| 国产日韩久久久| 在线观看视频91| 日日骚av一区二区| 欧美性xxxx在线播放| 亚洲日本视频在线观看| 午夜精品123| 精品国产乱码一区二区| 亚洲成人动漫精品| 国偷自拍第113页| 偷拍日韩校园综合在线| 日韩欧美亚洲视频| 午夜欧美在线一二页| 国产成人亚洲精品自产在线| 亚洲成人一区在线| 色播视频在线播放| 天天做天天摸天天爽国产一区| 久久国产精品波多野结衣| 亚洲综合在线免费观看| 国产无码精品一区二区| 精品久久久久久久中文字幕| 成人午夜淫片100集| 黑人巨大精品欧美一区二区| 7799精品视频天天看| 在线区一区二视频| 夜夜爽8888| 欧美一区二视频| 黑人乱码一区二区三区av| 亚洲国产精品字幕| 国产黄在线观看| 日韩视频免费中文字幕| 羞羞网站在线看| 午夜美女久久久久爽久久| 偷拍自拍在线看| 国产精品一区二区女厕厕| 在线观看欧美| 国产精品久久亚洲| 日韩极品在线| 亚洲欧洲一区二区在线观看| 亚洲精品午夜av福利久久蜜桃| 人人妻人人澡人人爽欧美一区 | 999在线观看| 丁香婷婷综合五月| 性少妇bbw张开| 国产精品家庭影院| 久久久久久久久久久久久久久久久| 亚洲高清免费一级二级三级| 黄色片视频免费| 4hu四虎永久在线影院成人| www久久久com| 亚洲性视频网站| 日本aa在线| 国产精品扒开腿做爽爽爽男男| 国产精品亚洲综合在线观看| 精品一区二区久久久久久久网站| 欧美性感美女一区二区| 屁屁影院ccyy国产第一页| 日韩激情一区二区| 精产国品一区二区三区| 久久九九影视网| 九九视频在线观看| 欧美在线小视频| 欧美一级淫片免费视频魅影视频| 亚洲深夜福利在线| 男人添女人下部高潮视频在线观看| 国产成人欧美在线观看| 视频精品二区| 亚洲一区二区三区乱码| 亚洲国产日本| www.亚洲自拍| 国产亚洲精品中文字幕| 国产性生活网站| 91精品国产综合久久福利软件| 欧美日韩国产亚洲沙发| 欧美激情在线有限公司| 国产精品久久久久久久久久齐齐| 国产嫩草一区二区三区在线观看| 国产精品久久久乱弄| 日本老熟妇毛茸茸| 成人国产精品免费| 精品99在线观看| 欧美日韩一级大片网址| 可以在线观看的av| 97精品国产97久久久久久| 91精品国产色综合久久不卡粉嫩| 久久久久久国产精品一区| 欧美日韩网址| 日本高清一区二区视频| 欧美激情在线观看视频免费| 精品欧美一区二区三区免费观看| 日韩一卡二卡三卡国产欧美| 免费黄色电影在线观看| 国产精品亚洲欧美导航| 欧美猛男男男激情videos| 国产特级淫片高清视频| 成人黄色一级视频| 久久这里只有精品免费| 日韩一区二区三区四区五区六区| 日本www在线观看视频| 国产精品美女免费看| 精品欧美久久| 91香蕉视频污版| 国产亚洲成年网址在线观看| 久久久精品视频网站| 亚洲男人天堂九九视频| 26uuu亚洲电影| 久久精品国产理论片免费| 一本久道久久久| 亚洲蜜桃精久久久久久久久久久久| 天天av天天翘天天综合网| 天天干天天干天天干| 91爱视频在线| 久久99国产精品视频| 99视频免费播放| 国产精品视频一二三| 亚洲图片视频小说| 日日狠狠久久偷偷四色综合免费| 亚洲伊人精品酒店| 国产女主播av| 成人免费高清视频在线观看| 国产精品100| 亚洲色图美腿丝袜| 第四色男人最爱上成人网| 日韩视频在线播放| 激情综合网天天干| www欧美com| 亚洲精品国产精品国自产在线| 天堂在线中文网官网| 日韩欧美视频第二区| 久久精品国产亚洲aⅴ| 欧美偷拍第一页| 亚洲国产美女精品久久久久∴| 中文字幕资源网在线观看免费| 亚洲 日韩 国产第一区| 国产专区欧美精品| 精品视频一区二区在线观看| 亚洲加勒比久久88色综合| 日本高清不卡一区二区三区视频 | 久久精品—区二区三区舞蹈| 在线看不卡av| v片在线观看| 精品一区二区三区视频日产| 丝袜美腿一区二区三区| 很污很黄的网站| 亚洲成avwww人| 亚洲成a人片| 五月天激情图片| 久久综合九色综合久久久精品综合| 一级特黄aaa| 国内精品久久久久影院 日本资源 国内精品久久久久伊人av | 亚洲一区二区三区视频| 亚洲毛片视频| 久久久久99精品成人| 精品国一区二区三区| 亚洲四虎影院| www.国产在线视频| 欧美极品aⅴ影院| 亚洲国产精品欧美久久 | 欧美午夜性视频| 中文字幕一区二区三区在线观看 | 久久97精品| 在线观看日本一区二区| 亚洲电影在线免费观看| av在线二区| 精品亚洲一区二区三区四区五区高| 精品综合久久久久久8888| 亚洲男人的天堂在线视频| 久久av在线播放|