日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

学习 MySQL 高性能优化原理,这一篇就够了!

發(fā)布時間:2023/12/10 数据库 63 豆豆
生活随笔 收集整理的這篇文章主要介紹了 学习 MySQL 高性能优化原理,这一篇就够了! 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

來自:CHEN川?| 責(zé)編:樂樂

鏈接:dwz.cn/VKMCdWla

說起 MySQL 的查詢優(yōu)化,相信大家收藏了一堆奇技淫巧:不能使用 SELECT *、不使用 NULL 字段、合理創(chuàng)建索引、為字段選擇合適的數(shù)據(jù)類型….. 你是否真的理解這些優(yōu)化技巧?是否理解其背后的工作原理?在實際場景下性能真有提升嗎?

我想未必。因而理解這些優(yōu)化建議背后的原理就尤為重要,希望本文能讓你重新審視這些優(yōu)化建議,并在實際業(yè)務(wù)場景下合理的運用。

MySQL 邏輯架構(gòu)

如果能在頭腦中構(gòu)建一幅 MySQL 各組件之間如何協(xié)同工作的架構(gòu)圖,有助于深入理解 MySQL 服務(wù)器。下圖展示了 MySQL 的邏輯架構(gòu)圖。

MySQL 邏輯架構(gòu)整體分為三層,最上層為客戶端層,并非 MySQL 所獨有,諸如:連接處理、授權(quán)認證、安全等功能均在這一層處理。

MySQL 大多數(shù)核心服務(wù)均在中間這一層,包括查詢解析、分析、優(yōu)化、緩存、內(nèi)置函數(shù) (比如:時間、數(shù)學(xué)、加密等函數(shù))。所有的跨存儲引擎的功能也在這一層實現(xiàn):存儲過程、觸發(fā)器、視圖等。

最下層為存儲引擎,其負責(zé) MySQL 中的數(shù)據(jù)存儲和提取。和 Linux 下的文件系統(tǒng)類似,每種存儲引擎都有其優(yōu)勢和劣勢。中間的服務(wù)層通過 API 與存儲引擎通信,這些 API 接口屏蔽了不同存儲引擎間的差異。

MySQL 查詢過程

我們總是希望 MySQL 能夠獲得更高的查詢性能,最好的辦法是弄清楚 MySQL 是如何優(yōu)化和執(zhí)行查詢的。

一旦理解了這一點,就會發(fā)現(xiàn):很多的查詢優(yōu)化工作實際上就是遵循一些原則讓 MySQL 的優(yōu)化器能夠按照預(yù)想的合理方式運行而已。當(dāng)向 MySQL 發(fā)送一個請求的時候,MySQL 到底做了些什么呢?

MySQL 查詢過程

1. 客戶端 / 服務(wù)端通信協(xié)議

MySQL 客戶端 / 服務(wù)端通信協(xié)議是 “半雙工” 的:在任一時刻,要么是服務(wù)器向客戶端發(fā)送數(shù)據(jù),要么是客戶端向服務(wù)器發(fā)送數(shù)據(jù),這兩個動作不能同時發(fā)生。

一旦一端開始發(fā)送消息,另一端要接收完整個消息才能響應(yīng)它,所以我們無法也無須將一個消息切成小塊獨立發(fā)送,也沒有辦法進行流量控制。

客戶端用一個單獨的數(shù)據(jù)包將查詢請求發(fā)送給服務(wù)器,所以當(dāng)查詢語句很長的時候,需要設(shè)置 max_allowed_packet 參數(shù)。但是需要注意的是,如果查詢實在是太大,服務(wù)端會拒絕接收更多數(shù)據(jù)并拋出異常。

與之相反的是,服務(wù)器響應(yīng)給用戶的數(shù)據(jù)通常會很多,由多個數(shù)據(jù)包組成。但是當(dāng)服務(wù)器響應(yīng)客戶端請求時,客戶端必須完整的接收整個返回結(jié)果,而不能簡單的只取前面幾條結(jié)果,然后讓服務(wù)器停止發(fā)送。

因而在實際開發(fā)中,盡量保持查詢簡單且只返回必需的數(shù)據(jù),減小通信間數(shù)據(jù)包的大小和數(shù)量是一個非常好的習(xí)慣,這也是查詢中盡量避免使用 SELECT * 以及加上 LIMIT 限制的原因之一。

2. 查詢緩存

在解析一個查詢語句前,如果查詢緩存是打開的,那么 MySQL 會檢查這個查詢語句是否命中查詢緩存中的數(shù)據(jù)。如果當(dāng)前查詢恰好命中查詢緩存,在檢查一次用戶權(quán)限后直接返回緩存中的結(jié)果。這種情況下,查詢不會被解析,也不會生成執(zhí)行計劃,更不會執(zhí)行。

MySQL 將緩存存放在一個引用表(不要理解成 table,可以認為是類似于 HashMap 的數(shù)據(jù)結(jié)構(gòu)),通過一個哈希值索引,這個哈希值通過查詢本身、當(dāng)前要查詢的數(shù)據(jù)庫、客戶端協(xié)議版本號等一些可能影響結(jié)果的信息計算得來。所以兩個查詢在任何字符上的不同(例如:空格、注釋),都會導(dǎo)致緩存不會命中。

如果查詢中包含任何用戶自定義函數(shù)、存儲函數(shù)、用戶變量、臨時表、MySQL 庫中的系統(tǒng)表,其查詢結(jié)果都不會被緩存。

比如函數(shù) NOW() 或者 CURRENT_DATE() 會因為不同的查詢時間,返回不同的查詢結(jié)果,再比如包含 CURRENT_USER 或者 CONNECION_ID() 的查詢語句會因為不同的用戶而返回不同的結(jié)果,將這樣的查詢結(jié)果緩存起來沒有任何的意義。

既然是緩存,就會失效,那查詢緩存何時失效呢?

MySQL 的查詢緩存系統(tǒng)會跟蹤查詢中涉及的每個表,如果這些表(數(shù)據(jù)或結(jié)構(gòu))發(fā)生變化,那么和這張表相關(guān)的所有緩存數(shù)據(jù)都將失效。正因為如此,在任何的寫操作時,MySQL 必須將對應(yīng)表的所有緩存都設(shè)置為失效。

如果查詢緩存非常大或者碎片很多,這個操作就可能帶來很大的系統(tǒng)消耗,甚至導(dǎo)致系統(tǒng)僵死一會兒。而且查詢緩存對系統(tǒng)的額外消耗也不僅僅在寫操作,讀操作也不例外:

1、任何的查詢語句在開始之前都必須經(jīng)過檢查,即使這條 SQL 語句永遠不會命中緩存

2、如果查詢結(jié)果可以被緩存,那么執(zhí)行完成后,會將結(jié)果存入緩存,也會帶來額外的系統(tǒng)消耗

基于此,我們要知道并不是什么情況下查詢緩存都會提高系統(tǒng)性能,緩存和失效都會帶來額外消耗,只有當(dāng)緩存帶來的資源節(jié)約大于其本身消耗的資源時,才會給系統(tǒng)帶來性能提升。

但要如何評估打開緩存是否能夠帶來性能提升是一件非常困難的事情,也不在本文討論的范疇內(nèi)。如果系統(tǒng)確實存在一些性能問題,可以嘗試打開查詢緩存,并在數(shù)據(jù)庫設(shè)計上做一些優(yōu)化,比如:

1、用多個小表代替一個大表,注意不要過度設(shè)計

2、批量插入代替循環(huán)單條插入

3、合理控制緩存空間大小,一般來說其大小設(shè)置為幾十兆比較合適

4、可以通過 SQL_CACHE 和 SQL_NO_CACHE 來控制某個查詢語句是否需要進行緩存

最后的忠告是不要輕易打開查詢緩存,特別是寫密集型應(yīng)用。如果你實在是忍不住,可以將 query_cache_type 設(shè)置為 DEMAND,這時只有加入 SQL_CACHE 的查詢才會走緩存,其他查詢則不會,這樣可以非常自由地控制哪些查詢需要被緩存。

當(dāng)然查詢緩存系統(tǒng)本身是非常復(fù)雜的,這里討論的也只是很小的一部分,其他更深入的話題,比如:緩存是如何使用內(nèi)存的?如何控制內(nèi)存的碎片化?事務(wù)對查詢緩存有何影響等等,讀者可以自行閱讀相關(guān)資料,這里權(quán)當(dāng)拋磚引玉吧。

3. 語法解析和預(yù)處理

MySQL 通過關(guān)鍵字將 SQL 語句進行解析,并生成一棵對應(yīng)的解析樹。這個過程解析器主要通過語法規(guī)則來驗證和解析。比如 SQL 中是否使用了錯誤的關(guān)鍵字或者關(guān)鍵字的順序是否正確等等。預(yù)處理則會根據(jù) MySQL 規(guī)則進一步檢查解析樹是否合法。比如檢查要查詢的數(shù)據(jù)表和數(shù)據(jù)列是否存在等。

4. 查詢優(yōu)化

經(jīng)過前面的步驟生成的語法樹被認為是合法的了,并且由優(yōu)化器將其轉(zhuǎn)化成查詢計劃。多數(shù)情況下,一條查詢可以有很多種執(zhí)行方式,最后都返回相應(yīng)的結(jié)果。優(yōu)化器的作用就是找到這其中最好的執(zhí)行計劃。

MySQL 使用基于成本的優(yōu)化器,它嘗試預(yù)測一個查詢使用某種執(zhí)行計劃時的成本,并選擇其中成本最小的一個。在 MySQL 可以通過查詢當(dāng)前會話的 last_query_cost 的值來得到其計算當(dāng)前查詢的成本。

mysql>?select * from t_message?limit?10;...省略結(jié)果集mysql>?show status like?'last_query_cost';+-----------------+-------------+| Variable_name ? | Value ? ? ? |+-----------------+-------------+| Last_query_cost | 6391.799000 |+-----------------+-------------+

