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

歡迎訪問 生活随笔!

生活随笔

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

数据库

MySQL 优化 —— EXPLAIN 执行计划详解

發(fā)布時(shí)間:2025/3/12 数据库 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL 优化 —— EXPLAIN 执行计划详解 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

引言

本博客大部分內(nèi)容翻譯自MySQL 官網(wǎng)?Understanding the Query Execution Plan?專題。另外有一些補(bǔ)充,則來自于網(wǎng)課以及《高性能MySQL(第三版)》。

根據(jù)我們的表、字段、索引、以及 where 子句中的條件等信息,MySQL 優(yōu)化器會(huì)考慮各種技術(shù)來更高效地執(zhí)行查找。一個(gè)大表中的查找不一定要讀取所有記錄;多表連接也不一定需要比較每條聯(lián)合記錄。優(yōu)化器選擇的執(zhí)行最優(yōu)查詢的操作集,稱為“查詢執(zhí)行計(jì)劃”也可以說是 EXPLAIN 計(jì)劃。我們的目標(biāo)就是找到那些可以將查詢優(yōu)化地更好的點(diǎn),然后通過學(xué)習(xí) SQL 語法和索引等技術(shù),來改善執(zhí)行計(jì)劃。

一、EXPLAIN 介紹

EXPLAIN 語句提供了 MySQL 如何執(zhí)行語句的信息:

1、MySQL5.6 之后 EXPLAIN 可以和 SELECT DELETE INSERT REPLACE UPDATE 語句等一起工作;

2、當(dāng) EXPLAIN 和一個(gè)可解釋的語句一起使用時(shí),MySQL 就會(huì)展示來自優(yōu)化器的關(guān)于語句執(zhí)行計(jì)劃的信息。即,MySQL 會(huì)解釋它將會(huì)怎樣執(zhí)行語句,包括表是如何連接的,以什么方式排序的等信息。

3、When EXPLAIN is used with?FOR CONNECTION?connection_id? rather than an explainable statement, it displays the execution plan for the statement executing in the named connection.(這句暫不翻譯)

4、對(duì)于 SELECT 語句, EXPLAIN 提供了額外的執(zhí)行計(jì)劃信息,可以用 SHOW WARNINGS 來查看。參考:Section?8.8.3, “Extended EXPLAIN Output Format”.

5、EXPLAIN對(duì)于檢查涉及分區(qū)表的查詢非常有用。參考:Section?22.3.5, “Obtaining Information About Partitions”.

6、FORMAT 選項(xiàng)可以用于選擇輸出格式。TRADITIONAL 以表格的形式展示。如果沒有指定 FORMAT 選項(xiàng),TRADITIONAL 就是默認(rèn)的。JSON 格式會(huì)以 json 格式展示 EXPLAIN 信息。例如:EXPLAIN FORMAT = JSON SELECT... 。

在 EXPLAIN 的幫助下,你可以清楚的知道為了讓查詢變得更快,該在哪里給表添加索引。你也可以知道優(yōu)化器是否以最佳的順序連接各個(gè)表。為了讓優(yōu)化器使用 SELECT 語句中表的命名順序連接各表,以 SELECT? STRAIGHT_JOIN(而不是SELECT)開頭即可。(參考:Section?13.2.9, “SELECT Statement”)但是,STRAIGHT_JOIN?可能會(huì)妨礙索引的使用,因?yàn)樗昧税脒B接轉(zhuǎn)換(because it disables semijoin transformations.?)。參考:Section?8.2.2.1, “Optimizing Subqueries, Derived Tables, and View References with Semijoin Transformations”.

優(yōu)化器跟蹤(The optimizer trace有時(shí)可能提供與 EXPLAIN 互補(bǔ)的信息。但是,優(yōu)化器跟蹤的格式和內(nèi)容會(huì)受不同版本的影響。更多細(xì)節(jié),參考:MySQL Internals: Tracing the Optimizer.

如果你對(duì)本應(yīng)該使用索引而沒有用到索引的情況感到疑惑,執(zhí)行一下 ANALYZE TABLE 來更新表統(tǒng)計(jì)信息。例如列的基數(shù)(cardinality of keys),這會(huì)影響優(yōu)化器做出的選擇。參考:Section?13.7.2.1, “ANALYZE TABLE Statement”.

注意:

EXPLAIN 還可以用來獲取表的列的信息

EXPLAIN? tb1_name??與??DESCRIBE? tb1_name??、?SHOW? COLUMNS? FROM? tb1_name? 是等價(jià)的。

更多信息,參考:Section?13.8.1, “DESCRIBE Statement”,和??Section?13.7.5.5, “SHOW COLUMNS Statement”。

二、EXPLAIN 的輸出格式

EXPLAIN會(huì)為 select 語句中的每張表返回一行信息。并會(huì)以MySQL處理語句時(shí)讀取這些表的順序羅列它們。

MySQL 解決所有 join 的方法是使用一個(gè)“嵌套循環(huán)關(guān)聯(lián)”的方法。也就是說,MySQL會(huì)從第一張表中讀取一條記錄,然后找到第二張表中與之匹配的記錄,然后再找第三張表,依此類推。當(dāng)所有的表處理完畢,MySQL會(huì)輸出查詢的列并回溯表列表(table list),直到找到一個(gè)有更多行的表(譯者注:連接表的時(shí)候,主表查詢出的記錄往往是最多的,從主表開始關(guān)聯(lián)查詢,再回溯到主表,可能官網(wǎng)想表達(dá)的是這個(gè)意思)。下一條記錄會(huì)從該表中讀取,并且繼續(xù)處理下一張表。

EXPLAIN 輸出包含了分區(qū)信息(partitions 列)。同樣,對(duì)于 SELECT 語句,EXPLAIN 會(huì)生成擴(kuò)展信息,只要在 EXPLAIN 執(zhí)行完成后,直接執(zhí)行 SHOW WARNINGS 即可。參考:Section?8.8.3, “Extended EXPLAIN Output Format”

注意

舊的MySQL版本中, 分區(qū)和擴(kuò)展信息使用?EXPLAIN PARTITIONS?和?EXPLAIN EXTENDED?輸出。這些語法依然向后兼容,但是分區(qū)和擴(kuò)展輸出現(xiàn)在默認(rèn)都是開啟的了。所以?PARTITIONS?和?EXTENDED?關(guān)鍵字完全多余。未來版本也會(huì)移除的。

不可以在EXPLAIN語句中同時(shí)使用 PARTITIONS 和 EXTENDED 關(guān)鍵字。另外,哪一個(gè)都不能和 FORMAT 選項(xiàng)一起使用。

MySQL Workbench (譯者注:這是一款由 MySQL 官方出品的,類似 Navicat 的數(shù)據(jù)庫管理工具)有一個(gè) Visual Explain 功能,可以提供可視化的 EXPLAIN 輸出信息。參考:Tutorial: Using Explain to Improve Query Performance.

2.1 EXPLAIN 輸出字段(EXPLAIN Output Columns)

這一節(jié)描述了 EXPLAIN 的輸出字段。后面的兩節(jié)則提供了更多的關(guān)于 type 和 Extra 字段的信息。

EXPLAIN輸出的每一行都對(duì)應(yīng)一張表。下面的表提供了EXPLAIN的輸出字段,第一列是字段名稱,第二列是當(dāng) FORMAT = JSON 時(shí)的輸出字段名稱:

ColumnJSON NameMeaning
idselect_idThe?SELECT?identifier:查詢id
select_typeNoneThe?SELECT?type:查詢類型
tabletable_nameThe table for the output row:對(duì)應(yīng)的表
partitionspartitionsThe matching partitions:匹配的分區(qū)
typeaccess_typeThe join type:訪問類型
possible_keyspossible_keysThe possible indexes to choose:可能用到的索引
keykeyThe index actually chosen:真正被用到的索引
key_lenkey_lengthThe length of the chosen key:用到的索引長(zhǎng)度
refrefThe columns compared to the index:與索引比較的列
rowsrowsEstimate of rows to be examined:大約要檢索的行數(shù)
filteredfilteredPercentage of rows filtered by table condition:按表?xiàng)l件過濾的行的百分比
ExtraNoneAdditional information:附加信息

1、id(JSON 名:select_id)

SELECT 標(biāo)識(shí)符(SELECT identifier)。這是一個(gè)連續(xù)的數(shù)字,用以標(biāo)識(shí)查詢中的 SELECT 。如果引用了其他行的聯(lián)合結(jié)果集(union result of other rows),那么 id 會(huì)為 NULL。這種情況下,該行的 table 字段會(huì)顯示為 <union M, N> 這樣的形式,表示該行代表了?id 值為 M 和 N 的行的聯(lián)合(the row refers to the union of the rows with?id?values of?M?and?N?)。

重點(diǎn):id 是一個(gè)自然數(shù)編號(hào),如1、2,但有時(shí)也可以是NULL。如上所述,NULL的時(shí)候,就是引用了一個(gè) UNION 結(jié)果集

