精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

亚洲免费影视| 啪啪激情综合网| 一区二区三区免费| 国产精品一区二区三区不卡| 国语对白永久免费| 成人嘿咻视频免费看| 欧美一卡2卡3卡4卡| 极品美女扒开粉嫩小泬| 91精品国产91久久久久游泳池| 国产一区91精品张津瑜| 91精品国产乱码久久久久久久久| 蜜桃传媒一区二区亚洲| 伊人久久大香线蕉av超碰| 欧美日韩激情视频8区| 伊人婷婷久久| 日韩二区三区| 国产乱人伦精品一区二区在线观看 | 免费日韩视频在线观看| 男人天堂久久久| 91在线播放网址| 91视频国产高清| 精品黑人一区二区三区| 亚洲乱码精品| 亚洲视频自拍偷拍| 国产人妻黑人一区二区三区| 伊人亚洲精品| 在线观看亚洲a| 午夜免费福利小电影| 韩国中文字幕在线| 欧美国产在线观看| 免费影院在线观看一区 | 日韩成人xxxx| 国产又粗又猛又爽又黄| 久久夜夜久久| 在线观看一区日韩| 久久久久人妻精品一区三寸| 久草在线视频资源| 一区二区三区影院| 正在播放国产精品| 欧美日韩xx| 中文字幕乱码久久午夜不卡| 久久久久久久久久久久久久一区| 性一交一乱一透一a级| 韩国三级电影一区二区| 国产一区玩具在线观看| 国产精品xxxxxx| 日韩中文字幕一区二区三区| 欧美一区二区三区四区在线| 国产香蕉在线视频| 欧美全黄视频| 欧美另类极品videosbest最新版本| 日本女人性生活视频| 欧美大人香蕉在线| 日韩视频第一页| 日韩在线一卡二卡| 国产精品不卡| 久久久91精品国产| 欧美成人aaa片一区国产精品| 图片区亚洲欧美小说区| 久久综合九色九九| 成人免费精品动漫网站| 欧美激情视频一区二区三区在线播放| 色婷婷av一区二区三区在线观看| 中文字幕无码日韩专区免费| 亚洲成人tv| 久久躁日日躁aaaaxxxx| 手机在线免费看片| 亚洲香蕉网站| 欧美亚洲国产日韩2020| 欧产日产国产69| 丝袜诱惑亚洲看片| 国产女同一区二区| 国产特级黄色片| 成人性色生活片| 精品国产免费久久久久久尖叫| 天堂中文资源在线观看| 久久一夜天堂av一区二区三区| 欧美日韩在线观看一区| 1pondo在线播放免费| 1024成人网| 男人添女荫道口女人有什么感觉| av2020不卡| 色婷婷精品大视频在线蜜桃视频 | 国产一区二区三区美女| 99热在线播放| 欧美18xxxxx| 国产精品久久久久婷婷| 大地资源网在线观看免费官网 | 国产精品福利观看| 一区二区三区播放| 成人app下载| 天天综合色天天综合色hd| 黄色成年人视频在线观看| 亚洲国产精品久久人人爱蜜臀| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 成人午夜亚洲| 精品国产乱子伦一区| 男人操女人动态图| 亚洲精品一二三区区别| 777777777亚洲妇女| 在线免费观看av片| 成人免费毛片片v| 亚洲成人自拍视频| 国产探花视频在线观看| 欧美性欧美巨大黑白大战| 色欲欲www成人网站| 亚洲人成网站77777在线观看| 久久天天躁狠狠躁夜夜av| 日本黄色片视频| 国模一区二区三区白浆| 欧美精彩一区二区三区| 午夜成年人在线免费视频| 日韩欧美成人区| 亚洲av综合色区无码另类小说| 欧洲杯半决赛直播| 性色av一区二区咪爱| 国产又粗又猛又黄| 91性感美女视频| 国产激情在线看| 久久人体av| 亚洲免费一在线| 久久久久亚洲av片无码下载蜜桃| 蜜臀91精品一区二区三区| 久久爱av电影| 国产在线xxx| 欧美一区二区免费视频| 国产精品久久久久久成人| 国产欧美日韩一级| 国产精品污www一区二区三区| 精品孕妇一区二区三区| 欧美午夜理伦三级在线观看| 日本免费福利视频| 在线欧美一区| 97免费资源站| 成人在线观看免费网站| 精品视频一区 二区 三区| 中文字幕av网址| 亚洲国产一区二区三区高清| 5g影院天天爽成人免费下载| 欧美尤物美女在线| 欧美日韩性生活| 欧美成人另类视频| 日本午夜精品视频在线观看| 免费看成人午夜电影| 欧美aa在线观看| 日韩精品极品视频免费观看| 国产乱码久久久久久| 高清不卡一二三区| 国产欧美精品aaaaaa片| 视频在线亚洲| 色综合久久久久久中文网| 国产男男gay体育生白袜| 国产精品福利电影一区二区三区四区| 毛片毛片毛片毛片毛片毛片毛片毛片毛片| 亚洲免费毛片| 国产成人欧美在线观看| 九色在线免费| 在线视频一区二区免费| 欧美日韩国产黄色| 久久成人久久鬼色| 日本成人在线不卡| 这里视频有精品| 国外视频精品毛片| 无码精品在线观看| 91久久久免费一区二区| 人妻无码一区二区三区免费| 久久福利视频一区二区| www.亚洲一区二区| 风间由美性色一区二区三区四区| 久久久爽爽爽美女图片| 深夜福利在线看| 欧美亚洲一区二区在线| 国精品人伦一区二区三区蜜桃| 国产综合色视频| 97免费视频观看| 亚洲瘦老头同性70tv| 国产精品第七十二页| 天天在线视频色| 91精品国产高清一区二区三区 | 99成人免费视频| 欧美日韩电影一区二区| 免费高清视频在线一区| 久久精品国产2020观看福利| 朝桐光av在线一区二区三区| 精品国产成人在线| 亚洲一区 欧美| 国产精品一二三四五| 青青艹视频在线| 日韩国产一区| 高清av免费一区中文字幕| 中文字幕在线中文字幕在线中三区| 国产一区二区三区毛片| 99久久精品无免国产免费| 欧美日韩另类字幕中文| 少妇视频一区二区| 91麻豆免费看片| 无套内谢丰满少妇中文字幕| 免费亚洲婷婷| 国产日韩第一页| 亚洲免费成人av在线| 91精品天堂| 亚洲成人av观看| 国内精品在线一区| 日本三级视频在线观看| 亚洲激情国产精品| 国产精品毛片一区二区在线看舒淇 | 亚洲春色在线视频| 欧美顶级毛片在线播放| 91夜夜揉人人捏人人添红杏| 综合另类专区| 色综合男人天堂| 一级毛片视频在线观看| 日韩精品一区二区三区第95| 国产精品爽爽久久| 91福利小视频| 91国产丝袜播放在线| 亚洲色图视频网站| 免费一级特黄3大片视频| 91在线一区二区三区| 国产麻豆剧传媒精品国产| 蓝色福利精品导航| 成人性做爰aaa片免费看不忠| 合欧美一区二区三区| 一区二区视频在线免费| 国产永久精品大片wwwapp| 国产伦精品一区二区三区在线| a一区二区三区亚洲| 国产日韩欧美中文| 亚洲一区二区三区四区| 日本久久久久久久| 深夜成人在线| 欧美精品video| av片在线观看网站| 久久在精品线影院精品国产| 欧美a在线看| 在线看日韩欧美| 黄色视屏网站在线免费观看| 日韩av在线网页| 日韩在线视频免费| 精品国精品国产尤物美女| 国产av一区二区三区精品| 制服丝袜中文字幕亚洲| 国产男男gay体育生网站| 欧美精品1区2区| 国产精品人妻一区二区三区| 777奇米成人网| 91国在线视频| 7777精品伊人久久久大香线蕉经典版下载| 日韩国产成人在线| 欧美午夜电影在线播放| 亚洲图片在线播放| 欧美日韩国产影片| 国产又大又长又粗| 欧美一区二区性放荡片| 成 人 黄 色 片 在线播放| 精品少妇一区二区三区视频免付费| 国产成人精品毛片| 日韩精品在线一区二区| 亚洲精品网站在线| 亚洲电影天堂av| 青青草视频免费在线观看| 日韩精品一二三四区| 免费看男男www网站入口在线| 亚洲一区www| av一区在线观看| 久久久精品美女| 波多野结衣乳巨码无在线观看| 8x海外华人永久免费日韩内陆视频| 中文字幕乱码中文乱码51精品| 日韩免费观看网站| 伊人久久一区| 国产欧美日本在线| 偷拍自拍一区| 亚洲精品免费在线看| 888久久久| 男人日女人bb视频| 奇米影视一区二区三区| 午夜诱惑痒痒网| 91在线视频免费91| 日本污视频网站| 一区二区三区欧美激情| 亚洲天堂一区在线观看| 欧美日韩视频在线观看一区二区三区| 国产福利免费视频| 亚洲老头老太hd| 九色porny在线| 欧美影院在线播放| 欧美一级在线| 精品国产乱码久久久久久丨区2区| 国产一区不卡| 欧妇女乱妇女乱视频| 水蜜桃久久夜色精品一区的特点| 一级淫片在线观看| 99久久婷婷国产| 成人在线观看小视频| 亚洲成人av一区| 一区二区日韩视频| 精品视频中文字幕| 18av在线播放| 日韩美女中文字幕| 综合中文字幕| 亚洲精品国产一区| 在线亚洲国产精品网站| 国产亚洲成av人片在线观看桃| 久久99精品久久久久久久青青日本 | 2024最新电影在线免费观看| 热久久这里只有| 成人h动漫精品一区二区器材| 先锋影音亚洲资源| 国产欧美欧美| 在线观看一区二区三区视频| 国产女主播一区| 日韩 欧美 中文| 日韩免费看网站| 日本在线观看免费| 国产成人啪精品视频免费网| 亚洲高清999| 国产精品99久久久久久大便| 久久婷婷激情| 日本一级片在线播放| 一区二区三区中文免费| 一区二区美女视频| 中文在线资源观看视频网站免费不卡| 美女在线视频免费| 成人在线看片| 亚洲精品久久| 污网站在线免费| 久久久精品国产免费观看同学| 久久高清免费视频| 日韩精品一区二| 在线观看午夜av| 成人黄色网免费| 91一区二区三区四区| 亚洲 欧美 日韩系列| 久久久久国产精品厨房| 天堂在线免费观看视频| 日韩黄色高清视频| 成人免费观看在线观看| 国产精品日韩一区二区 | 国产精品不卡在线观看| 久久这里只有精品9| 亚洲视频第一页| 欧美日韩123区| 日本午夜精品一区二区三区| 美女视频一区免费观看| mm131丰满少妇人体欣赏图| 欧美性色视频在线| 欧美高清成人| 国产精品日日摸夜夜添夜夜av| 欧美系列电影免费观看 | 久久久久久91亚洲精品中文字幕| 亚洲国产精品电影| 久热在线观看视频| 免费国产一区二区| 日本欧美韩国一区三区| 91禁男男在线观看| 欧美一区二区三区四区久久| av毛片在线免费| 粉嫩av四季av绯色av第一区| 中文一区二区| 国产三级av在线播放| 欧美视频一二三区| 黄色成年人视频在线观看| 成人动漫在线视频| 亚洲一级在线| 九九热免费在线| 3d动漫精品啪啪一区二区竹菊| 久久国产精品黑丝| 美女三级99| 美日韩一级片在线观看| 麻豆疯狂做受xxxx高潮视频| 亚洲国产成人91精品| 91精品影视| 色撸撸在线观看| 99精品热视频| 波多野结衣一区二区在线| 久久精品最新地址| 激情av综合| 成人亚洲精品777777大片| 一区二区三区欧美日韩| 美女欧美视频在线观看免费 | 国产精品乱码久久久久久| 国产手机av在线| 97视频免费观看| 久久精品国产99久久| 欧美一区二区三区影院| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 国产精品国产精品88| 亚洲国产精品电影| 五月天色综合| 极品美女扒开粉嫩小泬| 亚洲欧洲日产国产综合网| 韩国av永久免费| 国产精品三级美女白浆呻吟| 欧美三级特黄| 性欧美一区二区| 精品国产不卡一区二区三区| 国产成人免费9x9x人网站视频| 800av在线免费观看| 国产精品美女久久久久aⅴ|