示例中的結(jié)果表示優(yōu)化器認為大概需要做 6391 個數(shù)據(jù)頁的隨機查找才能完成上面的查詢。這個結(jié)果是根據(jù)一些列的統(tǒng)計信息計算得來的,這些統(tǒng)計信息包括:每張表或者索引的頁面?zhèn)€數(shù)、索引的基數(shù)、索引和數(shù)據(jù)行的長度、索引的分布情況等等。

有非常多的原因會導(dǎo)致 MySQL 選擇錯誤的執(zhí)行計劃,比如統(tǒng)計信息不準確、不會考慮不受其控制的操作成本(用戶自定義函數(shù)、存儲過程)、MySQL 認為的最優(yōu)跟我們想的不一樣(我們希望執(zhí)行時間盡可能短,但 MySQL 值選擇它認為成本小的,但成本小并不意味著執(zhí)行時間短)等等。

MySQL 的查詢優(yōu)化器是一個非常復(fù)雜的部件,它使用了非常多的優(yōu)化策略來生成一個最優(yōu)的執(zhí)行計劃:

1、重新定義表的關(guān)聯(lián)順序(多張表關(guān)聯(lián)查詢時,并不一定按照 SQL 中指定的順序進行,但有一些技巧可以指定關(guān)聯(lián)順序)

2、優(yōu)化 MIN() 和 MAX() 函數(shù)(找某列的最小值,如果該列有索引,只需要查找 B+Tree 索引最左端,反之則可以找到最大值,具體原理見下文)

3、提前終止查詢(比如:使用 Limit 時,查找到滿足數(shù)量的結(jié)果集后會立即終止查詢)

4、優(yōu)化排序(在老版本 MySQL 會使用兩次傳輸排序,即先讀取行指針和需要排序的字段在內(nèi)存中對其排序,然后再根據(jù)排序結(jié)果去讀取數(shù)據(jù)行,而新版本采用的是單次傳輸排序,也就是一次讀取所有的數(shù)據(jù)行,然后根據(jù)給定的列排序。對于 I/O 密集型應(yīng)用,效率會高很多)

隨著 MySQL 的不斷發(fā)展,優(yōu)化器使用的優(yōu)化策略也在不斷的進化,這里僅僅介紹幾個非常常用且容易理解的優(yōu)化策略,其他的優(yōu)化策略,大家自行查閱吧。

5. 查詢執(zhí)行引擎

在完成解析和優(yōu)化階段以后,MySQL 會生成對應(yīng)的執(zhí)行計劃,查詢執(zhí)行引擎根據(jù)執(zhí)行計劃給出的指令逐步執(zhí)行得出結(jié)果。整個執(zhí)行過程的大部分操作均是通過調(diào)用存儲引擎實現(xiàn)的接口來完成,這些接口被稱為 handler API。

查詢過程中的每一張表由一個 handler 實例表示。實際上,MySQL 在查詢優(yōu)化階段就為每一張表創(chuàng)建了一個 handler 實例,優(yōu)化器可以根據(jù)這些實例的接口來獲取表的相關(guān)信息,包括表的所有列名、索引統(tǒng)計信息等。存儲引擎接口提供了非常豐富的功能,但其底層僅有幾十個接口,這些接口像搭積木一樣完成了一次查詢的大部分操作。

6. 返回結(jié)果給客戶端

查詢執(zhí)行的最后一個階段就是將結(jié)果返回給客戶端。即使查詢不到數(shù)據(jù),MySQL 仍然會返回這個查詢的相關(guān)信息,比如該查詢影響到的行數(shù)以及執(zhí)行時間等。

如果查詢緩存被打開且這個查詢可以被緩存,MySQL 也會將結(jié)果存放到緩存中。

結(jié)果集返回客戶端是一個增量且逐步返回的過程。有可能 MySQL 在生成第一條結(jié)果時,就開始向客戶端逐步返回結(jié)果集了。這樣服務(wù)端就無須存儲太多結(jié)果而消耗過多內(nèi)存,也可以讓客戶端第一時間獲得返回結(jié)果。

需要注意的是,結(jié)果集中的每一行都會以一個滿足①中所描述的通信協(xié)議的數(shù)據(jù)包發(fā)送,再通過 TCP 協(xié)議進行傳輸,在傳輸過程中,可能對 MySQL 的數(shù)據(jù)包進行緩存然后批量發(fā)送。

回頭總結(jié)一下 MySQL 整個查詢執(zhí)行過程,總的來說分為以下個步驟:

1、客戶端向 MySQL 服務(wù)器發(fā)送一條查詢請求

2、服務(wù)器首先檢查查詢緩存,如果命中緩存,則立刻返回存儲在緩存中的結(jié)果。否則進入下一階段

3、服務(wù)器進行 SQL 解析、預(yù)處理、再由優(yōu)化器生成對應(yīng)的執(zhí)行計劃

4、MySQL 根據(jù)執(zhí)行計劃,調(diào)用存儲引擎的 API 來執(zhí)行查詢

5、將結(jié)果返回給客戶端,同時緩存查詢結(jié)果

性能優(yōu)化建議

看了這么多,你可能會期待給出一些優(yōu)化手段,是的,下面會從 3 個不同方面給出一些優(yōu)化建議。但請等等,還有一句忠告要先送給你:不要聽信你看到的關(guān)于優(yōu)化的 “絕對真理”,包括本文所討論的內(nèi)容,而應(yīng)該是在實際的業(yè)務(wù)場景下通過測試來驗證你關(guān)于執(zhí)行計劃以及響應(yīng)時間的假設(shè)。

1. Scheme 設(shè)計與數(shù)據(jù)類型優(yōu)化

選擇數(shù)據(jù)類型只要遵循小而簡單的原則就好,越小的數(shù)據(jù)類型通常會更快,占用更少的磁盤、內(nèi)存,處理時需要的 CPU 周期也更少。越簡單的數(shù)據(jù)類型在計算時需要更少的 CPU 周期,比如,整型就比字符操作代價低,因而會使用整型來存儲 ip 地址,使用 DATETIME 來存儲時間,而不是使用字符串。

這里總結(jié)幾個可能容易理解錯誤的技巧:

1、通常來說把可為 NULL 的列改為 NOT NULL 不會對性能提升有多少幫助,只是如果計劃在列上創(chuàng)建索引,就應(yīng)該將該列設(shè)置為 NOT NULL。

2、對整數(shù)類型指定寬度,比如 INT(11),沒有任何卵用。INT 使用 32 位(4 個字節(jié))存儲空間,那么它的表示范圍已經(jīng)確定,所以 INT(1) 和 INT(20) 對于存儲和計算是相同的。

3、UNSIGNED 表示不允許負值,大致可以使正數(shù)的上限提高一倍。比如 TINYINT 存儲范圍是 - 128 ~ 127,而 UNSIGNED TINYINT 存儲的范圍卻是 0 – 255。

4、通常來講,沒有太大的必要使用 DECIMAL 數(shù)據(jù)類型。即使是在需要存儲財務(wù)數(shù)據(jù)時,仍然可以使用 BIGINT。比如需要精確到萬分之一,那么可以將數(shù)據(jù)乘以一百萬然后使用 BIGINT 存儲。這樣可以避免浮點數(shù)計算不準確和 DECIMAL 精確計算代價高的問題。

5、TIMESTAMP 使用 4 個字節(jié)存儲空間,DATETIME 使用 8 個字節(jié)存儲空間。因而,TIMESTAMP 只能表示 1970 – 2038 年,比 DATETIME 表示的范圍小得多,而且 TIMESTAMP 的值因時區(qū)不同而不同。

6、大多數(shù)情況下沒有使用枚舉類型的必要,其中一個缺點是枚舉的字符串列表是固定的,添加和刪除字符串(枚舉選項)必須使用 ALTER TABLE(如果只是在列表末尾追加元素,不需要重建表)。

7、schema 的列不要太多。原因是存儲引擎的 API 工作時需要在服務(wù)器層和存儲引擎層之間通過行緩沖格式拷貝數(shù)據(jù),然后在服務(wù)器層將緩沖內(nèi)容解碼成各個列,這個轉(zhuǎn)換過程的代價是非常高的。如果列太多而實際使用的列又很少的話,有可能會導(dǎo)致 CPU 占用過高。

8、大表 ALTER TABLE 非常耗時,MySQL 執(zhí)行大部分修改表結(jié)果操作的方法是用新的結(jié)構(gòu)創(chuàng)建一個張空表,從舊表中查出所有的數(shù)據(jù)插入新表,然后再刪除舊表。尤其當(dāng)內(nèi)存不足而表又很大,而且還有很大索引的情況下,耗時更久。當(dāng)然有一些奇技淫巧可以解決這個問題,有興趣可自行查閱。

2. 創(chuàng)建高性能索引

索引是提高 MySQL 查詢性能的一個重要途徑,但過多的索引可能會導(dǎo)致過高的磁盤使用率以及過高的內(nèi)存占用,從而影響應(yīng)用程序的整體性能。

應(yīng)當(dāng)盡量避免事后才想起添加索引,因為事后可能需要監(jiān)控大量的 SQL 才能定位到問題所在,而且添加索引的時間肯定是遠大于初始添加索引所需要的時間,可見索引的添加也是非常有技術(shù)含量的。

接下來將向你展示一系列創(chuàng)建高性能索引的策略,以及每條策略其背后的工作原理。但在此之前,先了解與索引相關(guān)的一些算法和數(shù)據(jù)結(jié)構(gòu),將有助于更好的理解后文的內(nèi)容。

3. 索引相關(guān)的數(shù)據(jù)結(jié)構(gòu)和算法