當(dāng) id 為數(shù)字的時(shí)候,編號(hào)大的會(huì)先執(zhí)行。有時(shí)候,編號(hào)會(huì)相同,相同編號(hào)就從上到下執(zhí)行

2、select_type(JSON 名:無)

查詢類型。MySQL將查詢分為簡(jiǎn)單和復(fù)雜類型,復(fù)雜類型可分為三大類簡(jiǎn)單子查詢FROM子查詢以及UNION查詢。select_type 就是用于區(qū)分這三類復(fù)雜查詢。可選值如下(紅色標(biāo)記為常見值):

select_type?ValueJSON NameMeaning
SIMPLENone簡(jiǎn)單查詢(沒有任何 UNION 或 子查詢)。
PRIMARYNone主查詢,如果查詢中包含任何復(fù)雜的子部分,那么最外層查詢被標(biāo)記PRIMARY
UNIONNoneUNION 中的第二個(gè)或后面的SELECT語句
DEPENDENT UNIONdependent?(true)UNION 中的第二個(gè)或后面的SELECT語句, 依賴于外部查詢
UNION RESULTunion_result從UNION 的結(jié)果獲取數(shù)據(jù)的SELECT。
SUBQUERYNoneSELECT子句或WHERE子句中的子查詢
DEPENDENT SUBQUERYdependent?(true)子查詢中的第一個(gè) SELECT, 依賴于外層查詢
DERIVEDNone派生表。FROM子句中的子查詢。MySQL會(huì)遞歸執(zhí)行這些子查詢,把結(jié)果放在臨時(shí)表里
MATERIALIZEDmaterialized_from_subqueryMaterialized subquery? 物化子查詢。參考《MySQL高級(jí) —— 查詢性能優(yōu)化》4.1節(jié)
UNCACHEABLE SUBQUERYcacheable?(false)非緩存子查詢,結(jié)果不能被緩存的子查詢,必須被外部查詢的每一行重新求得
UNCACHEABLE UNIONcacheable?(false)非緩存子查詢(uncacheable subquery)的 UNION 中的第二個(gè)或后面的 SELECT

SUBQUERY還可以被標(biāo)記為DEPENDENT SUBQUERY,這一般是指SELECT依賴于外層查詢發(fā)現(xiàn)的數(shù)據(jù)(很可能是依賴于FROM派生表的外層SELECT)。參考:Section?13.2.10.7, “Correlated Subqueries”?。

DEPENDENT SUBQUERY 的取值與 UNCACHEABLE SUBQUERY(由于用戶變量等原因)?的取值不同。對(duì)于 DEPENDENT SUBQUERY ,對(duì)于來自其外部查詢的變量的每組不同值,子查詢只重新計(jì)算一次。而對(duì)于 UNCACHEABLE SUBQUERY ,對(duì)外部查詢的每行記錄,該子查詢都會(huì)計(jì)算一遍。

子查詢緩存與緩存中的查詢結(jié)果緩存不一樣(具體描述參考?Section?8.10.3.1, “How the Query Cache Operates”)。子查詢緩存發(fā)生在查詢執(zhí)行過程中,而查詢結(jié)果緩存只在查詢執(zhí)行完畢時(shí)才會(huì)存儲(chǔ)結(jié)果。

當(dāng)你在 EXPLAIN 語句中指定了 FORMAT = JSON ,輸出的結(jié)果并沒有一個(gè)對(duì)應(yīng) select_type 的單獨(dú)屬性;query_block 屬性對(duì)應(yīng)給定的 SELECT 。與剛才顯示的大多數(shù) SELECT 子查詢類型等價(jià)的屬性都是有的,并且在合適的時(shí)機(jī)就會(huì)展示。不過并沒有與 SIMPLE 和 PRIMARY 等價(jià)的 JSON 值。

select_type 屬性值對(duì)于非 SELECT 語句,會(huì)展示影響表的語句類型如 DELETE 語句的 select_type 就是 DELETE

3、table(JSON 名:table_name)

explain 輸出的每一行都對(duì)應(yīng)一個(gè)表別名或表名。它可以是下面的值中的一個(gè):

<union M, N> : 這一行引用了 id 值為 M 和 N 的表的聯(lián)合。

<derived N> : 這一行引用了 id 值為 N 的表所派生的表。派生的表可能是一個(gè)結(jié)果集,比如,FROM 子句中的子查詢。

<subquery N> : 這一行引用了 id 值為 N 的物化子查詢的結(jié)果。參考:Section?8.2.2.2, “Optimizing Subqueries with Materialization”.

4、partitions(JSON 名:partitions)

查詢的記錄將會(huì)在哪個(gè)分區(qū)中匹配。NULL 代表沒有分區(qū)表。參考:?Section?22.3.5, “Obtaining Information About Partitions”.

5、type(JSON 名:access_type)

關(guān)聯(lián)類型,但更準(zhǔn)確的說法是——訪問類型,換言之就是MySQL決定如何查找表中的行。參考 2.2 節(jié)。

6、possible_keys(JSON 名:possible_keys)

該屬性可以表明查詢中,對(duì)應(yīng)表有哪些索引可以使用。注意這個(gè)屬性完全不依賴于表在 explain 輸出中的顯示順序。也就是說,以生成的表順序 ,possible_keys 中的有些索引可能實(shí)際中并不會(huì)用到。

如果該屬性是 NULL (或者在 JSON 格式中是 undefined ),代表沒有相關(guān)的索引。這時(shí),你可能就應(yīng)該努力通過調(diào)試 WHERE 子句來提升你的查詢性能,檢查是否涉及到了一些字段或者適合索引查詢的字段。如果有,就創(chuàng)建一個(gè)合適的索引,然后再次通過 EXPLAIN 進(jìn)行檢驗(yàn)。

查看一個(gè)表有哪些索引,可以使用 SHOW INDEX FROM tbl_name 語句。

7、key(JSON 名:key)

這一列表示 MySQL 決定采用哪個(gè)索引來優(yōu)化對(duì)該表的訪問。如果 MySQL 決定使用 possible_keys 中的一個(gè)索引去查找記錄,那么這個(gè)索引就會(huì)列在 key 屬性中。

key 中也會(huì)出現(xiàn) possible_key 中沒有出現(xiàn)的索引。發(fā)生這種情況,很可能是 possible_keys 沒有找到適合查詢的索引,但是所有查詢的字段都在索引中。也就是說,查詢使用了覆蓋索引。因此,盡管它不用于決定要查詢哪些行,但卻依然可以用于查詢字段,因?yàn)樗饕龗呙枰廊槐刃袙呙韪咝АQ句話說,possible_keys 揭示了哪一個(gè)索引能有助于高效地行查找,而 key 顯示的是優(yōu)化采用哪一個(gè)索引可以最小化查詢成本

對(duì)于InnoDB ,即使查詢列表中有主鍵,二級(jí)索引也可能覆蓋所查詢的字段,因?yàn)?strong>InnoDB用每個(gè)二級(jí)索引存儲(chǔ)了主鍵值。如果列是NULL, MySQL就找不到索引來更有效地執(zhí)行查詢。

要強(qiáng)制MySQL使用或忽略在 possiblele_keys 中列出的索引,請(qǐng)?jiān)诓樵冎惺褂?FORCE INDEX,USE INDEX?或?IGNORE INDEX 。參考:?Section?8.9.4, “Index Hints”.

對(duì)于 MyISAM,運(yùn)行 ANALYZE TABLE 可以幫助優(yōu)化器選擇更好的索引。對(duì)于 MyISAM 表來說, myisamchk --analyze 也是一樣的。參考:?Section?13.7.2.1, “ANALYZE TABLE Statement”, 和?Section?7.6, “MyISAM Table Maintenance and Crash Recovery”.

8、key_len(JSON 名:key_length)

該字段表示 MySQL 在索引里使用的字節(jié)數(shù)。

因?yàn)閗ey_len是通過查找表的定義而被計(jì)算出,而不是表中的數(shù)據(jù),因此它顯示了在索引字段中可能的最大長(zhǎng)度,而不是表中數(shù)據(jù)使用的實(shí)際字節(jié)數(shù)。key_len 的值可以讓你判斷?MySQL 究竟用到了復(fù)合索引的哪幾個(gè)索引列。如果 key 屬性的值為 NULL , 那么 key_len 肯定也是 NULL 。

由于索引的存儲(chǔ)格式,那些可以為 NULL 的字段的索引長(zhǎng)度要比非空字段的索引長(zhǎng)度大一些。

MySQL并不總是顯示一個(gè)索引真正使用了多少。例如,如果對(duì)一個(gè)前綴模式匹配(例如 '張%')執(zhí)行LIKE查詢,它會(huì)顯示列的完整寬度正在被使用。

計(jì)算 key_len 的簡(jiǎn)易方法:

int 類型在MySQL中以4個(gè)字節(jié)存儲(chǔ),key_len 為 4,如果列值允許為 NULL,那么需要 + 1,即 key_len 為 5.

double 類型以8個(gè)字節(jié)存儲(chǔ),key_len 為 8,如果允許 NULL,那么同樣 +1, 即 key_len 為 9.

char(n) 定長(zhǎng)字符串,首先需要看字符集,常見的utf8以3個(gè)字節(jié)存儲(chǔ)每個(gè)字符,gbk用2個(gè),latin用1個(gè)。key_len 就等于每個(gè)字節(jié)長(zhǎng)度乘以允許最大字符數(shù)n,如果允許NULL,key_len 也要 +1。例如 char(20) DEFAULT NULL,編碼為utf8 ,那么 key_len 就是 3 × 20 + 1 = 61。如果不允許為 NULL ,就是60。

varchar(n)變長(zhǎng)字符串,每個(gè)字符:utf8為3字節(jié)、gbk為2字節(jié)、latin為1字節(jié)。由于是變長(zhǎng),因此 key_len 要 +2,如果允許 NULL,同樣 +1。其他和 char計(jì)算方式一樣。例如,varchar(20) DEFAULT NULL,編碼 utf8,那么 key_len 就是:

3 × 20 + 2 + 1 = 63,如果不允許為 NULL,就是62。

上面的說明只是單獨(dú)計(jì)算每種列值類型的方法,如果是復(fù)合索引,那么key_len 就是用到的索引列長(zhǎng)度和。

9、ref(JSON 名:ref)

ref 列顯示了常量或哪些列與 key 列中的索引進(jìn)行了比較。只有 type 列是 ref 的時(shí)候,ref 列才會(huì)有值。

簡(jiǎn)單的說,就是 key 中的索引,如果與一個(gè)常量比較,那么 ref 會(huì)顯示 const,如果是與其他表的某個(gè)列進(jìn)行比較,那么就會(huì)顯示該列名。

如果 ref 屬性的值是 func ,那么用到的值就是某些函數(shù)的結(jié)果。想要知道是哪個(gè)函數(shù),在 EXPLAIN 執(zhí)行后使用 SHOW WARNINGS ,查看EXPLAIN 的擴(kuò)展信息。

函數(shù)實(shí)際上可能是一個(gè)運(yùn)算符,比如算術(shù)運(yùn)算符。

10、rows(JSON 名:rows)

rows 列表示MySQL認(rèn)為執(zhí)行查詢必須檢查的行數(shù)。這個(gè)數(shù)字是內(nèi)嵌關(guān)聯(lián)循環(huán)計(jì)劃里的循環(huán)數(shù)目。也就是說,它不是最終的結(jié)果集里的行數(shù),而是MySQL為了找到符合條件的結(jié)果集而必須讀取的行的平均數(shù)。

對(duì)于 InnoDB 表,這個(gè)數(shù)是一個(gè)估值,而且可能并不總是準(zhǔn)確的。

11、filtered(JSON 名:filtered)

filtered 屬性表示被篩選條件過濾掉的記錄條數(shù)占全表的估計(jì)百分比。最大值是100,意味著記錄全部被過濾掉。從100開始遞減的值表示過濾的量在增加。rows 屬性表示了需要檢查的估計(jì)行數(shù),rows 乘 filtered 表示了將會(huì)被后面的表關(guān)聯(lián)的記錄條數(shù)。例如,如果 rows 是1000,filtered 是 50.00(50%),那么要與后面的表連接的記錄條數(shù)就是 1000 × 50% = 500。

對(duì)于filtered ,原文的描述是:The?filtered?column indicates an estimated percentage of table rows that will be filtered by the table condition. The maximum value is 100, which means no filtering of rows occurred.? 這里面有一個(gè)語義上的陷阱,即 filtered 究竟表示的是 “被過濾掉的” ?還是 “過濾后(留下來)的” ,經(jīng)過本人測(cè)試,filtered 表示的是前者,即 “被過濾掉的” ,這樣后面的語義也就基本自洽了。而 filtering 則表示 “過濾后(留下來)的” 。

12、Extra(JSON 名:none)

這一列顯示了關(guān)于 MySQL如何處理查詢的額外信息。對(duì)于不同值的描述,參考:Extra Information. 或參考下面 2.3 節(jié)。

2.2 EXPLAIN type訪問類型(EXPLAIN Join Types)

type 屬性描述了表之間是如何連接(或關(guān)聯(lián))的。在 JSON 格式輸出中,對(duì)應(yīng) access_type 屬性。下面的列表描述了訪問類型,順序從“最理想類型”到“最糟糕的類型”:

system > const > eq_ref > ref > range > index > ALL

2.2.1 system(不常見)

表只有一行(=系統(tǒng)表)。是 const 連接類型的一種特殊情況。

2.2.2 const

表最多只有 1 條匹配記錄,在查詢開始時(shí)就會(huì)讀取該表。因?yàn)橹挥幸恍?#xff0c;所以這一行中列的值可以被其他優(yōu)化器視為常量。const 訪問類型非常快,因?yàn)樗麄冎粫?huì)被讀取一次。MySQL能將這個(gè)查詢轉(zhuǎn)換為一個(gè)常量,然后可以高效地將表從連接操作中移除。

const 會(huì)在你使用整個(gè)主鍵(all parts of a PRIMARY KEY)唯一索引(UNIQUE index)去比較一個(gè)常量的時(shí)候用到。在下面的查詢中,tb1_name 就是一張 const 表:

SELECT * FROM tbl_name WHERE primary_key=1;SELECT * FROM tbl_nameWHERE primary_key_part1=1 AND primary_key_part2=2;

2.2.3 eq_ref

使用這種索引查找,MySQL知道最多只返回一條符合條件的記錄。它會(huì)在所有的索引部分都被用到的時(shí)候以及索引是主鍵非空唯一索引時(shí)出現(xiàn)到,它會(huì)將它們與某個(gè)參考值做比較。MySQL 對(duì)于這類訪問類型的優(yōu)化做的非常好,因?yàn)?strong>MySQL知道無須估計(jì)匹配行的范圍或在找到匹配行后再繼續(xù)查找。

eq_ref 會(huì)在索引列使用 = 號(hào)的時(shí)候用到。比較的值可以是一個(gè)常量也可以是一個(gè)從前表讀取的列(的表達(dá)式)。在下面的例子中,MySQL 可以使用 eq_ref 類型來處理 ref_table:

SELECT * FROM ref_table,other_tableWHERE ref_table.key_column=other_table.column;SELECT * FROM ref_table,other_tableWHERE ref_table.key_column_part1=other_table.columnAND ref_table.key_column_part2=1;

2.2.4 ref

這是一種索引訪問(有時(shí)也叫“索引查找”)它返回所有匹配某個(gè)單個(gè)值的行,是查找和掃描的混合體。此類索引訪問只有當(dāng)使用非唯一性索引唯一性索引的非唯一性前綴時(shí)才會(huì)發(fā)生。把它叫做 ref 是因?yàn)?strong>索引要跟某個(gè)參考值相比較。這個(gè)參考值可以是一個(gè)常數(shù),或是來自多表查詢的結(jié)果值。如果該篩選列可以匹配少量的記錄,那 ref 還算是一個(gè)不錯(cuò)的連接類型。

ref_or_null 是ref 之上的一個(gè)變體,它意味著MySQL必須在初次查找的結(jié)果里進(jìn)行第二次查找以找出NULL條目。

ref 也可以在索引列使用 = 或 <=> 號(hào)的時(shí)候被用到。下面的例子,MySQL 可以使用 ref 來處理 ref_table:

SELECT * FROM ref_table WHERE key_column=expr;SELECT * FROM ref_table,other_tableWHERE ref_table.key_column=other_table.column;SELECT * FROM ref_table,other_tableWHERE ref_table.key_column_part1=other_table.columnAND ref_table.key_column_part2=1;

2.2.5 full_text(不常見)

這種連接方式會(huì)在使用 FULLTEXT 索引的時(shí)候用到。

2.2.6 ref_or_null(不常見)

這種連接方式和 ref 類似,除此之外, MySQL 還會(huì)額外搜索包含 NULL 值的記錄。這種連接類型的優(yōu)化絕大多數(shù)是在處理子查詢的時(shí)候。在下面的例子中, MySQL 會(huì)使用 ref_or_null 來處理 ref_table:

SELECT * FROM ref_tableWHERE key_column=expr OR key_column IS NULL;

參考:Section?8.2.1.13, “IS NULL Optimization”.?

2.2.7 index_merge(不常見)

這種連接類型表示使用了索引合并優(yōu)化(Index Merge optimization)。這種情況下,explain 中的 key 屬性會(huì)羅列出被用到的索引,key_len 屬性會(huì)列出用到的索引的最長(zhǎng)的索引部分。參考:Section?8.2.1.3, “Index Merge Optimization”.

2.2.8 unique_subquery(不常見)

