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

MySQL 索引進階指南:深入探秘關鍵知識點

數據庫 MySQL
在這篇文章中,我們將一同突破常規理解的局限,去探索 MySQL 索引更為精妙和細微之處。

在 MySQL 的浩瀚世界中,索引猶如高效查詢的魔法鑰匙,為數據的快速檢索和操作打開便捷之門。當我們對 MySQL 索引有了初步認知后,是時候踏上進階之旅,深入挖掘那些隱藏在背后、更具深度和復雜性的索引知識點。

在這篇文章中,我們將一同突破常規理解的局限,去探索 MySQL 索引更為精妙和細微之處。從索引的高級特性到復雜場景下的運用策略,從性能優化的關鍵要點到可能遇到的疑難問題解析,每一個知識點都將如拼圖般為你構建起更為完整和強大的索引知識體系。無論你是經驗豐富的開發者,還是正在進階道路上努力前行的技術探索者,都將在這里收獲新的啟迪和寶貴的見解。讓我們開啟這場精彩的進階之旅,一同揭開 MySQL 索引的神秘面紗,釋放其更為強大的力量。

一、詳解創建高性能的索引準則

1. 前綴索引的選擇

使用前綴的索引的重要原則就是用盡可能小的前綴獲取最高校的查詢性能,例如我們現在有下面這樣一張表。

CREATE TABLE db1.city (
 city varchar(50) NULL
)
ENGINE=InnoDB
DEFAULT CHARSET=utf8
COLLATE=utf8_general_ci;

表中會有這樣的數據,讀者可以按需下面的腳本創建隨機的幾百萬條:

INSERT INTO db1.city (city) VALUES('London');
INSERT INTO db1.city (city) VALUES('Hiroshima');
INSERT INTO db1.city (city) VALUES('teboksary');
INSERT INTO db1.city (city) VALUES('pak kret');
INSERT INTO db1.city (city) VALUES('yaound');
INSERT INTO db1.city (city) VALUES('tel aviv-jaffa');
INSERT INTO db1.city (city) VALUES('Shimoga');
INSERT INTO db1.city (city) VALUES('Cabuyao');
....```

執行上述腳本之后,我們不妨看看表的數據分布情況

```sql
select count(*) as c,city from city group by city; 

最終輸出比重如下:

66 London
50 Hiroshima
49 teboksary
50 pak kret
50 yaound
48 tel aviv-jaffa
48 Shimoga
46 Cabuyao
46 Callao
46 Bislig

由于city字段存在大量的重復,所以我們選擇前綴索引,通過前綴索引的方式實現最盡可能小的長度區分盡可能多的數據,從而做到高效查詢且解決索引維護的開銷。

對此,我們提出了這樣一種做法,首先我們先算出city列的基數,查看不重復列所占用所有數據的比值是多少:

select count(distinct city)/count(*) from city;

輸出結果如下,說明完全不重復的city僅僅占用2%,所以我們創建的前綴索引的基數要盡可能接近這個值,才能做到數據區分最大化:

所以我們截取不同的長度的前綴計算基數的值:

select 
count(distinct left(city,1))/count(*) as sel1,
count(distinct left(city,2))/count(*) as sel2,
count(distinct left(city,3))/count(*) as sel3,
count(distinct left(city,4))/count(*) as sel4, 
count(distinct left(city,5))/count(*) as sel5, 
count(distinct left(city,6))/count(*) as sel6, 
count(distinct left(city,7))/count(*) as sel7
from city;

最終我們輸出結果如下,可以看到選擇長度為3的時候,基數就和完整列的值一樣了,所以我們的前綴索引長度設置為3即可:

CREATE INDEX city_idx ON city (city(3));

需要注意的是,我們使用前綴索引進行查詢時,MySQL是無法使用前綴索引進行group by和order by的,所以有涉及這種查詢的讀者需要注意一下使用場景。

2. 索引順序的設計

在不考慮排序和分組的情況下,涉及多列查詢的sql我們建議使用多列索引,而創建多列索引的原則也能很簡單,將選擇性比較大的列放在最前面即可。

為了完成這個實驗,我們可創建下面這張表:

CREATE TABLE `payment` (
  `payment_id` SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `customer_id` SMALLINT UNSIGNED NOT NULL,
  `staff_id` TINYINT UNSIGNED NOT NULL,
  `rental_id` INT DEFAULT NULL,
  `amount` DECIMAL(5,2) NOT NULL,
  `payment_date` DATETIME NOT NULL,
  `last_update` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`payment_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

然后我們使用腳本或者別的方式創建100w條數據并插入到數據庫中。

因為我們的查詢sql需要用到customer_id和staff_id作為查詢條件,所以我們希望為這兩列字段創建組合索引,所以我們使用了如下sql語句獲取這兩列的基數。

select count(*) as total,
count(distinct customer_id)/count(*) customer_id,
count(distinct staff_id)/count(*)  staff_id
from payment;

可以看到,customer_id基數更大,區分度更高,所以我們建議customer_id放在前面。

最終我們的創建如下索引,感興趣的讀者可以將兩者位置調換一下,查看百萬級別數據性能。

CREATE INDEX idx ON payment ( customer_id, staff_id );

以下便是筆者的查詢sql,可以看到執行計劃走了索引。

select * from payment where staff_id=1 and customer_id=1;

而且查詢時間為125ms左右:

有的讀者可能不相信筆者的思路,我們不妨將索引順序反過來。

DROP INDEX idx ON payment;
CREATE INDEX idx ON payment ( staff_id ,  customer_id);

我們還是用同樣的sql,可以看到執行時間變長了,這還是1w條數據的情況,如果達到百萬級別想想更是災難。

3. 巧用索引順序來排序

如果我們查詢的時用的order by和索引順序是一致的,而且查詢時還是索引覆蓋的話,那么我們就可以認為這是一個良好的設計。 使用索引排序同樣遵循最左匹配原則,而且在多表查詢時用到的永遠是第一張表的索引。當然這里也有一些特殊情況,筆者會在后文中詳細闡述。

為了完成實驗,筆者創建了下面這樣一張數據表(注意這個下面的唯一索引UNIQUE KEY,筆者后續的查詢都會基于這個唯一索引完成),并插入幾條數據。

CREATE TABLE rental (
  rental_id INT NOT NULL AUTO_INCREMENT,
  rental_date DATETIME NOT NULL,
  inventory_id MEDIUMINT UNSIGNED NOT NULL,
  customer_id SMALLINT UNSIGNED NOT NULL,
  return_date DATETIME DEFAULT NULL,
  staff_id TINYINT UNSIGNED NOT NULL,
  last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (rental_id),
  UNIQUE KEY  (rental_date,inventory_id,customer_id),
  KEY idx_fk_inventory_id (inventory_id),
  KEY idx_fk_customer_id (customer_id),
  KEY idx_fk_staff_id (staff_id),
)ENGINE=InnoDB DEFAULT CHARSET=utf8;

對應的腳本都在這個倉庫,有需要的讀者可以自取,注意選用MySQL版本的:https://github.com/ivanceras/sakila](https://github.com/ivanceras/sakila

先來看看下面這個語句,這就是我們上文所說的特殊情況,請問這條sql會走索引嗎?

select *
from
 rental r
where
 rental_date = '2005-5-25'
order by
 inventory_id ,
 customer_id ;

答案是會的,我們用explain可以看到這條語句用到了rental_date,原因也很簡單,我們的唯一索引順序為rental_date,inventory_id,customer_id,所以我們的where條件中帶有rental_date是個常量查詢(這里可以理解為等于號的查詢),而且order條件方向順序一致,使得where+order符合最左匹配原則,所以最終走了索引,而且extra也沒用出現filesort。

我們上面提到order順序不一致,或者where+order用的列不符合最左匹配原則查詢效率會降低,并且會走文件排序,我們不妨寫個sql印證一下。

先看看排序方向不一致的,如下所示,可以看到一個降序加一個升序,最終執行計劃就是用了文件排序。

在看看where+order不符合最左匹配原則的情況,同樣走了文件排序。

了解了特殊情況之后,我們再來看看一些常規的情況。如下所示,這條sql where+order符合最左匹配原則,所以走了索引。

explain select * 
from
 rental r
where
 rental_date = '2005-5-25'
order by
 inventory_id ;

輸出結果如下:

id|select_type|table|partitions|type|possible_keys|key        |key_len|ref  |rows|filtered|Extra|
--+-----------+-----+----------+----+-------------+-----------+-------+-----+----+--------+-----+
 1|SIMPLE     |r    |          |ref |rental_date  |rental_date|5      |const|   1|   100.0|     |

當然符合最左匹配原則并不意味著只要列符合最左前綴即可,如下所示,如果第一個列出現范圍查詢則索引就直接失效了。

explain select * 
from
 rental r
where
 rental_date > '2005-5-25'
order by
 inventory_id ,customer_id ;

輸出結果如下,可以看到直接using where且文件排序,還不走索引

id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows |filtered|Extra                      |
--+-----------+-----+----------+----+-------------+---+-------+---+-----+--------+---------------------------+
 1|SIMPLE     |r    |          |ALL |rental_date  |   |       |   |15840|    50.0|Using where; Using filesort|

同樣的排序時,如果用到了非索引的列也會使得排序變為文件排序:

最后我們再來看一個聯結查詢的例子,首先我們建了個表再插入數據,腳本都在上方倉庫讀者可以自行獲取,筆者這里為了省事把所有外鍵的定義都刪了。

CREATE TABLE film_actor (
  actor_id SMALLINT UNSIGNED NOT NULL,
  film_id SMALLINT UNSIGNED NOT NULL,
  last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY  (actor_id,film_id),
  KEY idx_fk_film_id (`film_id`)
)ENGINE=InnoDB DEFAULT CHARSET=utf8;


CREATE TABLE film (
  film_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
  title VARCHAR(255) NOT NULL,
  description TEXT DEFAULT NULL,
  release_year YEAR DEFAULT NULL,
  language_id TINYINT UNSIGNED NOT NULL,
  original_language_id TINYINT UNSIGNED DEFAULT NULL,
  rental_duration TINYINT UNSIGNED NOT NULL DEFAULT 3,
  rental_rate DECIMAL(4,2) NOT NULL DEFAULT 4.99,
  length SMALLINT UNSIGNED DEFAULT NULL,
  replacement_cost DECIMAL(5,2) NOT NULL DEFAULT 19.99,
  rating ENUM('G','PG','PG-13','R','NC-17') DEFAULT 'G',
  special_features SET('Trailers','Commentaries','Deleted Scenes','Behind the Scenes') DEFAULT NULL,
  last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY  (film_id),
  KEY idx_title (title),
  KEY idx_fk_language_id (language_id),
  KEY idx_fk_original_language_id (original_language_id)

)ENGINE=InnoDB DEFAULT CHARSET=utf8;

如下所示,這句sql理論上是可以走索引的,但MySQL優化器將film_actor當作第二張表導致order by無法使用索引。

explain select * from film_actor   inner join film using(film_id)order by actor_id ;

所以我們看到了這樣的輸出,非常低效。

最后我們總結一下使用排序的原則:

  • order by順序方向一致。
  • where+order要符合最左匹配原則。
  • where條件不要用范圍查詢。
  • 多表聯查是觀察MySQL優化器會不會做一些奇奇怪怪的優化。

避免創建冗余和重復索引

有時因為開發人員對于數據庫的立即偏差會創建出一些冗余的索引,如下所示:

CREATE table t1(
id int not null primary key,
name varchar(20),
unique(id),
index(id)
)engine=innodb;

實際上主鍵、unique、index的關系如下圖所示,由于開發對于三者關系的不了解,導致了創建了兩個沒有必要的索引,所以我們日常還是需要多留心一下這些問題:

還有一種情況我們也必須要了解一下,有時候我們為了提高多列查詢的效率會創建組合索引。例如我們的sql語句為

select * from t where a=123 and b='aa'

這種情況下我們肯定會為了a、b創建索引。

如此一來,按照最左匹配原則,我們就無需單獨為字段a創建一個索引。

select * from t where a=123;

如下圖可以看到,單獨使用a作為查詢條件時a也會走我們創建的組合索引。

但是某些場景之下,我們可能又會寫出這樣一條sql,所以我們還是要為(b,a)創建一條索引,請問該索引是冗余索引嗎?

select * from t where   b='aa3' and a=12

答案不是的,原因很簡單,盡管SQL優化器會讓上述SQL走組合索引(a,b),但是我們單獨以b作為查詢條件時,是走不了組合索引(a,b)的,所以我們創建組合索引(b,a)并不算冗余索引。

二、優化特定類型的查詢性能

1. 為什么查詢性能會慢

我們首先了解一下一條sql的生命周期:

  • 客戶端向服務端建立連接,并將sql發送給服務端、
  • 服務端進行語法解析,查看語法是否存在問題。
  • 生成執行計劃。
  • 服務端執行sql。
  • 將sql執行結果返回給客戶端。

這其中我們不難發現,執行是最重要的一環,造成查詢慢的重要部分基本都是執行,其原因基本都是訪問的數據量太大,或者一次需要篩選出大量的數據。

所以,對于這類問題,我們解決方向基本是:

避免檢索沒必要的行。

盡可能避免查詢大量的數據,對于某些查詢,我們建議使用分頁查詢的方式。

很多人可能認為某一些查詢慢的問題也出現在客戶端和服務端建立連接和斷開連接這一部分,實際上MySQL的設計很少會出現這些問題,在某些版本的MySQL中對于簡單查詢,它支持1秒10w次,即使是千兆網卡,這一個數字也基本是2000左右,所以對于現如今的服務器配置,這里的開銷基本可以忽略。

2. 優化特定類型的查詢

下面筆者會介紹一些常見的錯誤類型的特定類型查詢,我們先來說一個常見的查詢,count,count常用于統計某列非null的總數量,所以某些情況下,我們可能常用于統計列的總數。所以我們統計數據庫的列數時可能會寫出這樣一句sql

--用主鍵統計數據庫行數
select count(rental_id) from rental r ; 

實際上,我們使用count()就行了,很多人認為count(*)會擴展出所有的列造成性能問題,實際恰恰相反,count(*)不僅不會擴展所有的列,而且也能統計出當前表中所有的行。所以對于要統計的sql語句我們更簡易使用count(),不僅更能清晰表達意圖還有更不錯的性能表現。

對于count我們也可以用于某列的歸類操作,例如我們希望查詢出顏色為藍色或者紅色的行的數量。我們的數據如下所示,可以看到顏色為3紅4藍1空。

所以我們可能會用到這樣一條sql,但是我們不想為此多寫一列。

select count(*),color  from item i group by color ;

所以我們用到了這樣一條sql,但是用到了函數嵌套很不直觀

select sum(if(color='blue',1,0)) as blue ,sum(if(color='red',1,0)) as red from item;

其實我們運用count統計非null的特性,就可以寫出這面這樣一條精致的sql

select count(color='blue' or null) as blue,count(color='red' or null) as red from item;

可以看到查詢結果也符合預期。

最后我們再來說說union,如果我們能夠保證union的數據是不重復,我們還是建議使用union all,如下所示:

explain select rental_id   from rental where inventory_id <10000
union 
select rental_id   from rental where inventory_id >10000

使用union因為需要去重的緣故,導致兩個查詢結果進行拼接操作時用到了temporary即外部排序,該操作就會創建臨時表并且還會對臨時表作唯一性檢查,即distinct操作,這就使得這句sql代價非常高。

1 PRIMARY rental  range rental_date,idx_fk_inventory_id idx_fk_inventory_id 3  16215 100.0 Using where; Using index
2 UNION rental  range rental_date,idx_fk_inventory_id idx_fk_inventory_id 3  1 100.0 Using where; Using index
 UNION RESULT <union1,2>  ALL       Using temporary

所以如果我們有辦法或者說查詢結果絕對不重復,我們還是建議使用下面這段sql

explain select rental_id   from rental where inventory_id <10000
union all
select rental_id   from rental where inventory_id >10000

從執行計劃我們就可以看出,在拼接操作時,因為無需考慮重復就避免了創建臨時表和distinct去重的操作了。

id|select_type|table |partitions|type |possible_keys                  |key                |key_len|ref|rows |filtered|Extra                   |
--+-----------+------+----------+-----+-------------------------------+-------------------+-------+---+-----+--------+------------------------+
 1|PRIMARY    |rental|          |range|rental_date,idx_fk_inventory_id|idx_fk_inventory_id|3      |   |16215|   100.0|Using where; Using index|
 2|UNION      |rental|          |range|rental_date,idx_fk_inventory_id|idx_fk_inventory_id|3      |   |    1|   100.0|Using where; Using index|
責任編輯:趙寧寧 來源: 寫代碼的SharkChili
相關推薦

2018-11-28 14:30:09

MySQLL索引設計數據庫

2022-08-01 07:42:17

線程安全場景

2025-05-19 10:00:00

MySQL數據庫InnoDB

2021-05-05 11:32:36

MySQL數據庫索引

2010-08-17 14:56:00

HCNE認證

2011-04-15 12:25:21

BGP路由

2016-05-30 17:31:34

Spring框架

2020-10-22 12:30:33

MySQL

2020-06-19 16:25:19

MySQL日志文件數據庫

2019-10-24 09:09:28

MySQLACIDJava

2018-11-27 15:51:10

MySQL數據庫查詢優化

2025-05-07 08:55:00

2010-08-18 10:52:46

Linux筆試

2025-07-09 09:05:00

2020-10-07 15:15:41

Python

2010-09-02 10:11:11

華為認證

2010-07-27 15:49:28

Flex

2010-06-17 16:42:04

UML

2009-12-18 17:34:38

Ruby線程

2021-01-18 10:33:53

Java反射模塊
點贊
收藏

51CTO技術棧公眾號

大地资源网在线观看免费官网| 国产99久久精品一区二区| 亚洲午夜激情影院| 国内在线免费视频| 波多野结衣亚洲一区| 高清欧美性猛交xxxx| 日韩精品无码一区二区三区久久久| 国产综合色区在线观看| 综合精品久久久| 国产精品果冻传媒潘| 人人草在线观看| 午夜av一区| 亚洲黄色片网站| 亚洲免费av一区二区三区| 欧洲黄色一区| 久久久国产午夜精品| 97久草视频| 日本免费精品视频| 欧美日本一区二区高清播放视频| 日韩av在线直播| 亚洲第一色av| 成人日韩在线观看| 午夜精品久久久久久久久久久| 视频一区二区在线观看| 国产美女主播在线观看| 久久九九电影| 久久久久久久999精品视频| 五月天免费网站| 亚洲桃色综合影院| 欧美v国产在线一区二区三区| 99视频精品免费| 超碰高清在线| 亚洲一区二区三区视频在线| 影音先锋欧美在线| 精品电影在线| 99在线精品观看| av免费观看久久| 国产剧情久久久| 看国产成人h片视频| 青青青国产精品一区二区| 精品少妇theporn| 999国产精品视频| 有码中文亚洲精品| 一区二区三区四区免费| 亚洲素人在线| 亚洲欧美日韩成人| aaaaaav| 成人黄色av网址| 日韩欧美国产电影| 一级做a爱视频| 色婷婷成人网| 欧美日韩激情一区二区三区| 亚洲色图 在线视频| 国产精品久久久久av电视剧| 日本韩国欧美三级| 免费激情视频在线观看| 欧美电影免费观看| 日本电影亚洲天堂一区| 91看片就是不一样| 成人自拍av| 在线观看日产精品| 天天插天天操天天射| julia一区二区三区中文字幕| 色综合久久中文综合久久牛| 日日碰狠狠躁久久躁婷婷| 欧美日韩美女| 在线亚洲精品福利网址导航| 久久久精品麻豆| 国产综合色激情| 在线播放中文一区| 亚洲av无码久久精品色欲| 亚洲3区在线| 亚洲成人av在线播放| 国产女人18毛片水真多18| 久久97精品| 亚洲少妇激情视频| 精品女人久久久| 欧美黄免费看| 97超碰国产精品女人人人爽| 亚洲 欧美 中文字幕| 老色鬼精品视频在线观看播放| 国产精品一区二区电影| 国产特黄一级片| k8久久久一区二区三区| 视频二区一区| 欧洲性视频在线播放| 欧美视频第一页| 无限资源日本好片| silk一区二区三区精品视频| 亚洲视频欧洲视频| 在线看的片片片免费| 一区精品久久| 国产精品丝袜久久久久久不卡| 国产剧情久久久| 91麻豆免费观看| 制服国产精品| 国产精选在线| 欧美日本一区二区| 三级视频网站在线观看| 日韩在线观看| 国内外成人免费激情在线视频 | 精品女厕一区二区三区| 天天影视综合色| 成人搞黄视频| 色偷偷噜噜噜亚洲男人的天堂| 国产性70yerg老太| 喷水一区二区三区| 国产另类自拍| 日本在线观看免费| 福利视频导航一区| 国产老头和老头xxxx×| 精品国产一区二区三区四区| 欧美夫妻性视频| 亚洲熟妇无码久久精品| 97se亚洲国产综合在线| 樱空桃在线播放| 成人午夜精品| 亚洲精品国精品久久99热一| 东方av正在进入| 日本午夜一区二区| 九色91国产| 国产后进白嫩翘臀在线观看视频| 欧美午夜影院一区| 精品无码人妻一区| 伊人久久亚洲热| 亚洲最大福利视频网| 91精品大全| 色偷偷久久一区二区三区| 无码人妻一区二区三区一| 91综合久久| 国产精品久久一区| 蜜桃视频在线播放| 亚洲不卡av一区二区三区| 少妇愉情理伦片bd| 久久久久久久久久久妇女| 国产精品久久色| 国产区av在线| 91久久精品网| 一级片视频免费看| 久久久久久夜| 欧美韩国日本精品一区二区三区| www成人免费观看| 精品精品欲导航| 精品在线视频观看| 国产99久久久国产精品| 91免费国产精品| 一级毛片精品毛片| 欧美高清视频在线| 亚洲精品国产精品乱码不卡| 亚洲影院久久精品| 国产伦理在线观看| 欧美午夜久久| 国产精品一区视频| 色图在线观看| 欧美一级国产精品| 久久久国产成人| 成年人午夜久久久| 免费高清在线观看免费| 国产成人黄色| 国产免费久久av| 超碰在线观看免费版| 欧美一区二区视频在线观看2020 | 欧美影院精品一区| 男人的天堂av网| 久久精品国产99国产精品| 自拍偷拍99| 亚洲精品在线a| 久久男人资源视频| 亚洲av电影一区| 色激情天天射综合网| 日韩黄色中文字幕| 久久精品国产一区二区三区免费看 | 欧美成人自拍视频| 亚洲精品国产片| 欧美天天综合色影久久精品| 日韩一区二区a片免费观看| 美腿丝袜一区二区三区| 樱空桃在线播放| 日本精品影院| 国产精品自拍网| 日韩免费影院| 亚洲欧美色婷婷| 国产精品热久久| 污片在线观看一区二区| 国产亚洲精品熟女国产成人| 精品一二线国产| 五十路熟女丰满大屁股| 国产精品一区二区99| 成人a在线观看| 国产v日韩v欧美v| 一区二区三区亚洲| 99热这里只有精品5| 精品久久久视频| 亚洲天堂av中文字幕| 粉嫩av一区二区三区在线播放| 国产精品丝袜久久久久久消防器材| 精品视频国产| 鬼打鬼之黄金道士1992林正英| 成人av三级| 欧美成人精品影院| 蝌蚪视频在线播放| 精品少妇一区二区三区免费观看| 你懂的国产在线| 亚洲免费观看高清完整版在线观看| 日韩av手机在线播放| 久久66热re国产| 18岁网站在线观看| 91精品国产91久久综合| 欧美高清视频一区| 99久久婷婷国产综合精品青牛牛| 国产精品成久久久久三级| 久草成色在线| 久久精品视频网站| 国自产拍在线网站网址视频| 日韩色视频在线观看| 一级久久久久久| 午夜成人在线视频| 手机在线免费看毛片| 国产人成亚洲第一网站在线播放 | 久久色.com| 无码人妻久久一区二区三区蜜桃| 日本vs亚洲vs韩国一区三区| 男女激情无遮挡| 欧美日韩午夜| av动漫免费观看| 日韩欧美综合| 日韩福利在线| 网红女主播少妇精品视频| 丁香婷婷久久久综合精品国产| 四虎精品一区二区免费| 国产精品视频男人的天堂| 亚洲淫成人影院| 久久露脸国产精品| 美女精品导航| 久久成人人人人精品欧| 黄色网页网址在线免费| 中文字幕欧美日韩va免费视频| 青青操在线视频| 日韩不卡中文字幕| 五月天婷婷社区| 亚洲激情免费观看| 黄频网站在线观看| 精品电影一区二区三区| 亚洲福利在线观看视频| 欧美一区二区三区喷汁尤物| 99久久久国产精品无码免费| 6080国产精品一区二区| 91亚洲精品国偷拍自产在线观看| 欧日韩精品视频| 国产又粗又猛又爽又| 欧美偷拍一区二区| 中文字幕乱码视频| 欧美色爱综合网| 91九色蝌蚪91por成人| 欧美在线观看禁18| 91丨porny丨在线中文| 欧美老年两性高潮| 99热这里只有精品在线观看| 日韩色视频在线观看| 免费av网站在线播放| 日韩精品电影网| 激情小说 在线视频| 国产亚洲精品久久久久动| 国产一区二区三区福利| 中文字幕一区电影| 成人免费在线| 久久久久久久亚洲精品| 国产社区精品视频| 国产suv精品一区二区| 欧洲成人一区| 91久久精品久久国产性色也91| 麻豆一二三区精品蜜桃| 成人在线观看91| 久草成人资源| 一区二区三区四区五区视频 | 日韩精品xxxx| 日韩高清一区二区| 国产三级精品三级在线| 国产v日产∨综合v精品视频| theav精尽人亡av| 国产精品美女久久久久aⅴ | 色就色 综合激情| 97人妻一区二区精品免费视频 | 免费a在线观看| 久久精品人人爽| 欧美日韩国产观看视频| 国产精品久久久久久久久粉嫩av | tube8在线hd| 国产大片精品免费永久看nba| 精品国产黄a∨片高清在线| 99中文字幕| 精品国产乱码久久久久久1区2匹| 中文字幕日韩一区二区三区不卡| 在线不卡欧美| 鲁一鲁一鲁一鲁一av| 成人一道本在线| 1024在线看片| 欧美日韩国产综合新一区 | 精品成人在线观看| 国产小视频免费在线观看| 欧美精品成人在线| 91综合国产| 久久大片网站| 中文一区一区三区免费在线观看| 免费在线观看的av网站| 黄一区二区三区| 成人午夜剧场视频网站| 亚洲精品ww久久久久久p站| 免费视频网站在线观看入口| 精品久久久久久久久久久久久久久久久 | 激情四射综合网| 欧洲亚洲国产日韩| 天堂av中文字幕| 精品中文字幕乱| 精品69视频一区二区三区| 麻豆91蜜桃| 激情久久久久| 丰满人妻一区二区三区53视频| 国产喂奶挤奶一区二区三区| 亚洲国产精品成人无久久精品| 欧美麻豆精品久久久久久| 韩国福利在线| 青青精品视频播放| 日韩mv欧美mv国产网站| 久操手机在线视频| 国内精品写真在线观看| 一级特黄曰皮片视频| 欧美午夜精品久久久久久浪潮 | 亚洲人成网站色ww在线| 成人在线免费观看黄色| 亚洲一区二区三| 久久日文中文字幕乱码| 成人羞羞国产免费网站| 99国产麻豆精品| 日韩av无码中文字幕| 欧美成人精品福利| 超碰最新在线| 92国产精品久久久久首页| 99久久激情| 看看黄色一级片| 国产精品成人免费在线| 中文字幕av网站| 中文字幕综合在线| 蜜桃成人精品| 亚洲va韩国va欧美va精四季| 日韩专区在线视频| 久久久久无码精品国产sm果冻| 狠狠躁夜夜躁久久躁别揉| 神马电影在线观看| 欧美激情小视频| gogo久久日韩裸体艺术| 免费人成在线观看视频播放| 成人一区二区三区视频在线观看| 久久激情免费视频| 精品国产一区二区三区久久影院 | 国产成人强伦免费视频网站| 亚洲欧美在线aaa| japanese国产| 久久久久久久一区二区| 婷婷精品在线| caopor在线视频| 国产精品你懂的在线| 亚洲天堂2021av| 久久精品国产一区二区电影| 电影91久久久| 777av视频| 久久综合九色综合欧美亚洲| 99久久久久久久久| 最新中文字幕亚洲| 欧美成人精品一级| 国产日韩欧美精品在线观看| 久久影院视频免费| 伊人网中文字幕| 九色精品美女在线| 日韩电影不卡一区| 天天视频天天爽| 一区二区在线观看不卡| 神马午夜在线观看| 国产精品69久久| 亚洲第一天堂| 国产真实乱人偷精品| 欧美在线一区二区三区| 国产精品剧情| 农村寡妇一区二区三区| 奇米一区二区三区| 九九视频在线观看| 亚洲欧美国产日韩中文字幕| 亚洲图片小说区| 欧美精品久久久久久久免费| 欧美国产国产综合| 亚洲国产成人精品一区二区三区| 欧洲亚洲免费在线| 综合激情网站| 日本少妇高潮喷水xxxxxxx| 日韩精品中文字幕一区二区三区 | 欧美日韩亚洲精品一区二区三区| 97电影在线| 精品卡一卡二| 国产一区视频网站| 日韩手机在线视频|