通常我們所說的索引是指 B-Tree 索引,它是目前關(guān)系型數(shù)據(jù)庫中查找數(shù)據(jù)最為常用和有效的索引,大多數(shù)存儲引擎都支持這種索引。使用 B-Tree 這個術(shù)語,是因為 MySQL 在 CREATE TABLE 或其它語句中使用了這個關(guān)鍵字,但實際上不同的存儲引擎可能使用不同的數(shù)據(jù)結(jié)構(gòu),比如 InnoDB 就是使用的 B+Tree。

B+Tree 中的 B 是指 balance,意為平衡。需要注意的是,B + 樹索引并不能找到一個給定鍵值的具體行,它找到的只是被查找數(shù)據(jù)行所在的頁,接著數(shù)據(jù)庫會把頁讀入到內(nèi)存,再在內(nèi)存中進行查找,最后得到要查找的數(shù)據(jù)。

在介紹 B+Tree 前,先了解一下二叉查找樹,它是一種經(jīng)典的數(shù)據(jù)結(jié)構(gòu),其左子樹的值總是小于根的值,右子樹的值總是大于根的值,如下圖①。如果要在這課樹中查找值為 5 的記錄,其大致流程:先找到根,其值為 6,大于 5,所以查找左子樹,找到 3,而 5 大于 3,接著找 3 的右子樹,總共找了 3 次。同樣的方法,如果查找值為 8 的記錄,也需要查找 3 次。

所以二叉查找樹的平均查找次數(shù)為 (3 + 3 + 3 + 2 + 2 + 1) / 6 = 2.3 次,而順序查找的話,查找值為 2 的記錄,僅需要 1 次,但查找值為 8 的記錄則需要 6 次,所以順序查找的平均查找次數(shù)為:(1 + 2 + 3 + 4 + 5 + 6) / 6 = 3.3 次,因此大多數(shù)情況下二叉查找樹的平均查找速度比順序查找要快。

二叉查找樹和平衡二叉樹

由于二叉查找樹可以任意構(gòu)造,同樣的值,可以構(gòu)造出如圖②的二叉查找樹,顯然這棵二叉樹的查詢效率和順序查找差不多。若想二叉查找數(shù)的查詢性能最高,需要這棵二叉查找樹是平衡的,也即平衡二叉樹(AVL 樹)。

平衡二叉樹首先需要符合二叉查找樹的定義,其次必須滿足任何節(jié)點的兩個子樹的高度差不能大于 1。顯然圖②不滿足平衡二叉樹的定義,而圖①是一課平衡二叉樹。

平衡二叉樹的查找性能是比較高的(性能最好的是最優(yōu)二叉樹),查詢性能越好,維護的成本就越大。比如圖①的平衡二叉樹,當(dāng)用戶需要插入一個新的值 9 的節(jié)點時,就需要做出如下變動。

平衡二叉樹旋轉(zhuǎn)

通過一次左旋操作就將插入后的樹重新變?yōu)槠胶舛鏄涫亲詈唵蔚那闆r了,實際應(yīng)用場景中可能需要旋轉(zhuǎn)多次。至此我們可以考慮一個問題,平衡二叉樹的查找效率還不錯,實現(xiàn)也非常簡單,相應(yīng)的維護成本還能接受,為什么 MySQL 索引不直接使用平衡二叉樹?

隨著數(shù)據(jù)庫中數(shù)據(jù)的增加,索引本身大小隨之增加,不可能全部存儲在內(nèi)存中,因此索引往往以索引文件的形式存儲的磁盤上。這樣的話,索引查找過程中就要產(chǎn)生磁盤 I/O 消耗,相對于內(nèi)存存取,I/O 存取的消耗要高幾個數(shù)量級。

可以想象一下一棵幾百萬節(jié)點的二叉樹的深度是多少?如果將這么大深度的一顆二叉樹放磁盤上,每讀取一個節(jié)點,需要一次磁盤的 I/O 讀取,整個查找的耗時顯然是不能夠接受的。那么如何減少查找過程中的 I/O 存取次數(shù)?

一種行之有效的解決方法是減少樹的深度,將二叉樹變?yōu)?m 叉樹(多路搜索樹),而 B+Tree 就是一種多路搜索樹。理解 B+Tree 時,只需要理解其最重要的兩個特征即可:

第一,所有的關(guān)鍵字(可以理解為數(shù)據(jù))都存儲在葉子節(jié)點(Leaf Page),非葉子節(jié)點(Index Page)并不存儲真正的數(shù)據(jù),所有記錄節(jié)點都是按鍵值大小順序存放在同一層葉子節(jié)點上。其次,所有的葉子節(jié)點由指針連接。如下圖為高度為 2 的簡化了的 B+Tree。

簡化 B+Tree

怎么理解這兩個特征?MySQL 將每個節(jié)點的大小設(shè)置為一個頁的整數(shù)倍(原因下文會介紹),也就是在節(jié)點空間大小一定的情況下,每個節(jié)點可以存儲更多的內(nèi)結(jié)點,這樣每個結(jié)點能索引的范圍更大更精確。

所有的葉子節(jié)點使用指針鏈接的好處是可以進行區(qū)間訪問,比如上圖中,如果查找大于 20 而小于 30 的記錄,只需要找到節(jié)點 20,就可以遍歷指針依次找到 25、30。如果沒有鏈接指針的話,就無法進行區(qū)間查找。這也是 MySQL 使用 B+Tree 作為索引存儲結(jié)構(gòu)的重要原因。

MySQL 為何將節(jié)點大小設(shè)置為頁的整數(shù)倍,這就需要理解磁盤的存儲原理。磁盤本身存取就比主存慢很多,在加上機械運動損耗(特別是普通的機械硬盤),磁盤的存取速度往往是主存的幾百萬分之一,為了盡量減少磁盤 I/O,磁盤往往不是嚴格按需讀取,而是每次都會預(yù)讀,即使只需要一個字節(jié),磁盤也會從這個位置開始,順序向后讀取一定長度的數(shù)據(jù)放入內(nèi)存,預(yù)讀的長度一般為頁的整數(shù)倍。

“頁是計算機管理存儲器的邏輯塊,硬件及 OS 往往將主存和磁盤存儲區(qū)分割為連續(xù)的大小相等的塊,每個存儲塊稱為一頁(許多 OS 中,頁的大小通常為 4K)。

主存和磁盤以頁為單位交換數(shù)據(jù)。當(dāng)程序要讀取的數(shù)據(jù)不在主存中時,會觸發(fā)一個缺頁異常,此時系統(tǒng)會向磁盤發(fā)出讀盤信號,磁盤會找到數(shù)據(jù)的起始位置并向后連續(xù)讀取一頁或幾頁載入內(nèi)存中,然后一起返回,程序繼續(xù)運行。”

MySQL 巧妙利用了磁盤預(yù)讀原理,將一個節(jié)點的大小設(shè)為等于一個頁,這樣每個節(jié)點只需要一次 I/O 就可以完全載入。為了達到這個目的,每次新建節(jié)點時,直接申請一個頁的空間,這樣就保證一個節(jié)點物理上也存儲在一個頁里,加之計算機存儲分配都是按頁對齊的,就實現(xiàn)了讀取一個節(jié)點只需一次 I/O。

假設(shè) B+Tree 的高度為 h,一次檢索最多需要 h-1I/O(根節(jié)點常駐內(nèi)存),復(fù)雜度 $O(h) = O(\log_{M}N)$。實際應(yīng)用場景中,M 通常較大,常常超過 100,因此樹的高度一般都比較小,通常不超過 3。

最后簡單了解下 B+Tree 節(jié)點的操作,在整體上對索引的維護有一個大概的了解,雖然索引可以大大提高查詢效率,但維護索引仍要花費很大的代價,因此合理的創(chuàng)建索引也就尤為重要。

仍以上面的樹為例,我們假設(shè)每個節(jié)點只能存儲 4 個內(nèi)節(jié)點。首先要插入第一個節(jié)點 28,如下圖所示。

leaf page 和 index page 都沒有滿

接著插入下一個節(jié)點 70,在 Index Page 中查詢后得知應(yīng)該插入到 50 – 70 之間的葉子節(jié)點,但葉子節(jié)點已滿,這時候就需要進行也分裂的操作,當(dāng)前的葉子節(jié)點起點為 50,所以根據(jù)中間值來拆分葉子節(jié)點,如下圖所示。

Leaf Page 拆分

最后插入一個節(jié)點 95,這時候 Index Page 和 Leaf Page 都滿了,就需要做兩次拆分,如下圖所示。

Leaf Page 與 Index Page 拆分

拆分后最終形成了這樣一顆樹。

最終樹

B+Tree 為了保持平衡,對于新插入的值需要做大量的拆分頁操作,而頁的拆分需要 I/O 操作,為了盡可能的減少頁的拆分操作,B+Tree 也提供了類似于平衡二叉樹的旋轉(zhuǎn)功能。

當(dāng) Leaf Page 已滿但其左右兄弟節(jié)點沒有滿的情況下,B+Tree 并不急于去做拆分操作,而是將記錄移到當(dāng)前所在頁的兄弟節(jié)點上。通常情況下,左兄弟會被先檢查用來做旋轉(zhuǎn)操作。就比如上面第二個示例,當(dāng)插入 70 的時候,并不會去做頁拆分,而是左旋操作。

左旋操作

通過旋轉(zhuǎn)操作可以最大限度的減少頁分裂,從而減少索引維護過程中的磁盤的 I/O 操作,也提高索引維護效率。需要注意的是,刪除節(jié)點跟插入節(jié)點類似,仍然需要旋轉(zhuǎn)和拆分操作,這里就不再說明。

高性能策略

通過上文,相信你對 B+Tree 的數(shù)據(jù)結(jié)構(gòu)已經(jīng)有了大致的了解,但 MySQL 中索引是如何組織數(shù)據(jù)的存儲呢?以一個簡單的示例來說明,假如有如下數(shù)據(jù)表:

CREATE?TABLE?People(last_name?varchar(50)?not?null,first_name?varchar(50)?not?null,dob?date?not?null,gender enum(`m`,`f`)?not?null,key(last_name,first_name,dob));

對于表中每一行數(shù)據(jù),索引中包含了 last_name、first_name、dob 列的值,下圖展示了索引是如何組織數(shù)據(jù)存儲的。

索引如何組織數(shù)據(jù)存儲,來自:高性能 MySQL

可以看到,索引首先根據(jù)第一個字段來排列順序,當(dāng)名字相同時,則根據(jù)第三個字段,即出生日期來排序,正是因為這個原因,才有了索引的 “最左原則”。

1. MySQL 不會使用索引的情況:非獨立的列

“獨立的列” 是指索引列不能是表達式的一部分,也不能是函數(shù)的參數(shù)。比如:

select?*?from?where?id?+?1?=?5

我們很容易看出其等價于 id = 4,但是 MySQL 無法自動解析這個表達式,使用函數(shù)是同樣的道理。

2. 前綴索引

如果列很長,通常可以索引開始的部分字符,這樣可以有效節(jié)約索引空間,從而提高索引效率。

3. 多列索引和索引順序

在多數(shù)情況下,在多個列上建立獨立的索引并不能提高查詢性能。理由非常簡單,MySQL 不知道選擇哪個索引的查詢效率更好,所以在老版本,比如 MySQL5.0 之前就會隨便選擇一個列的索引,而新的版本會采用合并索引的策略。舉個簡單的例子,在一張電影演員表中,在 actor_id 和 film_id 兩個列上都建立了獨立的索引,然后有如下查詢:

老版本的 MySQL 會隨機選擇一個索引,但新版本做如下的優(yōu)化:

select?film_id,actor_id?from?film_actor?where?actor_id =?1union?allselect?film_id,actor_id?from?film_actor?where?film_id =?1?and?actor_id <>?1

1、當(dāng)出現(xiàn)多個索引做相交操作時(多個 AND 條件),通常來說一個包含所有相關(guān)列的索引要優(yōu)于多個獨立索引。

2、當(dāng)出現(xiàn)多個索引做聯(lián)合操作時(多個 OR 條件),對結(jié)果集的合并、排序等操作需要耗費大量的 CPU 和內(nèi)存資源,特別是當(dāng)其中的某些索引的選擇性不高,需要返回合并大量數(shù)據(jù)時,查詢成本更高。所以這種情況下還不如走全表掃描。

因此 explain 時如果發(fā)現(xiàn)有索引合并(Extra 字段出現(xiàn) Using union),應(yīng)該好好檢查一下查詢和表結(jié)構(gòu)是不是已經(jīng)是最優(yōu)的,如果查詢和表都沒有問題,那只能說明索引建的非常糟糕,應(yīng)當(dāng)慎重考慮索引是否合適,有可能一個包含所有相關(guān)列的多列索引更適合。

前面我們提到過索引如何組織數(shù)據(jù)存儲的,從圖中可以看到多列索引時,索引的順序?qū)τ诓樵兪侵陵P(guān)重要的,很明顯應(yīng)該把選擇性更高的字段放到索引的前面,這樣通過第一個字段就可以過濾掉大多數(shù)不符合條件的數(shù)據(jù)。

索引選擇性是指不重復(fù)的索引值和數(shù)據(jù)表的總記錄數(shù)的比值,選擇性越高查詢效率越高,因為選擇性越高的索引可以讓 MySQL 在查詢時過濾掉更多的行。唯一索引的選擇性是 1,這時最好的索引選擇性,性能也是最好的。

理解索引選擇性的概念后,就不難確定哪個字段的選擇性較高了,查一下就知道了,比如:

SELECT?*?FROM?payment?where?staff_id =?2?and?customer_id =?584

是應(yīng)該創(chuàng)建 (staff_id,customer_id) 的索引還是應(yīng)該顛倒一下順序?執(zhí)行下面的查詢,哪個字段的選擇性更接近 1 就把哪個字段索引前面就好。

select?count(distinct?staff_id)/count(*)?as?staff_id_selectivity,count(distinct?customer_id)/count(*)?as?customer_id_selectivity,count(*)?from?payment

多數(shù)情況下使用這個原則沒有任何問題,但仍然注意你的數(shù)據(jù)中是否存在一些特殊情況。舉個簡單的例子,比如要查詢某個用戶組下有過交易的用戶信息:

select?user_id?from?trade?where?user_group_id =?1?and?trade_amount >?0

MySQL 為這個查詢選擇了索引 (user_group_id,trade_amount),如果不考慮特殊情況,這看起來沒有任何問題,但實際情況是這張表的大多數(shù)數(shù)據(jù)都是從老系統(tǒng)中遷移過來的,由于新老系統(tǒng)的數(shù)據(jù)不兼容,所以就給老系統(tǒng)遷移過來的數(shù)據(jù)賦予了一個默認的用戶組。這種情況下,通過索引掃描的行數(shù)跟全表掃描基本沒什么區(qū)別,索引也就起不到任何作用。

推廣開來說,經(jīng)驗法則和推論在多數(shù)情況下是有用的,可以指導(dǎo)我們開發(fā)和設(shè)計,但實際情況往往會更復(fù)雜,實際業(yè)務(wù)場景下的某些特殊情況可能會摧毀你的整個設(shè)計。

4. 避免多個范圍條件

實際開發(fā)中,我們會經(jīng)常使用多個范圍條件,比如想查詢某個時間段內(nèi)登錄過的用戶:

select?user.*?from?user?where?login_time >?'2017-04-01'?and?age?between?18?and?30;

這個查詢有一個問題:它有兩個范圍條件,login_time 列和 age 列,MySQL 可以使用 login_time 列的索引或者 age 列的索引,但無法同時使用它們。

5. 覆蓋索引

如果一個索引包含或者說覆蓋所有需要查詢的字段的值,那么就沒有必要再回表查詢,這就稱為覆蓋索引。覆蓋索引是非常有用的工具,可以極大的提高性能,因為查詢只需要掃描索引會帶來許多好處:

1、索引條目遠小于數(shù)據(jù)行大小,如果只讀取索引,極大減少數(shù)據(jù)訪問量

2、索引是有按照列值順序存儲的,對于 I/O 密集型的范圍查詢要比隨機從磁盤讀取每一行數(shù)據(jù)的 IO 要少的多

6. 使用索引掃描來排序

MySQL 有兩種方式可以生產(chǎn)有序的結(jié)果集,其一是對結(jié)果集進行排序的操作,其二是按照索引順序掃描得出的結(jié)果自然是有序的。如果 explain 的結(jié)果中 type 列的值為 index 表示使用了索引掃描來做排序。

掃描索引本身很快,因為只需要從一條索引記錄移動到相鄰的下一條記錄。但如果索引本身不能覆蓋所有需要查詢的列,那么就不得不每掃描一條索引記錄就回表查詢一次對應(yīng)的行。這個讀取操作基本上是隨機 I/O,因此按照索引順序讀取數(shù)據(jù)的速度通常要比順序地全表掃描要慢。

在設(shè)計索引時,如果一個索引既能夠滿足排序,又滿足查詢,是最好的。

只有當(dāng)索引的列順序和 ORDER BY 子句的順序完全一致,并且所有列的排序方向也一樣時,才能夠使用索引來對結(jié)果做排序。如果查詢需要關(guān)聯(lián)多張表,則只有 ORDER BY 子句引用的字段全部為第一張表時,才能使用索引做排序。

ORDER BY 子句和查詢的限制是一樣的,都要滿足最左前綴的要求(有一種情況例外,就是最左的列被指定為常數(shù),下面是一個簡單的示例),其它情況下都需要執(zhí)行排序操作,而無法利用索引排序。

// 最左列為常數(shù),索引:(date,staff_id,customer_id)select??staff_id,customer_id?from?demo?where?date?=?'2015-06-01'?order?by?staff_id,customer_id

7. 冗余和重復(fù)索引

冗余索引是指在相同的列上按照相同的順序創(chuàng)建的相同類型的索引,應(yīng)當(dāng)盡量避免這種索引,發(fā)現(xiàn)后立即刪除。比如有一個索引 (A,B),再創(chuàng)建索引 (A) 就是冗余索引。冗余索引經(jīng)常發(fā)生在為表添加新索引時,比如有人新建了索引 (A,B),但這個索引不是擴展已有的索引 (A)。

大多數(shù)情況下都應(yīng)該盡量擴展已有的索引而不是創(chuàng)建新索引。但有極少情況下出現(xiàn)性能方面的考慮需要冗余索引,比如擴展已有索引而導(dǎo)致其變得過大,從而影響到其他使用該索引的查詢。

8. 刪除長期未使用的索引

定期刪除一些長時間未使用過的索引是一個非常好的習(xí)慣。

關(guān)于索引這個話題打算就此打住,最后要說一句,索引并不總是最好的工具,只有當(dāng)索引幫助提高查詢速度帶來的好處大于其帶來的額外工作時,索引才是有效的。

對于非常小的表,簡單的全表掃描更高效。對于中到大型的表,索引就非常有效。對于超大型的表,建立和維護索引的代價隨之增長,這時候其他技術(shù)也許更有效,比如分區(qū)表。最后的最后,explain 后再提測是一種美德。

特定類型查詢優(yōu)化

1. 優(yōu)化 COUNT() 查詢

COUNT() 可能是被大家誤解最多的函數(shù)了,它有兩種不同的作用,其一是統(tǒng)計某個列值的數(shù)量,其二是統(tǒng)計行數(shù)。統(tǒng)計列值時,要求列值是非空的,它不會統(tǒng)計 NULL。

如果確認括號中的表達式不可能為空時,實際上就是在統(tǒng)計行數(shù)。最簡單的就是當(dāng)使用 COUNT(*) 時,并不是我們所想象的那樣擴展成所有的列,實際上,它會忽略所有的列而直接統(tǒng)計所有的行數(shù)。