這種類型在類似下面的一些使用 IN 的子查詢時(shí)取代了 eq_ref:

value IN (SELECT primary_key FROM single_table WHERE some_expr)

?unique_subquery?只是一個(gè)索引查找函數(shù),它完全取代了子查詢,以提高效率。

2.2.9 index_subquery(不常見)

這種連接類型有點(diǎn)像 unique_subquery 。它取代了 IN 子查詢,但它只在子查詢中有非唯一索引時(shí)才會(huì)起作用,類似下面這樣:

value IN (SELECT key_column FROM single_table WHERE some_expr)

2.2.10 range?

這種連接類型會(huì)使用索引查詢給定范圍內(nèi)的記錄。EXPLAIN 輸出中的 key 屬性表示了哪個(gè) 索引列 被用到。key_len 包含了被用到的最長(zhǎng)的索引部分。ref 屬性為 NULL。

range 類型會(huì)在索引列使用 =、<>、>、>=、<、<=、IS NULL、<=>、BETWEEN、LIKE、或 IN() 任意一種操作符去比較常量的時(shí)候被用到。當(dāng)使用 IN或 OR 列表的時(shí)候,顯示的范圍掃描,其實(shí)并不能和 > 這類比較符的性能等同,雖然它們?cè)贓XPLAIN中顯示的類型都是 range,但是 IN() 列表其實(shí)屬于等值列表。參考《MySQL高級(jí) —— 高性能索引》6.2 節(jié)。

SELECT * FROM tbl_nameWHERE key_column = 10;SELECT * FROM tbl_nameWHERE key_column BETWEEN 10 and 20;SELECT * FROM tbl_nameWHERE key_column IN (10,20,30);SELECT * FROM tbl_nameWHERE key_part1 = 10 AND key_part2 IN (10,20,30);

2.2.11 index

index 類型除了會(huì)掃描索引樹之外,其他和 ALL 是一樣的。會(huì)有兩種情況出現(xiàn):

1、如果索引是一個(gè)覆蓋索引,那么這種類型的查詢就只會(huì)掃描索引樹。這種情況下, Extra 屬性會(huì)顯示 Using Index。一個(gè)只掃描索引的方式比 ALL 更快,這是因?yàn)樗饕龜?shù)據(jù)肯定要比表中數(shù)據(jù)要少。

2、以索引次序掃描全表。Extra 不會(huì)顯示 Uses Index。

index 類型的主要優(yōu)點(diǎn)是避免了排序,最大缺點(diǎn)是要承擔(dān)按索引次序讀取整個(gè)表的開銷。

MySQL 會(huì)在查詢只用到了單一索引列的時(shí)候用到 index 這種類型。

2.2.12 ALL

這就是人們常說的“全表掃描”,這種類型會(huì)對(duì)前面各表的組合記錄都進(jìn)行全表掃描。如果表是第一個(gè)沒有被標(biāo)記為 const 的表,這通常是不好的,在所有其他情況下通常是非常糟糕的。通常你可以通過增加索引來避免 ALL 。但也有例外,例如在查詢中使用了 LIMIT,或在 Extra 列中顯示“Using distinct/not exists”。

2.3 EXPLAIN Extra 信息(EXPLAIN Extra Information)

Extra 屬性顯示了MySQL如何執(zhí)行查詢的額外信息。

2.3.1 Using index

此值表示MySQL將使用覆蓋索引,以避免訪問表。不要把覆蓋索引和 type = index 訪問類型混淆了。

2.3.2 Using where

這意味著MySQL服務(wù)器將在存儲(chǔ)引擎檢索行后再進(jìn)行過濾。當(dāng)它讀取索引時(shí),就能被存儲(chǔ)引擎檢驗(yàn),因此不是所有帶有 WHERE子句的查詢都會(huì)顯示“Using where” 。有時(shí)“Using where” 的出現(xiàn)就是一個(gè)暗示:查詢可受益于不同的索引。

2.3.3 Using temporary

這意味著MySQL在對(duì)查詢結(jié)果排序時(shí)會(huì)使用一個(gè)臨時(shí)表。

2.3.4 Using filesort

這意味著MySQL會(huì)對(duì)結(jié)果使用一個(gè)外部索引排序,而不是按照索引次序從表里讀取行。MySQL有兩種文件排序算法,兩種方式都可以在內(nèi)存或磁盤上完成。EXPLAIN 不會(huì)告訴你 MySQL將使用哪一種文件排序,也不會(huì)告訴你排序會(huì)在內(nèi)存里還是在磁盤上完成。

2.3.5 Range checked for each record (index map:N)

這個(gè)值意味著沒有好用的索引,新的索引將在連接的每一行上重新估算。N是顯示在possible_keys 列中索引的位圖,并且是冗余的。

?

2.4 EXPLAIN 輸出的解釋

EXPLAIN輸出可以給你在連接各種表查詢的時(shí)候一個(gè)非常好的指示作用。這會(huì)大致告訴你MySQL 在執(zhí)行查詢的時(shí)候必須要檢查多少行記錄。如果你限制了 max_join_size 系統(tǒng)變量,那么 EXPLAIN 也會(huì)被用來告訴我們一些有用的東西。參考:?Section?5.1.1, “Configuring the Server”.

下面的例子顯示了多表連接是如何基于 EXPLAIN 提供的信息一點(diǎn)點(diǎn)優(yōu)化的

假設(shè)你有一個(gè)查詢語句,并且你通過 EXPLAIN 來檢查它:

EXPLAIN SELECT tt.TicketNumber, tt.TimeIn,tt.ProjectReference, tt.EstimatedShipDate,tt.ActualShipDate, tt.ClientID,tt.ServiceCodes, tt.RepetitiveID,tt.CurrentProcess, tt.CurrentDPPerson,tt.RecordVolume, tt.DPPrinted, et.COUNTRY,et_1.COUNTRY, do.CUSTNAMEFROM tt, et, et AS et_1, doWHERE tt.SubmitTime IS NULLAND tt.ActualPC = et.EMPLOYIDAND tt.AssignedPC = et_1.EMPLOYIDAND tt.ClientID = do.CUSTNMBR;

對(duì)于這個(gè)例子,做出下面的假設(shè):

1、比較的列(譯者注:columns being compared,實(shí)際上指的就是where 子句后面作為篩選條件的列,因?yàn)橥枰玫?= 號(hào)等操作符,因此在官網(wǎng)中一般都被稱為被比較的列)定義如下:

TableColumnData Type
ttActualPCCHAR(10)
ttAssignedPCCHAR(10)
ttClientIDCHAR(10)
etEMPLOYIDCHAR(15)
doCUSTNMBRCHAR(15)

2、表有以下這些索引:

TableIndex
ttActualPC
ttAssignedPC
ttClientID
etEMPLOYID?(primary key)
doCUSTNMBR?(primary key)

3、tt 表的?ActualPC 字段不是均勻分布的。

首先,在所有優(yōu)化執(zhí)行之前, EXPLAIN 語句輸出了下面的信息:

table type possible_keys key key_len ref rows Extra et ALL PRIMARY NULL NULL NULL 74 do ALL PRIMARY NULL NULL NULL 2135 et_1 ALL PRIMARY NULL NULL NULL 74 tt ALL AssignedPC, NULL NULL NULL 3872ClientID,ActualPCRange checked for each record (index map: 0x23)

因?yàn)槊繌埍淼倪B接類型都是 ALL ,這表明MySQL 正在生成一張笛卡爾集(a Cartesian product),也就是表中的每一行都進(jìn)行了組合。這會(huì)花費(fèi)相當(dāng)長(zhǎng)的時(shí)間,因?yàn)楸仨殭z查每個(gè)表中行數(shù)的乘積。對(duì)于這個(gè)案例,乘積就是:74 × 2135 × 74 × 3872 = 45,268,558,720 行。如果表再大一點(diǎn),你可以想象一下它需要花費(fèi)多長(zhǎng)時(shí)間。

這里有個(gè)問題,如果比較的列被聲明以相同的大小和類型,那么?MySQL 就可以更高效的使用列上的索引。在這種語境下,VARCHAR 和 CHAR 如果被設(shè)定為相同的大小,那么就被認(rèn)為是相同的。tt.ActualPC 被聲明為 CHAR(10) 而 et.EMPLOYID 聲明為 CHAR(15),所以長(zhǎng)度不匹配。

為了修復(fù)這種列長(zhǎng)度的不一致,使用 ALTER TABLE 來延長(zhǎng) ActualPC ,從 10個(gè)字符到15個(gè)字符。

mysql> ALTER TABLE tt MODIFY ActualPC VARCHAR(15);

現(xiàn)在 tt.ActualPC 和 et.EMPLOYID 都是 VARCHAR(15) 了。再次執(zhí)行 EXPLAIN 就會(huì)得到下面的結(jié)果:

table type possible_keys key key_len ref rows Extra tt ALL AssignedPC, NULL NULL NULL 3872 UsingClientID, whereActualPC do ALL PRIMARY NULL NULL NULL 2135Range checked for each record (index map: 0x1) et_1 ALL PRIMARY NULL NULL NULL 74Range checked for each record (index map: 0x1) et eq_ref PRIMARY PRIMARY 15 tt.ActualPC 1

這依然不夠完美,但是也稍微好了點(diǎn):rows 的乘積少了 74 倍(譯者注:et 表的 rows 由 74 變?yōu)榱?1)。這一版的執(zhí)行會(huì)在幾秒鐘完成。

第二處修改可以針對(duì) tt.AssignedPC = et_1.EMPLOYID 和 tt.ClientID = do.SUTNMBR 這兩個(gè)比較中有關(guān)列長(zhǎng)度不匹配的問題。

mysql> ALTER TABLE tt MODIFY AssignedPC VARCHAR(15),MODIFY ClientID VARCHAR(15);

這次修改之后,EXPLAIN 輸出就會(huì)變成下面這樣:

table type possible_keys key key_len ref rows Extra et ALL PRIMARY NULL NULL NULL 74 tt ref AssignedPC, ActualPC 15 et.EMPLOYID 52 UsingClientID, whereActualPC et_1 eq_ref PRIMARY PRIMARY 15 tt.AssignedPC 1 do eq_ref PRIMARY PRIMARY 15 tt.ClientID 1

此時(shí),查詢幾乎已經(jīng)優(yōu)化的足夠好了。遺留的問題是,默認(rèn)情況下,MySQL 假設(shè) tt.ActualPC 字段上的值是均勻分布的,但 tt 表并不是這樣的(前面的假設(shè))。幸運(yùn)的是,要告訴 MySQL 分析列值分布情況是非常簡(jiǎn)單的,你只需要這樣做:

mysql> ANALYZE TABLE tt;

憑借額外的索引信息,連接查詢已經(jīng)變得完美,EXPLAIN 也變成了如下結(jié)果:

table type possible_keys key key_len ref rows Extra tt ALL AssignedPC NULL NULL NULL 3872 UsingClientID, whereActualPC et eq_ref PRIMARY PRIMARY 15 tt.ActualPC 1 et_1 eq_ref PRIMARY PRIMARY 15 tt.AssignedPC 1 do eq_ref PRIMARY PRIMARY 15 tt.ClientID 1

EXPLAIN輸出中的rows列是來自MySQL連接優(yōu)化器的猜測(cè)。通過將 rows 的乘積與查詢返回的實(shí)際行數(shù)進(jìn)行比較,就可以檢查這些數(shù)字是否接近實(shí)際情況。如果數(shù)字與實(shí)際查詢的行數(shù)相差甚遠(yuǎn),你可以通過在你的 SELECT 語句中使用 STRAIGHT_JOIN 并嘗試在 FROM 子句中以不同的順序羅列所查各表來獲取更好的性能。(但是,STRAIGHT_JOIN 可能會(huì)妨礙到索引的使用,因?yàn)樗昧税脒B接轉(zhuǎn)換。參考:Section?8.2.2.1, “Optimizing Subqueries, Derived Tables, and View References with Semijoin Transformations”.)

在某些情況下,當(dāng)EXPLAIN SELECT與子查詢一起使用時(shí),可以執(zhí)行修改數(shù)據(jù)的語句。參考:Section?13.2.10.8, “Derived Tables”.

總結(jié)

這篇譯文翻譯了很長(zhǎng)時(shí)間,斷斷續(xù)續(xù)可能有一個(gè)月。本篇文章有些地方可能翻譯的并不準(zhǔn)確,因此希望各位可以與原文比較閱讀,增加理解。

另外,本來想在 Extra 部分就結(jié)束本篇翻譯,沒想到 MySQL 官網(wǎng)在最后一節(jié)給出了一個(gè)非常親民的案例講解,可以讓我們一覽 EXPLAIN 的常規(guī)用法。這一部分也是我認(rèn)為翻譯的比較準(zhǔn)確的部分。

因?yàn)?EXPLAIN 語句非常重要,因此,這篇譯文我也會(huì)經(jīng)常翻閱,加深理解的同時(shí)不斷糾正文中翻譯的不準(zhǔn)確或有所偏頗之處,同時(shí)希望大家能給予意見或建議。

2020-05-29 追加的部分,分散在文章的各個(gè)小節(jié)中,主要是在讀完《高性能MySQL(第三版)》的五六章,以及附錄EXPLAIN的部分,對(duì)執(zhí)行計(jì)劃和一些索引的概念有了更進(jìn)一步的理解和認(rèn)識(shí)。之前翻譯的不是很準(zhǔn)確的地方做了校對(duì)和潤(rùn)色,某些廢話也是能刪就刪,我還寫了很多關(guān)于索引及查詢優(yōu)化相關(guān)的文章,可以和這些文章一起閱讀,結(jié)合實(shí)踐并反復(fù)回看的話,相信一定可以成為MySQL性能優(yōu)化領(lǐng)域的好手。

?

總結(jié)

以上是生活随笔為你收集整理的MySQL 优化 —— EXPLAIN 执行计划详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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