我們最常見的誤解也就在這兒,在括號內(nèi)指定了一列卻希望統(tǒng)計結(jié)果是行數(shù),而且還常常誤以為前者的性能會更好。但實際并非這樣,如果要統(tǒng)計行數(shù),直接使用 COUNT(*),意義清晰,且性能更好。

有時候某些業(yè)務(wù)場景并不需要完全精確的 COUNT 值,可以用近似值來代替,EXPLAIN 出來的行數(shù)就是一個不錯的近似值,而且執(zhí)行 EXPLAIN 并不需要真正地去執(zhí)行查詢,所以成本非常低。

通常來說,執(zhí)行 COUNT() 都需要掃描大量的行才能獲取到精確的數(shù)據(jù),因此很難優(yōu)化,MySQL 層面還能做得也就只有覆蓋索引了。如果不還能解決問題,只有從架構(gòu)層面解決了,比如添加匯總表,或者使用 redis 這樣的外部緩存系統(tǒng)。

2. 優(yōu)化關(guān)聯(lián)查詢

在大數(shù)據(jù)場景下,表與表之間通過一個冗余字段來關(guān)聯(lián),要比直接使用 JOIN 有更好的性能。如果確實需要使用關(guān)聯(lián)查詢的情況下,需要特別注意的是:

1、確保 ON 和 USING 字句中的列上有索引。在創(chuàng)建索引的時候就要考慮到關(guān)聯(lián)的順序。當(dāng)表 A 和表 B 用列 c 關(guān)聯(lián)的時候,如果優(yōu)化器關(guān)聯(lián)的順序是 A、B,那么就不需要在 A 表的對應(yīng)列上創(chuàng)建索引。沒有用到的索引會帶來額外的負擔(dān),一般來說,除非有其他理由,只需要在關(guān)聯(lián)順序中的第二張表的相應(yīng)列上創(chuàng)建索引(具體原因下文分析)。

2、確保任何的 GROUP BY 和 ORDER BY 中的表達式只涉及到一個表中的列,這樣 MySQL 才有可能使用索引來優(yōu)化。

要理解優(yōu)化關(guān)聯(lián)查詢的第一個技巧,就需要理解 MySQL 是如何執(zhí)行關(guān)聯(lián)查詢的。當(dāng)前 MySQL 關(guān)聯(lián)執(zhí)行的策略非常簡單,它對任何的關(guān)聯(lián)都執(zhí)行嵌套循環(huán)關(guān)聯(lián)操作,即先在一個表中循環(huán)取出單條數(shù)據(jù),然后在嵌套循環(huán)到下一個表中尋找匹配的行,依次下去,直到找到所有表中匹配的行為為止。然后根據(jù)各個表匹配的行,返回查詢中需要的各個列。

太抽象了?以上面的示例來說明,比如有這樣的一個查詢:

SELECT?A.xx,B.yyFROM?A?INNER?JOIN?B?USING(c)WHERE?A.xx?IN?(5,6)

假設(shè) MySQL 按照查詢中的關(guān)聯(lián)順序 A、B 來進行關(guān)聯(lián)操作,那么可以用下面的偽代碼表示 MySQL 如何完成這個查詢:

outer_iterator = SELECT A.xx,A.c FROM A WHERE A.xx IN (5,6);outer_row = outer_iterator.next;while(outer_row) {inner_iterator = SELECT B.yy FROM B WHERE B.c = outer_row.c;inner_row = inner_iterator.next;while(inner_row) {output[inner_row.yy,outer_row.xx];inner_row = inner_iterator.next;}outer_row = outer_iterator.next;}

可以看到,最外層的查詢是根據(jù) A.xx 列來查詢的,A.c 上如果有索引的話,整個關(guān)聯(lián)查詢也不會使用。再看內(nèi)層的查詢,很明顯 B.c 上如果有索引的話,能夠加速查詢,因此只需要在關(guān)聯(lián)順序中的第二張表的相應(yīng)列上創(chuàng)建索引即可。

3. 優(yōu)化 LIMIT 分頁

當(dāng)需要分頁操作時,通常會使用 LIMIT 加上偏移量的辦法實現(xiàn),同時加上合適的 ORDER BY 字句。如果有對應(yīng)的索引,通常效率會不錯,否則,MySQL 需要做大量的文件排序操作。

一個常見的問題是當(dāng)偏移量非常大的時候,比如:LIMIT 10000 20 這樣的查詢,MySQL 需要查詢 10020 條記錄然后只返回 20 條記錄,前面的 10000 條都將被拋棄,這樣的代價非常高。

優(yōu)化這種查詢一個最簡單的辦法就是盡可能的使用覆蓋索引掃描,而不是查詢所有的列。然后根據(jù)需要做一次關(guān)聯(lián)查詢再返回所有的列。對于偏移量很大時,這樣做的效率會提升非常大。考慮下面的查詢:

SELECT?film_id,description?FROM?film?ORDER?BY?title?LIMIT?50,5;

如果這張表非常大,那么這個查詢最好改成下面的樣子:

SELECT?film.film_id,film.descriptionFROM?film?INNER?JOIN?(SELECT?film_id?FROM?film?ORDER?BY?title?LIMIT?50,5)?AS?tmp?USING(film_id);

這里的延遲關(guān)聯(lián)將大大提升查詢效率,讓 MySQL 掃描盡可能少的頁面,獲取需要訪問的記錄后在根據(jù)關(guān)聯(lián)列回原表查詢所需要的列。

有時候如果可以使用書簽記錄上次取數(shù)據(jù)的位置,那么下次就可以直接從該書簽記錄的位置開始掃描,這樣就可以避免使用 OFFSET,比如下面的查詢:

SELECT?id?FROM?t?LIMIT?10000,?10;

改為:

SELECT?id?FROM?t?WHERE?id?>?10000?LIMIT?10;

其它優(yōu)化的辦法還包括使用預(yù)先計算的匯總表,或者關(guān)聯(lián)到一個冗余表,冗余表中只包含主鍵列和需要做排序的列。

4. 優(yōu)化 UNION

MySQL 處理 UNION 的策略是先創(chuàng)建臨時表,然后再把各個查詢結(jié)果插入到臨時表中,最后再來做查詢。因此很多優(yōu)化策略在 UNION 查詢中都沒有辦法很好的時候。

經(jīng)常需要手動將 WHERE、LIMIT、ORDER BY 等字句 “下推” 到各個子查詢中,以便優(yōu)化器可以充分利用這些條件先優(yōu)化。

除非確實需要服務(wù)器去重,否則就一定要使用 UNION ALL,如果沒有 ALL 關(guān)鍵字,MySQL 會給臨時表加上 DISTINCT 選項,這會導(dǎo)致整個臨時表的數(shù)據(jù)做唯一性檢查,這樣做的代價非常高。

當(dāng)然即使使用 ALL 關(guān)鍵字,MySQL 總是將結(jié)果放入臨時表,然后再讀出,再返回給客戶端。雖然很多時候沒有這個必要,比如有時候可以直接把每個子查詢的結(jié)果返回給客戶端。

結(jié)語

理解查詢是如何執(zhí)行以及時間都消耗在哪些地方,再加上一些優(yōu)化過程的知識,可以幫助大家更好的理解 MySQL,理解常見優(yōu)化技巧背后的原理。希望本文中的原理、示例能夠幫助大家更好的將理論和實踐聯(lián)系起來,更多的將理論知識運用到實踐中。

其他也沒啥說的了,給大家留兩個思考題吧,可以在腦袋里想想答案,這也是大家經(jīng)常掛在嘴邊的,但很少有人會思考為什么?

1、有非常多的程序員在分享時都會拋出這樣一個觀點:盡可能不要使用存儲過程,存儲過程非常不容易維護,也會增加使用成本,應(yīng)該把業(yè)務(wù)邏輯放到客戶端。既然客戶端都能干這些事,那為什么還要存儲過程?

2、JOIN 本身也挺方便的,直接查詢就好了,為什么還需要視圖呢?

IT技術(shù)分享社區(qū)

文章推薦程序員效率:畫流程圖常用的工具程序員效率:整理常用的在線筆記軟件遠程辦公:常用的遠程協(xié)助軟件,你都知道嗎?51單片機程序下載、ISP及串口基礎(chǔ)知識硬件:斷路器、接觸器、繼電器基礎(chǔ)知識

總結(jié)

以上是生活随笔為你收集整理的学习 MySQL 高性能优化原理,这一篇就够了!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

国产成人一区二区三区在线观看 | 国产精品精品久久久久久 | 人人草在线视频 | 日日操天天操狠狠操 | 亚洲高清久久久 | 欧美a级在线播放 | 久久亚洲私人国产精品va | 在线观看日韩视频 | 国产成人精品在线 | av资源网在线播放 | 久久精品最新 | 欧美一级黄色视屏 | 欧美色综合 | 日韩精品一区二区三区免费观看 | 999久久久久久久久 69av视频在线观看 | 免费97视频 | 国产不卡免费 | 9在线观看免费 | av电影免费在线 | 探花系列在线 | 国产精品久久久久久69 | 日日摸日日 | 欧美另类交人妖 | 日韩专区在线 | 日日爱夜夜爱 | 国产亚洲小视频 | 久久精品三 | 久久这里精品视频 | 综合婷婷丁香 | 国产精品18久久久久久不卡孕妇 | 在线免费观看黄色大片 | www久 | 激情综合色综合久久综合 | 亚洲电影图片小说 | 最近中文字幕视频完整版 | 激情喷水| 97在线精品国自产拍中文 | av三级在线播放 | 国产中文在线播放 | 欧美极品少妇xbxb性爽爽视频 | 久久久久国产成人精品亚洲午夜 | 成人网页在线免费观看 | www最近高清中文国语在线观看 | 国产成人精品av在线 | 久久久久久久久综合 | 在线观看韩日电影免费 | 午夜99| 91精品1区| 欧美性生活免费 | 在线观看视频黄 | 成 人 黄 色视频免费播放 | 国产精品18久久久久久不卡孕妇 | 亚洲电影久久久 | 2024国产精品视频 | 91视频-88av | 久久久久久久久久久综合 | 激情丁香综合 | 9797在线看片亚洲精品 | 国偷自产中文字幕亚洲手机在线 | 欧美专区国产专区 | 亚洲国内精品在线 | 国产日产精品一区二区三区四区 | 精品a在线 | 美女视频久久久 | 国产精品久久久久久久久久ktv | 国产99久久精品一区二区永久免费 | 91色吧| 日本精品视频在线播放 | 精品国产自在精品国产精野外直播 | 日本爱爱免费 | 国产一区自拍视频 | 国产精品网站 | 国产午夜精品一区二区三区四区 | 中文乱码视频在线观看 | www.国产在线 | 免费观看高清 | 激情五月播播久久久精品 | 欧美一级性生活片 | 国产精彩视频一区二区 | 91视频国产高清 | 欧美日韩高清一区二区三区 | 亚洲精品国产综合久久 | 久操中文字幕在线观看 | 亚洲色图美腿丝袜 | 91桃色国产在线播放 | 亚洲黄色在线 | 亚洲免费观看在线视频 | 欧洲视频一区 | 日日精品 | 国产一级一片免费播放放a 一区二区三区国产欧美 | 亚洲va天堂va欧美ⅴa在线 | 欧美大片www| 成人蜜桃网 | 国产99久久久精品视频 | 韩国一区二区在线观看 | 日批网站免费观看 | zzijzzij亚洲日本少妇熟睡 | 欧美少妇xxx | 国产精品毛片一区二区三区 | 精品免费一区二区三区 | 色偷偷88888欧美精品久久 | 亚洲欧美精品一区二区 | 久久久婷 | 日韩精品一区二区三区视频播放 | 中文字幕一区二区在线播放 | 日本中文字幕在线播放 | 在线免费观看视频一区二区三区 | 国产精品欧美久久久久三级 | 中文字幕资源在线观看 | 日韩在线精品一区 | 亚洲精品美女视频 | 亚洲精品美女免费 | 国产不卡视频在线播放 | 黄网站色欧美视频 | 又黄又爽又色无遮挡免费 | 日韩一区二区三区高清免费看看 | 国产精品美女久久久久久2018 | 日韩激情av在线 | av电影 一区二区 | 日韩久久激情 | 国产亚洲小视频 | 国产精品永久免费在线 | 人人揉人人揉人人揉人人揉97 | 在线免费观看视频一区二区三区 | 日韩欧美在线观看一区二区 | 中文字幕永久免费 | 91精品国产自产在线观看永久 | 国产精品自在线 | 最近中文国产在线视频 | 免费一级日韩欧美性大片 | 日本99热| 天天干天天在线 | 成人av免费在线观看 | 91夫妻视频 | 激情视频二区 | 久久久久久久久久亚洲精品 | 国产高清免费 | 美女网站黄免费 | 欧美色伊人 | 亚洲精品综合欧美二区变态 | 免费福利视频网 | 成人啪啪18免费游戏链接 | 亚洲日本一区二区在线 | a级国产乱理论片在线观看 特级毛片在线观看 | 日韩国产欧美视频 | 成人午夜剧场在线观看 | 免费观看一级 | 国产黄在线看 | 精品国产一区二区三区久久久久久 | 黄色的视频网站 | 在线观av| 国产护士hd高朝护士1 | 91九色在线观看 | av+在线播放在线播放 | 国产精品av免费在线观看 | 久久夜色精品国产欧美一区麻豆 | 成人a在线观看高清电影 | 麻豆视频在线播放 | 在线а√天堂中文官网 | 国产精品99久久久久人中文网介绍 | 天天草夜夜 | 国产精品www | 日韩在线免费电影 | 综合色站导航 | 色成人亚洲网 | 久久精品国产免费看久久精品 | 欧美国产日韩在线观看 | 人人爱爱人人 | 国产美女搞久久 | 国产精品国产三级国产aⅴ入口 | 亚洲精品国产精品久久99 | 亚洲免费在线视频 | 亚洲天天看 | 成年人在线免费视频观看 | 色www免费视频| 国产在线国偷精品产拍 | 亚洲涩涩涩 | 日韩在线观看视频中文字幕 | 高清av免费一区中文字幕 | av资源网在线播放 | 国产精品毛片一区二区三区 | 国精产品一二三线999 | 成人免费在线观看电影 | 999在线观看视频 | 国产精品18久久久久久vr | 91精品在线免费观看 | 日韩欧美视频在线免费观看 | 免费成视频 | 欧美在线1 | 成人久久免费 | 麻豆网站免费观看 | 日日夜夜精品视频 | 五月婷婷在线视频观看 | www久久99 | 四虎国产精品免费 | 91久久人澡人人添人人爽欧美 | 五月综合激情婷婷 | 欧美色图亚洲图片 | 在线免费试看 | 亚洲丝袜一区二区 | 五月婷婷视频 | 天天射综合网站 | 国产黄视频在线观看 | 日本在线中文在线 | 日韩欧美网址 | 久久久久久久久久网 | 久久免费a | 精品一区在线 | 麻豆传媒视频在线播放 | 欧美一区二区在线免费观看 | 最新国产精品久久精品 | 中文字幕一区二区三区在线视频 | 久久色视频 | 日本动漫做毛片一区二区 | 成人午夜精品 | www黄色com | 亚洲精品国产精品国自产 | 5月丁香婷婷综合 | 国产天天爽 | 欧美日韩性视频 | 国产精品一区二区白浆 | 99久高清在线观看视频99精品热在线观看视频 | 欧美一级片在线播放 | 日韩av电影免费在线观看 | 麻豆国产精品永久免费视频 | 在线超碰av | 精品久久91 | 岛国精品一区二区 | 日韩免费一区二区三区 | av品善网 | av大全在线 | 午夜精品久久 | 精品色999 | 99色精品视频| 中文字幕在线看片 | 97视频免费在线看 | 丁香5月婷婷 | 国产不卡毛片 | 日日爱夜夜爱 | 久久久久久美女 | 正在播放国产精品 | 自拍超碰在线 | 午夜精品久久久久久久99婷婷 | 超碰97av在线| 国产精品人人做人人爽人人添 | 日韩视频一区二区 | 色婷婷狠狠操 | www免费黄色 | 国产视频日韩视频欧美视频 | 欧美与欧洲交xxxx免费观看 | 久久精品久久99精品久久 | 国产超碰在线 | 手机看片1042| 91在线亚洲 | 在线视频亚洲 | 亚洲精品动漫在线 | 91亚洲网 | 亚洲精品乱码久久 | 夜夜躁日日躁狠狠久久av | 亚洲国产精品一区二区尤物区 | 天天色天天上天天操 | 中文字幕欧美日韩va免费视频 | 亚洲欧美日本一区二区三区 | 精品国产一区二区三区在线观看 | 五月婷香蕉久色在线看 | 中文字幕免 | 国模吧一区 | 久免费视频 | 国产精品久久久一区二区三区网站 | 欧美日本一二三 | 992tv人人网tv亚洲精品 | 国产福利中文字幕 | 黄网站免费大全入口 | 精品999久久久 | 91女神的呻吟细腰翘臀美女 | 国产在线视频资源 | 国产理论在线 | 91高清免费 | 在线观看免费高清视频大全追剧 | 午夜精品久久久久久久久久久久 | 欧美国产视频在线 | 久久深夜福利免费观看 | 久久情爱 | www四虎影院 | 国产一区欧美一区 | 九九有精品 | 一区二区三区电影大全 | 99精品欧美一区二区蜜桃免费 | 日韩影视精品 | 日韩免费在线视频 | 亚洲视频axxx | 日韩精品视频网站 | 97色资源 | 中文字幕中文字幕中文字幕 | 亚洲91网站 | avav片| 亚洲精品视频免费在线 | 欧美国产日韩一区二区三区 | 久久福利小视频 | 国产黄色大全 | 国产在线91在线电影 | 欧美大片在线观看一区 | 亚洲精品中文在线观看 | 亚洲综合精品视频 | 国产群p视频| 免费看网站在线 | 日韩伦理一区二区三区av在线 | 久久精品99国产 | 在线观看日韩 | 日韩av免费一区 | 东方av免费在线观看 | 天天摸天天干天天操天天射 | 久久高视频 | 国产精品一区二区三区视频免费 | 日韩高清精品免费观看 | 国产精品一区二区免费在线观看 | 亚洲在线视频观看 | 99 久久久久 | 国产不卡免费视频 | 国产一区精品在线观看 | 9999精品免费视频 | 久久涩视频 | 欧美一二在线 | 成人免费网站在线观看 | 亚洲国产中文字幕在线观看 | 五月天狠狠操 | 成人影视免费 | 亚洲欧洲中文日韩久久av乱码 | 国产精品美女久久久久久 | 亚洲精品网址在线观看 | 在线激情网 | 天天干天天草天天爽 | 亚洲欧美日本一区二区三区 | 国产精品久久久久久久久久久久 | 亚洲国产片色 | 综合久久精品 | 国产高清av免费在线观看 | 国产女人18毛片水真多18精品 | 国内三级在线观看 | 中文字幕在线播放av | 色婷婷国产精品 | 日本精品视频一区二区 | 9797在线看片亚洲精品 | 激情av综合 | 9ⅰ精品久久久久久久久中文字幕 | 久久系列 | 国产99久久久精品视频 | 日韩精品一区二区在线观看视频 | 99久久精品免费看国产四区 | 草 免费视频 | 欧美成人在线免费 | 日韩精品久久久久久久电影99爱 | 国产91丝袜在线播放动漫 | 亚洲精品在线观 | 精品96久久久久久中文字幕无 | 96精品在线 | 日韩一二区在线观看 | 人人dvd| 久久人人看 | 五月天综合色激情 | 国产精品自产拍在线观看蜜 | 伊人电影天堂 | 中文字幕在线视频国产 | 九色精品在线 | 中文字幕一区二区三区四区在线视频 | 午夜成人免费影院 | 成人在线免费小视频 | 成人三级av| 国产成人av网站 | 五月婷婷在线视频观看 | 成人影片免费 | 国产主播大尺度精品福利免费 | 香蕉在线视频观看 | 国产精品剧情 | 五月婷婷欧美 | 综合激情网... | 日韩精品一区在线播放 | 欧美日韩国内在线 | 国产成人av网站 | 亚洲在线网址 | 亚洲不卡av一区二区三区 | 黄污网 | 欧美整片sss| 91av视频在线观看免费 | 美女视频又黄又免费 | 亚洲高清在线视频 | 韩国精品视频在线观看 | 亚洲色五月 | 麻豆视频免费播放 | 正在播放日韩 | 日韩色在线观看 | 天天爱天天舔 | 99久久精品久久亚洲精品 | 久久成人国产精品入口 | 在线看黄网站 | 999久久精品| 国产亚洲精品久久久久久电影 | 处女av在线| 久草在线精品观看 | 久久久久久久久久久综合 | 国产成人亚洲在线观看 | 亚洲免费av网站 | 国产一线二线三线在线观看 | 国产高清综合 | 国产97色 | 手机在线看a | 黄色片免费在线 | 日本久久久久久 | www99久久| 日日噜噜噜噜夜夜爽亚洲精品 | 2021国产在线视频 | 干干操操 | 东方av在| 欧美黑人xxxx猛性大交 | 日本中文字幕影院 | 婷婷网站天天婷婷网站 | 国产人成在线观看 | 99精品在线看 | 性色va | 狠狠色丁香婷婷综合久小说久 | 欧美激情综合五月色丁香小说 | 六月婷婷网 | 韩日精品中文字幕 | 亚洲免费国产 | 国产精品成人自产拍在线观看 | 高潮久久久久久 | 欧美一级免费在线 | 视频直播国产精品 | 夜夜躁天天躁很躁波 | 99久久精品无码一区二区毛片 | 欧美伦理电影一区二区 | 欧美性受极品xxxx喷水 | 成人h电影在线观看 | 成人av在线亚洲 | 国产精品涩涩屋www在线观看 | 久久综合免费视频 | 欧美久久久久久久 | 久久a热6 | 色视频成人在线观看免 | 久久免费视频这里只有精品 | 主播av在线| 精品国内 | 久久草网 | 91麻豆精品国产91久久久久 | h久久| 久草电影在线观看 | 欧美日韩在线播放 | 6699私人影院 | 日韩三级视频在线观看 | 国产精品久久久999 国产91九色视频 | 久久99国产精品久久99 | 玖玖在线观看视频 | 国产精品久久久久久久久久直播 | 精品国产成人在线影院 | 日韩三级中文字幕 | 国产精品永久免费观看 | 天天综合导航 | 一区二区三区影院 | 日韩黄色在线观看 | 色干干| 久久久一本精品99久久精品 | 国内精品久久久久影院优 | 九九热精品视频在线播放 | 精品一二三四五区 | 色九九在线 | 五月婷婷开心中文字幕 | 日本一区二区三区免费观看 | 成年人免费在线观看 | 综合久久久久久 | 日韩在线视频网 | 性色av一区二区三区在线观看 | 亚洲色图27p| 婷色在线 | 人人澡人人添人人爽一区二区 | 久久久久久久久久久黄色 | 亚洲国产欧美在线人成大黄瓜 | 夜添久久精品亚洲国产精品 | 久久99久久99精品免观看粉嫩 | 国产成人精品一区二区三区免费 | 久久久久久美女 | 一区三区视频在线观看 | 国产一区免费看 | 91麻豆操| 麻豆国产在线视频 | 国产精品入口传媒 | 国产精品成人一区二区 | 国内精品久久久久久久久久清纯 | 国产免费久久 | 狠狠狠色丁香综合久久天下网 | 久久精选视频 | 亚洲成人蜜桃 | 亚洲在线网址 | 国产91精品久久久久久 | 丝袜美女视频网站 | 日韩a免费| 日日日网| 亚洲免费专区 | 人人澡人人爱 | 国产美女精品视频免费观看 | 色先锋资源网 | 亚洲91av| 在线 高清 中文字幕 | 免费日韩 精品中文字幕视频在线 | 国产九九九精品视频 | 色婷婷av在线 | 久久草草热国产精品直播 | 天天操夜夜操 | 日韩在线观看中文字幕 | 一级α片免费看 | 国产成人久久精品77777综合 | 久久99精品久久只有精品 | 成人网在线免费视频 | 九九视频精品免费 | 久久久美女 | 天天天天爱天天躁 | 亚洲精品国产日韩 | 国产剧情一区二区 | 久久草精品 | 国产一区二区精品 | 高清不卡一区二区在线 | 成人小视频在线 | 天天激情 | 韩日av一区二区 | 日韩深夜在线观看 | 97偷拍视频| 亚洲va欧美va国产va黑人 | 成 人 免费 黄 色 视频 | 国产成人久久精品 | 伊人色综合久久天天网 | 天天干天天干天天射 | 天天射成人| 国产精品美女久久久久aⅴ 干干夜夜 | 天天艹天天 | 日韩av中文在线观看 | 天堂素人在线 | 欧美一级免费高清 | 国产美女免费视频 | 顶级bbw搡bbbb搡bbbb | 亚洲1级片| 99视频免费在线观看 | 日本xxxx裸体xxxx17 | 91精品视频免费在线观看 | 国产成人黄色在线 | 欧美成人精品在线 | 国产又粗又硬又长又爽的视频 | 911精品美国片911久久久 | 91人人干 | 成人国产精品久久久 | av7777777| 成 人 黄 色 视频 免费观看 | 成年人电影免费在线观看 | 欧美日韩另类在线观看 | 国产香蕉视频在线播放 | 国产精品99视频 | 免费观看国产视频 | 亚洲午夜精品久久久久久久久久久久 | 天天操夜夜想 | 国产女教师精品久久av | 91成人精品视频 | 国产特黄色片 | 国内精品久久久久影院男同志 | 国产精品久久久久久久久久东京 | 亚洲欧美日韩国产精品一区午夜 | 欧美一级高清片 | 久久伦理影院 | 亚洲狠狠干 | 一区二区视频网站 | 97超碰在| 97视频人人澡人人爽 | 天天操比 | 久久精品99 | 亚洲视频在线播放 | 久久久免费观看完整版 | 美女网站在线看 | 97超碰人人澡人人 | 五月天久久久 | 成年人免费在线播放 | 国产亚洲人成网站在线观看 | 国产在线精品一区二区三区 | 国产中文字幕视频在线观看 | 六月丁香婷婷在线 | 久久久国产电影 | 国产精品1区 | 97在线观看免费观看 | 日韩精品免费专区 | 国产精品美女免费看 | 久久久久久久久久亚洲精品 | 中文字幕在线免费看 | 在线网址你懂得 | 午夜在线资源 | 欧洲精品视频一区二区 | 久草免费在线观看 | 国产精彩在线视频 | 91在线视频免费播放 | 日韩a级免费视频 | 国产91免费在线观看 | 国产欧美在线一区二区三区 | 国产亚洲欧美一区 | 久99视频| 久久久久成人精品 | www.黄色 | 五月婷婷久 | 久艹视频在线免费观看 | 三级av在线免费观看 | 精品中文字幕视频 | 欧美成人精品欧美一级乱黄 | 一区二区欧美在线观看 | 91九色视频在线 | 婷婷网址 | 中文字幕免费观看全部电影 | 四虎成人av| 久久久久综合精品福利啪啪 | 久久久精品在线观看 | 午夜精品久久久久 | 久久久国产精品电影 | 色婷婷激婷婷情综天天 | 成人av高清| 欧美激情精品 | 久久精品一区八戒影视 | 91伊人影院| 久操伊人 | 久久久一本精品99久久精品66 | 亚洲资源在线观看 | 高清不卡免费视频 | 蜜臀一区二区三区精品免费视频 | 91在线精品秘密一区二区 | a级一a一级在线观看 | 看全黄大色黄大片 | 精品国产综合区久久久久久 | freejavvideo日本免费 | 午夜精品久久久久久久99水蜜桃 | 欧美一二三区播放 | 国产在线探花 | 亚洲欧美婷婷六月色综合 | 婷婷国产在线观看 | 97超碰在线播放 | 日日操日日 | 蜜臀一区二区三区精品免费视频 | 中文字幕一区2区3区 | 日韩视频一区二区在线观看 | 九九久久久久99精品 | 色在线中文字幕 | 高清国产在线一区 | 国产专区一 | 69国产精品视频免费观看 | 天天综合亚洲 | 国内精品久久久久影院男同志 | 日本特黄特色aaa大片免费 | 久久久久女教师免费一区 | 在线看片视频 | 欧美在线观看视频 | 久久久国产一区二区 | 九九有精品 | 亚洲va欧美va人人爽 | 亚洲综合色激情五月 | 久久国产精品小视频 | 欧美一级看片 | 在线精品亚洲一区二区 | 国产群p | 99免费在线播放99久久免费 | 97电影手机版 | 成人国产精品入口 | 国产区免费在线 | 久草在线资源网 | 狠狠精品 | 一本一本久久a久久精品综合 | 在线视频亚洲 | 五月激情在线 | www.eeuss影院av撸 | 国产九九精品视频 | 亚洲精品视频在线免费播放 | 亚洲欧美精品在线 | 91精品啪在线观看国产线免费 | 久久综合久久伊人 | 欧美激情视频一二三区 | 欧美成天堂网地址 | 久久国产网站 | 人人干天天干 | 亚洲精品国产拍在线 | 91在线影院 | 亚洲天天综合网 | 91精品啪在线观看国产 | 天海翼一区二区三区免费 | 日韩一区二区久久 | 日韩在线一级 | 婷婷丁香国产 | 日韩欧美视频免费看 | 高清不卡毛片 | 日韩亚洲在线 | 亚洲午夜久久久久久久久久久 | 一本一本久久a久久 | 亚洲黄色app| 中文字幕一区二区在线播放 | 久久精品视频在线看 | 成人av在线亚洲 | 日本中文字幕网址 | 日日久视频| 综合色婷婷 | 探花视频网站 | 天天干中文字幕 | 五月婷婷综合在线观看 | 丁香激情综合 | 最新影院 | 99久久婷婷国产精品综合 | 欧美在线视频一区二区 | 婷婷国产视频 | 国模精品一区二区三区 | 国产精品成人自产拍在线观看 | 国产成人黄色网址 | 国产一区二区在线免费观看 | 日韩视频1区 | 99精品偷拍视频一区二区三区 | 一本一本久久a久久精品综合妖精 | 亚洲黄色一级视频 | 日韩免费电影网 | 亚洲成人精品久久久 | 精品国产伦一区二区三区观看体验 | 亚洲另类在线视频 | 狠狠撸电影 | 五月婷婷一级片 | 免费观看国产精品视频 | 国产私拍在线 | 国产精品观看 | 国产精品一区二区在线 | 亚洲三级在线免费观看 | 日三级在线 | 毛片永久新网址首页 | 国产欧美久久久精品影院 | 国产成年人av | 中文字幕一区二区三区久久蜜桃 | 欧美成人69av| 色福利网站 | 久久香蕉电影 | 亚洲另类在线视频 | 久久天天躁狠狠躁夜夜不卡公司 | 人人爱人人爽 | 超碰人人超碰 | 在线观看亚洲免费视频 | 免费福利片2019潦草影视午夜 | 免费观看www7722午夜电影 | 国产精品久久久久一区二区三区共 | 最近中文字幕视频完整版 | 亚洲天堂网视频在线观看 | 中文字幕高清免费日韩视频在线 | 丝袜美腿在线视频 | 欧美精品在线一区二区 | 日韩丝袜视频 | 国产日韩欧美在线观看视频 | 亚洲视频综合在线 | 日韩精品资源 | 国产精品一区二区三区四 | 免费高清在线一区 | h动漫中文字幕 | 成人久久电影 | 国产成人免费网站 | 久久久久久久久久久黄色 | 超碰大片 | 精品国产成人 | 国产成人精品999 | 五月综合色婷婷 | 在线观看日本高清mv视频 | 欧美日本国产在线观看 | 国内精品久久久精品电影院 | 视频在线观看入口黄最新永久免费国产 | 91免费网 | 久久中国精品 | 91天堂素人约啪 | 国内久久| 999国内精品永久免费视频 | 日韩亚洲国产中文字幕 | 久久久九色精品国产一区二区三区 | 天堂网av在线 | 国产视频美女 | 国产精品免费在线播放 | 亚a在线| 日韩欧美一区二区三区免费观看 | 日本深夜福利视频 | 欧美日韩在线观看不卡 | 日韩精品一区二区三区视频播放 | 日日爽 | 久久精品99| 91成人欧美 | 午夜免费视频网站 | 久久精选视频 | 最近最新mv字幕免费观看 | 色婷婷成人网 | 天天综合日日夜夜 | 日韩在线不卡av | 久久se视频 | 97成人精品视频在线观看 | 中文字幕永久 | 国产精品一区二区三区免费看 | 国产最新在线视频 | 在线看黄色的网站 | 亚洲午夜激情网 | www亚洲视频 | av日韩精品 | 91视频3p | 中文字幕视频免费观看 | 深爱激情综合网 | 日韩欧美在线视频一区二区三区 | 日韩午夜在线 | 综合婷婷 | 欧美性色xo影院 | 亚洲欧美乱综合图片区小说区 | 日韩视频一区二区三区在线播放免费观看 | 免费a v观看 | 国产亚洲精品久久久久久无几年桃 | 天天综合五月天 | 国产99久久 | 国产99自拍 | www久久99| 国产成人精品免高潮在线观看 | 超碰人人在 | 久久久久免费精品国产 | 国产黄影院色大全免费 | 国产日韩精品一区二区三区 | 免费观看一区二区三区视频 | 五月综合网 | 久久不卡电影 | av高清一区二区三区 | 欧美激情视频在线观看免费 | 91在线免费看片 | 国产在线视频在线观看 | 97超碰色偷偷 | 天天天天干 | 免费视频你懂的 | h动漫中文字幕 | 97夜夜澡人人双人人人喊 | 国产亚洲婷婷免费 | 在线色网站 | 特级毛片爽www免费版 | av成人在线看 | 中文字幕av在线电影 | 免费黄av| 国产高清在线精品 | 中文字幕在线免费观看 | 午夜精品一二三区 | 欧美地下肉体性派对 | 久草新在线 | 日韩在线理论 | 国产一级高清 | 亚洲免费在线播放视频 | 手机看片1042| 射久久久 | 成人黄色在线电影 | 欧美成人h版电影 | 欧美做受高潮电影o | av片子在线观看 | 日韩一区精品 | 黄色在线网站噜噜噜 | 91天天操| 精品久久网站 | 中文字幕永久免费 | 国产免费黄视频在线观看 | 国产精品理论视频 | 一区二区三区高清在线观看 | 最近中文字幕免费视频 | 久久亚洲成人网 | 午夜视频一区二区 | 久久人网 | av不卡免费看 | 国语自产偷拍精品视频偷 | 97精品伊人 | 国产黄色片免费观看 | 激情av资源网 | 久久久精品二区 | 国产精品色视频 | 久久久久久国产精品亚洲78 | 超碰人人草 | 91高清完整版在线观看 | 在线免费观看视频你懂的 | 久久久久久久久久久成人 | 成人教育av | 国产精品综合av一区二区国产馆 | 久久99精品国产99久久 | 91精品久久久久久综合五月天 | 国产超碰97 | 96在线| 免费中文字幕视频 | 四虎免费在线观看视频 | 91视频88av| 丁香婷婷综合激情 | 狠狠操电影网 | 91精品国产乱码久久 | 91九色丨porny丨丰满6 | 国产精品毛片一区二区 | 91人人爱 | 天天干天天干天天操 | 色网免费观看 | 亚洲欧美国产日韩在线观看 | 国产成人一区在线 | 麻豆视频观看 | 日韩成年视频 | 色婷婷成人网 | 色综合婷婷 | 国产福利一区二区在线 | 丁香综合网 | www99精品 | 天天色官网 | 99爱在线| 久久免费av电影 | 亚洲精品美女在线观看 | 亚洲精品国产精品国自产观看浪潮 | 成年人电影免费看 | 在线视频观看91 | 亚洲男男gaygay无套同网址 | 天天爱天天 | 色天天天 | 天天综合中文 | 91视频链接| 日日狠狠 | 91九色精品女同系列 | 黄p网站在线观看 | 成人午夜片av在线看 | 日韩一区二区三免费高清在线观看 | 成人在线你懂得 | 中文字幕免费 | 天天干.com| 精品一区二区6 | 少妇bbb搡bbbb搡bbbb | 国产尤物在线观看 | 亚洲国产片色 | 国产高清区 | 国内精品久久久久影院优 | 国产精品一区二区无线 | 国产福利91精品一区二区三区 | 久草爱| 国产精品久久久久久影院 | 免费av黄色| 视频在线在亚洲 | 日韩欧美精品一区二区 | 五月天电影免费在线观看一区 | 国产不卡av在线 | 成人97视频 | 久久人人爽人人爽人人片 | 天堂在线一区二区 | 国产精品麻豆果冻传媒在线播放 | 日产乱码一二三区别在线 | 91视频88av| 99精品在线视频播放 | 99热超碰| 五月天精品视频 | 天天添夜夜操 | 国产伦精品一区二区三区免费 | 欧美日韩一级久久久久久免费看 | 亚洲三级在线 | 奇人奇案qvod| 伊人久久精品久久亚洲一区 | 日韩城人在线 | 国产精品久久久久久久免费观看 | 久久久久久中文字幕 | 国语对白少妇爽91 | 91成品视频 | 中文字幕观看视频 | 中文字幕色站 | 色偷偷888欧美精品久久久 | 免费看色网站 | av一级片在线观看 | 国产精品视频地址 | 色狠狠干 | 亚洲国产天堂av | 国产中文字幕91 | 久久久国产毛片 | 国产黄在线| 天天操天天射天天爱 | 精品久久国产精品 | 婷婷日日| 亚洲国产精品成人女人久久 | 国产999精品久久久久久绿帽 | 日韩影视在线观看 | 在线 国产 亚洲 欧美 | 日韩精品在线免费播放 | 超碰在线官网 | 久久 亚洲视频 | 在线观看av免费观看 | 久操久 | 中文一区二区三区在线观看 | 最近中文字幕免费视频 | 日韩精品视频一二三 | 碰超人人| 特级aaa毛片 | www.狠狠干 | 久久久国产一区 | 成年人免费在线看 | 欧美美女激情18p | 久久人人97超碰精品888 | 久久99九九99精品 | 午夜在线免费观看视频 | 亚洲电影影音先锋 | 成年人在线观看 | 日韩成人精品一区二区三区 | 久久久国产精品一区二区三区 | 国产一区二区日本 | 激情欧美一区二区免费视频 | 日本精品一区二区三区在线观看 | 在线视频 区 | 精品视频中文字幕 |