在线观看自拍 | 国产精品一区二区三区99 | 麻豆系列在线观看 | 国产麻豆视频在线观看 | 午夜视频免费播放 | 国产精品久久久久久欧美 | 最近中文字幕大全 | 麻豆视屏 | 久久国产网 | 欧美在线观看禁18 | 悠悠av资源片 | 久久人人爽 | 天天干天天做 | 欧美日韩精品在线观看 | 天天天色综合 | 欧美热久久 | 久久99精品国产麻豆宅宅 | 黄色av一区二区三区 | av福利网址导航 | 丰满少妇麻豆av | 色噜噜色噜噜 | 国产+日韩欧美 | 亚洲高清精品在线 | av免费观看高清 | 亚洲最大在线视频 | 网址你懂的在线观看 | 日韩成人免费在线电影 | av网站在线观看播放 | 日日干精品 | 伊人久久国产精品 | 久久永久视频 | 久久国产午夜精品理论片最新版本 | 日韩三级视频在线观看 | 国产手机在线观看 | 国产精彩视频一区二区 | 四虎www. | 久久一二三四 | 久久99视频免费 | 黄色录像av| 国产精品黄色av | 亚州av一区 | 国产一区二区久久久久 | 国产韩国日本高清视频 | 成人高清在线 | 亚洲 在线 | 久久黄色网址 | 一级成人免费视频 | 麻豆av一区二区三区在线观看 | 久久99爱视频 | 亚洲三级网 | 91专区在线观看 | 国产精品s色 | 国产精品免费久久久久影院仙踪林 | 日韩乱色精品一区二区 | 国产黄色大片 | 日日干夜夜骑 | 亚洲午夜激情网 | 精品视频一区在线 | 欧美极品少妇xbxb性爽爽视频 | 九九欧美| 永久免费观看视频 | 国产一级黄 | 国产第一页福利影院 | 日韩精品中文字幕在线播放 | 国产精品毛片一区二区在线 | 午夜a区| 亚洲 欧美 日韩 综合 | 日韩午夜在线 | 色网站黄| a亚洲视频 | 成年人免费在线观看网站 | 婷婷激情影院 | 国产婷婷精品 | 99久久9 | 欧美午夜a | 成人91在线 | 久久久国产精品网站 | 日韩大片在线免费观看 | 狠狠干网| 黄污视频网站大全 | 99精品区| 亚洲国产中文字幕 | 99精品视频网 | 欧美影片 | 日韩精品中文字幕在线播放 | 亚洲成年人免费网站 | 在线观看中文字幕网站 | 国产又黄又爽又猛视频日本 | 国产美女视频黄a视频免费 久久综合九色欧美综合狠狠 | 午夜精品福利影院 | 九九热av| 97视频资源 | 天天色天天操综合网 | 91| 国产色影院 | 91成品人影院 | 天天综合网国产 | 久久草在线视频国产 | 一区二区亚洲精品 | 亚洲欧美成人综合 | 国产精久久久 | 日韩电影精品 | 久草免费资源 | 日韩精品视频在线免费观看 | 色网站黄| 免费的黄色av | 中文在线字幕免费观看 | 欧美日韩一级视频 | 最近更新的中文字幕 | 亚州欧美视频 | 久久久久成人精品免费播放动漫 | 久久免费视频网 | 99热精品视 | 婷婷丁香激情五月 | 女人18片毛片90分钟 | 韩国av免费在线观看 | 国产乱码精品一区二区蜜臀 | 欧美日本日韩aⅴ在线视频 插插插色综合 | 日韩在线观看电影 | 免费在线h | 91成人网在线播放 | 日韩视频中文字幕 | 亚州精品一二三区 | 亚洲精品麻豆视频 | 日本中文在线播放 | 久久免费视频网 | 日韩久久精品一区二区三区 | av不卡网站| 黄色影院在线观看 | 婷婷色在线资源 | 五月婷婷丁香综合 | av一区在线 | 色先锋资源网 | 香蕉网在线观看 | 成人综合婷婷国产精品久久免费 | 一区二区三区污 | 一区二精品 | 日本中文字幕电影在线免费观看 | 91chinesexxx| 欧美乱淫视频 | 婷婷五月情 | 久久超碰网 | 免费观看一区二区三区视频 | 日日操操| 成年人在线免费看片 | 黄色三级视频片 | 日韩免费一区二区三区 | 国产精品福利在线 | 色综合久久久久综合 | 91av蜜桃 | 最近日本韩国中文字幕 | 一级一级一片免费 | 亚洲视频大全 | 日本电影久久 | 国产老太婆免费交性大片 | 最新午夜电影 | 亚洲日本在线视频观看 | 九九视频免费在线观看 | 日韩欧美极品 | 美女久久 | 成年人看片 | 成人国产电影在线观看 | 99久久久成人国产精品 | av网站手机在线观看 | 久久久久久久99精品免费观看 | 在线观看免费成人av | 日韩理论电影在线 | 午夜精品久久久久久久99无限制 | 国产流白浆高潮在线观看 | free,性欧美 九九交易行官网 | 日韩久久片 | 久久av福利| 婷婷激情综合 | 欧美精品亚洲精品 | 91干干干 | 九草视频在线 | 亚洲理论在线 | 丁香五婷 | 欧美日韩在线看 | 国产精品久久久久久久久久免费看 | 久久综合一本 | 亚洲综合视频在线观看 | 久久精品视频在线看 | 欧美日韩国产精品一区二区三区 | 日韩欧美视频一区二区三区 | 国产成a人亚洲精v品在线观看 | 中文字幕电影一区 | 99在线观看视频网站 | 我要看黄色一级片 | 婷婷草| 国产日韩欧美在线观看视频 | 国产精品美女视频 | 国产日产精品一区二区三区四区的观看方式 | 亚洲精品女人久久久 | 美女视频黄是免费的 | 麻豆国产精品视频 | 国产在线观看你懂得 | 久久久久久综合网天天 | 色综合色综合色综合 | 国产精品日韩精品 | 国产高清永久免费 | 欧美成人精品欧美一级乱 | 免费看三级黄色片 | 2021av在线 | 国产精品毛片一区二区 | 亚州精品视频 | 亚洲性少妇性猛交wwww乱大交 | 午夜美女福利 | 久久国产美女视频 | av网站在线免费观看 | 狠狠综合网 | 久久久视屏 | 成人在线小视频 | 天天草av | 欧美另类xxx| 亚洲一区 av| 日本精品一区二区三区在线播放视频 | 日韩中文字幕在线 | 国产又粗又猛又色又黄视频 | 中文字幕久久亚洲 | 国产精久久久 | 夜色资源网 | 一区中文字幕 | 黄色特级片 | 一级理论片在线观看 | 激情欧美一区二区三区免费看 | 黄色av一区二区 | 九九九九热精品免费视频点播观看 | 日本乱码在线 | 91自拍视频在线 | 国产午夜精品免费一区二区三区视频 | 中文字幕av一区二区三区四区 | 91在线精品秘密一区二区 | 亚洲成人av片在线观看 | 婷婷六月天丁香 | 在线观看日本高清mv视频 | 国产精品综合在线观看 | 国产黄色特级片 | 亚洲高清久久久 | 欧美日韩国产在线精品 | 又黄又网站 | 99在线播放 | 少妇搡bbbb搡bbb搡aa | 欧美少妇18p | 综合网成人 | 久久超级碰视频 | 天天爽天天爽夜夜爽 | 日韩电影在线一区 | 在线中文字幕电影 | 在线欧美小视频 | 日本一区二区三区免费看 | 91精品国产综合久久福利 | av大全在线观看 | 中文字幕av最新更新 | 在线 日韩 av| 性色在线视频 | 亚洲涩涩网站 | 亚洲九九九在线观看 | 9992tv成人免费看片 | 玖玖精品在线 | av超碰在线 | 97精品一区二区三区 | 天天操天天射天天操 | 日韩 在线观看 | 99久久精品午夜一区二区小说 | 亚洲精品18日本一区app | 日韩在线播放视频 | 久久美女免费视频 | 精品视频在线免费观看 | 六月丁香激情综合 | 欧美国产一区在线 | 99在线精品视频观看 | 国产老熟| 97超碰免费在线观看 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 丁香婷婷色综合亚洲电影 | 国产高清av免费在线观看 | 骄小bbw搡bbbb揉bbbb| 国产在线观看你懂得 | 美女很黄免费网站 | 免费看黄视频 | 久久99久久99精品免费看小说 | 久久人人爽视频 | 日韩激情片在线观看 | 在线观看国产福利片 | 91看国产| 欧美久久影院 | 国产一及片 | 亚洲精品乱码久久久久久蜜桃欧美 | 国产精品岛国久久久久久久久红粉 | 国产精品美女久久久久久久 | 久久国产一区二区 | 欧美日韩一区二区视频在线观看 | 狠狠干,狠狠操 | 日韩一级成人av | 精品免费国产一区二区三区四区 | 日本久久不卡视频 | 国产成人精品一区二 | 狠狠88综合久久久久综合网 | 久热免费在线 | 色夜影院 | 最近最新最好看中文视频 | 成人在线黄色电影 | 国产视频精选 | 日韩精品第一区 | www.色五月.com | 日韩欧美xxxx | 国产资源在线观看 | 亚洲精品在线一区二区三区 | 日本精品免费看 | 久草在线手机视频 | 91女神的呻吟细腰翘臀美女 | 国产 一区二区三区 在线 | 久久精品国产免费看久久精品 | 青春草视频在线播放 | 欧美a级片免费看 | 最近最新中文字幕 | www.超碰 | 色婷婷综合久色 | 欧美久久久久久 | 超碰在97 | 深爱激情婷婷网 | 91精品视频观看 | 少妇bbbb搡bbbb桶 | 国内视频1区 | 国产亚洲欧美精品久久久久久 | 日韩影视大全 | 国产欧美精品在线观看 | 久久人人97超碰国产公开结果 | 特级毛片在线观看 | 99久久婷婷国产综合精品 | 欧美激情视频在线观看免费 | 免费看一及片 | 日韩在观看线 | 成人黄色在线 | 色久天| 97在线视| 成人va视频| www成人av| 国产亚洲视频在线免费观看 | 91天堂在线观看 | 一区免费观看 | 美女免费视频一区二区 | 久久成| 亚洲精品综合在线 | 亚洲一区二区视频在线播放 | 欧美一区二区三区四区夜夜大片 | 欧美日产在线观看 | 激情xxxx | 精品国产诱惑 | 综合在线亚洲 | 亚洲日本中文字幕在线观看 | 国产九九九九九 | 麻豆免费在线视频 | 久久字幕精品一区 | 欧美性色黄大片在线观看 | 国产婷婷视频在线 | 国产精品美女在线观看 | 天堂网av 在线 | 亚洲成人午夜在线 | 亚洲视频免费在线观看 | 亚洲综合小说 | 亚洲视频在线观看免费 | 欧美一区二区三区在线看 | 日韩一区二区三免费高清在线观看 | 亚洲成av人片在线观看 | 97人人超碰在线 | 娇妻呻吟一区二区三区 | 成人av教育 | 玖玖精品在线 | 91视频黄色 | 日韩精品一区在线观看 | 成人免费看黄 | 天天摸日日摸人人看 | 九色精品在线 | 黄色av免费 | 97视频免费在线看 | 国产在线传媒 | 九九国产精品视频 | 日韩高清精品一区二区 | 欧美一区二区在线刺激视频 | 成人91在线 | 国产99久久精品 | 首页中文字幕 | 日韩成人黄色av | 国产精品视频免费 | 成人免费视频网 | 在线视频一二区 | 91九色视频在线观看 | 91麻豆精品国产91久久久久 | 99超碰在线观看 | 久久伦理电影 | 亚洲天堂精品视频在线观看 | 国产精品免费大片视频 | 久久免费电影网 | 国产精品1区 | 色婷婷亚洲综合 | 亚洲国产中文字幕在线观看 | 五月激情综合婷婷 | 欧美一级电影在线观看 | 在线国产99 | 视频在线在亚洲 | 国产视频一区在线免费观看 | 欧美日韩在线观看一区二区 | 日韩高清在线一区二区 | 亚洲精品欧洲精品 | 精品欧美一区二区精品久久 | 美女黄频 | 91在线超碰 | 日韩久久久久久久久久久久 | 另类五月激情 | 久久久久久久久久久免费视频 | 99视频久久 | 国内精品福利视频 | 正在播放国产一区二区 | 亚洲欧美日韩在线一区二区 | 精品一二三四在线 | 99这里有精品 | 日韩欧美视频一区二区三区 | 久久亚洲区 | 国产精品一区二区吃奶在线观看 | 蜜臀91丨九色丨蝌蚪老版 | 视频 天天草 | 国产乱对白刺激视频在线观看女王 | 99精品偷拍视频一区二区三区 | 黄网在线免费观看 | 狠狠色狠狠色综合日日92 | 日韩精品电影在线播放 | a天堂一码二码专区 | 欧美a性 | 激情图片久久 | 成人一区二区三区在线观看 | 特级大胆西西4444www | 99热精品在线| 精品在线免费观看 | 特级毛片aaa | 91精品国自产在线观看欧美 | 日日干激情五月 | 黄污网站在线观看 | 香蕉视频免费在线播放 | 成人欧美一区二区三区黑人麻豆 | 国产资源网 | 色吧久久 | 青青啪| 色 免费观看 | 午夜精品久久久久久久久久久久久久 | 在线视频 一区二区 | 亚洲精品乱码久久久久久久久久 | av在线免费在线 | 伊人电影在线观看 | 亚洲国产成人在线播放 | 在线小视频你懂的 | 日本精a在线观看 | 三级a视频 | 久久久视屏 | 国产精品成人免费 | 色综合 久久精品 | 国产精品久久久久久久久久 | 天天操网址 | 免费在线播放av电影 | www.色婷婷 | 国产色久 | 国产欧美最新羞羞视频在线观看 | 久久成 | 久久99热这里只有精品 | 免费在线观看成人小视频 | 色综合久久88| 久草在线高清 | 一区二区视频播放 | 国产va饥渴难耐女保洁员在线观看 | 欧美超碰在线 | 91高清在线看 | 日本mv大片欧洲mv大片 | 欧洲亚洲精品 | 国产69精品久久99不卡的观看体验 | 丁香婷婷在线观看 | 综合国产在线观看 | 久久天天躁夜夜躁狠狠躁2022 | 国产男男gay做爰 | 日韩一区二区三区在线看 | 欧美国产日韩在线观看 | 国产高清一区二区 | 中文字幕第一页av | 日韩中文字幕电影 | 国产在线观看不卡 | 久久99精品久久久久婷婷 | 亚洲人成免费网站 | 国产日产精品久久久久快鸭 | 久草手机视频 | 视频91| 国产高清视频在线 | 日本中文字幕网 | 国产精品密入口果冻 | 嫩草av影院| 精品亚洲免费 | 欧美va天堂在线电影 | 午夜精品久久久99热福利 | 国产精品久久久久四虎 | 国产五月色婷婷六月丁香视频 | 狠狠干成人| 久久久伦理 | 91在线日本| 日韩大陆欧美高清视频区 | 久久精品欧美一区二区三区麻豆 | 日本在线观看中文字幕无线观看 | 久久久久国产精品厨房 | av超碰免费在线 | 国产色在线观看 | 国产精品久久嫩一区二区免费 | 肉色欧美久久久久久久免费看 | 久久99精品久久久久久 | 99在线免费视频观看 | 欧美成人猛片 | 国产高清在线看 | 亚洲欧美日韩国产一区二区三区 | 天天躁日日躁狠狠躁av中文 | 黄色影院在线播放 | 密桃av在线| 91精品国产91久久久久 | 日本最新一区二区三区 | 91成人免费看片 | 国产精品一区二区在线观看免费 | 黄色av电影 | 天堂资源在线观看视频 | 色婷婷成人 | 最近免费中文字幕 | 在线观看中文字幕网站 | 国产一级久久久 | 国产精品久久久久一区二区三区 | 91天天操 | 美女视频黄是免费的 | 国产美女黄网站免费 | 久久久久久久毛片 | 久久久91精品国产一区二区三区 | 少妇搡bbb| 亚洲伦理中文字幕 | 天天综合人人 | 日韩av高潮 | 中文字幕在线网址 | 国产高清在线观看av | 亚洲精品大全 | 日韩在线视频免费播放 | 国产精品综合在线观看 | 激情综合电影网 | 91亚·色| 午夜视频免费播放 | 国产免费国产 | 成人毛片在线观看 | 在线电影91| 亚洲国产免费网站 | 国产福利91精品 | 97精品国产97久久久久久久久久久久 | 精品免费观看视频 | 中文字幕日韩伦理 | 91探花国产综合在线精品 | 激情中文字幕 | 成人av网页 | 9999国产| 在线黄频 | 亚洲人视频在线 | 99精品影视 | 国产精品美女免费视频 | 日韩欧美一区二区三区在线 | 久草在线中文888 | 日韩电影在线观看中文字幕 | 91精品一区二区在线观看 | 在线免费视频 你懂得 | 91高清视频在线 | 国产人成精品一区二区三 | 亚洲精品玖玖玖av在线看 | 欧美日韩国产在线 | 黄色亚洲在线 | 黄色免费电影网站 | 美女网站视频色 | 亚洲高清av在线 | 久久论理 | www黄色com| 亚洲人成在线观看 | 91九色精品 | 91精品在线视频 | 五月婷婷中文网 | 狠狠干免费 | 精品国产片| 精品在线小视频 | 成人免费观看网址 | 激情网站网址 | 国产精品一区二区三区在线 | 亚洲在线色 | 国产亚洲精品美女久久 | 国产精品国产三级在线专区 | 国产在线不卡视频 | 日韩三级免费 | 国产日韩在线视频 | 国产污视频在线观看 | 99精品黄色 | 久久免费av | 免费美女av| 天天综合人人 | 日韩久久久久久久久久 | 免费福利视频网 | 免费在线观看av片 | 五月天电影免费在线观看一区 | 99精品在线免费观看 | 国产一区二区三区视频在线 | 欧美精品久久久久久久久久丰满 | 中文字幕一区二区三区久久蜜桃 | 国产成人三级一区二区在线观看一 | 麻豆视频观看 | 国产高清在线不卡 | 亚洲精品观看 | 国产精品theporn | 日本精品一区二区在线观看 | 亚洲午夜精品福利 | 在线观看成人 | 日韩在线免费高清视频 | 黄色在线看网站 | 九九热免费在线视频 | 成人免费一区二区三区在线观看 | 日日麻批40分钟视频免费观看 | 国产精品视频免费在线观看 | 午夜视频99 | 综合五月婷婷 | 美女精品网站 | 四虎国产视频 | 亚洲人成人天堂h久久 | 国产精品一区二区久久 | 天天操天天干天天操天天干 | 黄色av一区二区 | 人人澡人人草 | 成人国产精品免费 | 999久久久免费精品国产 | 涩涩成人在线 | 欧美在线视频免费 | 国产精品综合久久久久久 | 在线亚洲午夜片av大片 | 在线欧美a | 91大神一区二区三区 | 日本视频久久久 | 99 精品 在线 | 成人免费观看视频网站 | 亚洲天堂视频在线 | 亚洲一区二区三区四区精品 | 欧美一级日韩三级 | 最近中文字幕免费视频 | 国产精品久久久久一区 | 欧美日韩在线看 | 国产又粗又猛又爽 | 高清不卡一区二区在线 | 欧美亚洲精品在线观看 | 亚洲国产操 | 麻豆国产精品va在线观看不卡 | 国产美女视频一区 | av一级久久 | 久久国产欧美日韩精品 | av中文字幕电影 | 国产精品99久久免费黑人 | 中文字幕在线影视资源 | 日韩黄色在线电影 | 97av影院| 韩国av免费 | 国产精品久久久久久久久久东京 | 日韩亚洲在线观看 | 亚洲资源在线网 | 欧洲精品视频一区 | 91av福利视频 | 国产网站色 | 色婷婷色 | 天天色天天爱天天射综合 | 三级av在线免费观看 | 久久精品视频在线免费观看 | 亚洲春色奇米影视 | 五月香婷 | av亚洲产国偷v产偷v自拍小说 | 99久久久久久 | 色91在线视频 | 91成人天堂久久成人 | 91爱爱免费观看 | 视频精品一区二区三区 | 国产原创av在线 | 日韩精品中文字幕av | 日韩成人免费在线观看 | 亚洲日韩欧美视频 | 欧美日韩有码 | 91漂亮少妇露脸在线播放 | 六月婷婷网 | 最近中文字幕免费av | 国产资源在线播放 | 日韩欧美视频在线观看免费 | 麻豆激情电影 | 91高清免费看 | 不卡av电影在线观看 | 免费看91的网站 | 久久国产免费看 | 婷婷色综合网 | 丁香电影小说免费视频观看 | 99成人免费视频 | 国产福利91精品一区二区三区 | 精品一区二区免费在线观看 | 欧美aⅴ在线观看 | 免费a视频在线 | 五月婷av| 亚洲免费av电影 | 欧美国产三区 | 中文字幕频道 | 91精品夜夜 | 97色综合 | 黄色免费网站大全 | 婷婷激情小说网 | 狠狠狠色狠狠色综合 | 免费看黄色大全 | 婷婷久久一区二区三区 | 色综合久久久久久久 | 欧美一级大片在线观看 | 中文字幕日韩有码 | 五月婷婷在线观看视频 | 国语自产偷拍精品视频偷 | 国产原创在线 | 国产精品久久久久一区二区 | 天天综合网国产 | 国产91精品一区二区麻豆网站 | 久草久草视频 | 免费日韩一区二区 | 欧美一级大片在线观看 | 久草视频免费在线播放 | 免费在线观看一级片 | 国产在线观看你懂的 | 国内一区二区视频 | 夜夜躁日日躁狠狠躁 | 久久久精品 一区二区三区 国产99视频在线观看 | 中文在线字幕观看电影 | 午夜精品久久久久久久久久久久久久 | 亚洲天堂网视频 | 国产美女精品人人做人人爽 | 精品国偷自产在线 | 成人一区二区在线 | 高清av免费看 | 日韩精品一区二区三区免费观看 | 免费在线观看一级片 | 色偷偷中文字幕 | 成年人免费电影在线观看 | 国产在线观看av | 天天色天天干天天色 | 亚洲一区美女视频在线观看免费 | 日韩精品高清视频 | 三级av免费看 | 天天躁日日躁狠狠躁av麻豆 | 精品国产色 | 香蕉视频在线视频 | 天天操夜操 | 九七人人干 | 五月婷婷影院 | 三级黄色免费片 | 亚洲成av人片在线观看www | 欧美一级视频在线观看 | 亚洲精品玖玖玖av在线看 | 人人看97| 亚洲手机天堂 | 黄色av一区二区三区 | 国产精品99蜜臀久久不卡二区 | av免费在线网 | 特级西西444www大胆高清无视频 | 91麻豆精品国产91久久久更新时间 | 精品免费一区二区三区 | 国产精品免费视频久久久 | 久久视频免费观看 | 91久久精品一区 | 久草在线看片 | 玖玖在线播放 | 婷婷激情5月天 | 国产福利在线免费观看 | 激情五月婷婷激情 | 日韩免费看视频 | 日韩av片无码一区二区不卡电影 | av在线网站大全 | 色狠狠婷婷 | 久久精品国产久精国产 | 国精产品一二三线999 | 操操操人人人 | 伊人五月天综合 | 丁香婷婷综合激情五月色 | 五月婷婷在线综合 | h视频在线看 | 992tv在线成人免费观看 | 久久国产亚洲精品 | 99免费看片 | 欧美久久99 | av资源在线看 | 99在线观看视频网站 | 日本久久久亚洲精品 | 在线a亚洲视频播放在线观看 | 91最新中文字幕 | 国产一级淫片在线观看 | 最新av中文字幕 | 午夜精品福利在线 | 国产精品理论片在线播放 | 国产视频午夜 | 国产亚洲精品无 | 福利视频一区二区 | 2019av在线视频 | 久久久久一区二区三区四区 | 天天草天天干天天射 | 亚洲高清视频在线观看 | 精品久久久久久久久久久久 | 91av视频在线免费观看 | 婷婷性综合 | 亚洲精品国产精品国自产在线 | 涩涩伊人 | 天天干天天草 | 久久精品电影 | 天天干,夜夜爽 | 国产精品自在欧美一区 | 免费观看日韩av | 黄色网址国产 | 国产免码va在线观看免费 | 久久国产精品免费一区二区三区 | 久久久精品电影 | 色91av | 婷婷久久久 | 91成人精品一区在线播放 | 在线观看亚洲免费视频 | 日韩乱理 | 久久久黄色av | 日日夜夜干| 丁香综合av | 久久免费视频在线观看 | 午夜成人免费影院 | 欧美一级免费在线 | 久久综合精品国产一区二区三区 | 久久免费福利 | 99精品热视频 | 日韩理论片在线观看 | 中文字幕电影一区 | 人人超碰97| 久操操| 国产小视频网站 | 亚洲欧美国产日韩在线观看 | a在线播放 | 在线播放一区二区三区 | 在线观看的av | 国产黄色在线观看 | 欧美伦理电影一区二区 | 国产欧美高清 | 欧美狠狠色 | 中文字幕精品一区二区三区电影 | 久久人人97超碰国产公开结果 | 91精品国产91久久久久福利 | 成年人黄色免费网站 | 五月花婷婷 | 久草在| 81国产精品久久久久久久久久 | 欧美激情视频在线免费观看 | 一本一道久久a久久综合蜜桃 | 狠狠插狠狠操 | 国产精品一区二区三区在线 | 久久久久久久久久久高潮一区二区 | 9999激情 | 亚洲精品中文字幕在线观看 | 色在线网| 欧美一级免费黄色片 | 亚洲精品mv在线观看 | 欧美国产不卡 | 免费在线h| 国产最新视频在线 | 亚洲精品美女在线 | 91九色国产视频 | 国产精品1024 | 国模精品一区二区三区 | 91精品老司机久久一区啪 | 一区二区三区免费在线观看视频 | 黄色免费大片 | 天天射天天干天天爽 | 69久久99精品久久久久婷婷 | 免费在线播放黄色 | 成人黄色电影视频 | 欧美日韩久久一区 | 一本一道波多野毛片中文在线 | 久久人人爽人人片av | 色中文字幕在线观看 | 黄色软件大全网站 | 伊人一级 | 丝袜制服天堂 | 狠狠狠综合 | 亚洲一二三区精品 | 久久国内视频 | 日本精品视频在线 | 九九精品毛片 | 国产精品视频线看 | 天天综合网 天天综合色 | 亚洲va天堂va欧美ⅴa在线 | 夜夜躁日日躁 | 日韩在线观看影院 | 免费看三级网站 | 激情伊人五月天 | 久久婷婷亚洲 | 日韩精品中文字幕在线不卡尤物 | 午夜精品麻豆 | 国产精品免费一区二区三区在线观看 | 在线观看日韩国产 | av片子在线观看 | 五月在线 | 中文字幕在线看视频国产 | 国产亚洲精品久久久久久无几年桃 | 国内精品久久久久国产 | 精品影院| 天堂av在线7| 欧美一级视频一区 | 国产精品久久99综合免费观看尤物 | 国产精品资源在线 | 精品一二三四五区 | 日韩免费电影网 | 国产精品一区二区在线免费观看 | 日韩精品中文字幕有码 | 天天天天干 | www.黄色片网站 | av一区二区三区在线观看 | 国产成人久久77777精品 | 在线亚洲高清视频 | 国产中文字幕一区二区三区 | 欧美一二三四在线 | 九九视频免费观看视频精品 | 天天天天色射综合 | 亚洲视频高清 | 国产无遮挡又黄又爽在线观看 | 欧美在线日韩在线 | 国产精品女同一区二区三区久久夜 | 婷婷在线精品视频 | 国产精品丝袜 | 欧美性极品xxxx娇小 | 99自拍视频在线观看 | 99久久国产免费,99久久国产免费大片 | www激情网 | 天天躁天天操 | 一区二区精品在线视频 | 国产私拍在线 | 中文字幕在线免费播放 | 亚洲精品乱码久久久久久9色 | 久久99在线 | 国产破处在线播放 | 日韩区在线观看 | 成人免费观看电影 | 中文字幕精品视频 | 欧美日韩aa | 日本精品视频在线观看 | 亚洲成人av片 | 日狠狠 | 在线一区电影 | 精品国产伦一区二区三区观看方式 | 麻豆视频在线看 | 亚洲精品人人 | 欧美精品乱码久久久久久按摩 | 香蕉视频久久久 | 人人精品久久 | 亚洲精品乱码久久久久久高潮 | 日韩免费成人 | 国产一级性生活视频 | 美女在线观看网站 | 久久久久综合精品福利啪啪 | 国产91aaa| 在线视频一区观看 | 高清av在线免费观看 | 福利片视频区 | 高潮久久久 | 久久精品中文字幕免费mv | 欧美一区二视频在线免费观看 | 久久久久久久久免费视频 | 亚洲精品乱码久久久久久写真 | 久久这里只有精品久久 | 五月婷婷色综合 | 久久久久久久久久久久亚洲 | 精品亚洲视频在线 | 91av片| 免费一级特黄毛大片 | 亚洲色综合 | 91精品国产99久久久久久红楼 | 精品国产乱码久久久久久三级人 | 日韩剧 | 日韩av线观看 | 9999亚洲 | 国产精品久久久久毛片大屁完整版 | 亚洲高清在线 | 久久久久久久电影 | 中文字幕国产一区二区 | 婷婷六月中文字幕 | 综合久久网站 | 日韩极品视频在线观看 | 婷婷久久丁香 | 天天干天天草 | 精品国产欧美 | 欧美日韩精品电影 | 久久国产片 | 久日精品 | 国产精品一区二区在线 | 69久久久久久久 | 久在线观看视频 | 成人av网页 | 亚洲,播放 | 97成人在线 | 久草在线官网 |