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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

一本彻底搞懂MySQL索引优化EXPLAIN百科全书

發(fā)布時間:2025/3/21 数据库 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一本彻底搞懂MySQL索引优化EXPLAIN百科全书 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

MySQL邏輯架構介紹

日常在CURD的過程中,都避免不了跟數(shù)據(jù)庫打交道,大多數(shù)業(yè)務都離不開數(shù)據(jù)庫表的設計和SQL的編寫,那如何讓你編寫的SQL語句性能更優(yōu)呢?

先來整體看下MySQL邏輯架構圖:

MySQL整體邏輯架構圖可以分為Server和存儲引擎層。

Server層:

Server層涵蓋了MySQL的大多數(shù)核心服務功能,以及所有的內(nèi)置函數(shù)(如日期、時間、數(shù)學和加密函數(shù)等),以及存儲過程、觸發(fā)器、視圖等跨存儲引擎的實現(xiàn)也在這一層來實現(xiàn)。

  • 連接器:負責跟客戶端建立連接、獲取權限、維持和管理連接。

  • 分析器:SQL詞法分析,SQL語法分析

  • 優(yōu)化器:索引選擇,選擇一個執(zhí)行效率高的,生成執(zhí)行計劃

  • 執(zhí)行器:操作引擎,返回執(zhí)行結(jié)果

  • ...

  • 查詢緩存:執(zhí)行SQL語句之前,先查緩存,緩存結(jié)果可能是以key-value對方式存儲的,key 是查詢的語句,value 是查詢的結(jié)果。

存儲引擎層:

負責數(shù)據(jù)的存儲和提取,是一種插件式的架構方式。支持 InnoDB、MyISAM、Memory 等多個存儲引擎。MySQL 5.5.5版本開始默認存儲引擎是 InnoDB,也是目前常用的存儲引擎。

今天我們來看下詳細看下優(yōu)化器里的執(zhí)行計劃如何分析,要分析一個 SQL 的執(zhí)行效率,就要會看執(zhí)行計劃,根據(jù)執(zhí)行計劃優(yōu)化 SQL,使其能達到高效查詢的目的。

一條查詢語句需要經(jīng)過 MySQL 查詢優(yōu)化器的各種基于成本和規(guī)則,優(yōu)化后會生成一個所謂的執(zhí)行計劃。

那么這個執(zhí)行計劃主要展示具體執(zhí)行查詢的方式,比如多表連接的順序是多少,表里包含多個索引,每個表采用什么訪問方法來具體執(zhí)行查詢等。

而設計 MySQL 的大佬是非常貼心的,知道開發(fā)的朋友們都是親自寫 SQL 的,但是寫出 SQL 容易,想寫出性能高的 SQL 可不簡單。

所以,大佬提供了?Explain?語句來幫我們查詢某個查詢語句的具體執(zhí)行計劃。

SQL 執(zhí)行計劃解析

本文帶大家看懂?EXPLAIN?語句,必須要熟悉各項輸出是做什么的,從而有針對性的提升SQL 查詢語句的性能。

列名用途
id每一個SELECT關鍵字查詢語句都對應一個唯一id
select_typeSELECT關鍵字對應的查詢類型
table表名
partitions匹配的分區(qū)信息
type單表的訪問方法
possible_keys可能用到的索引
key實際使用到的索引
key_len實際使用到的索引長度
ref當使用索引列等值查詢時,與索引列進行等值匹配的對象信息
rows預估需要讀取的記錄條數(shù)
filtered某個表經(jīng)過條件過濾后剩余的記錄條數(shù)百分比
Extra額外的一些信息

為了方便解釋上面的執(zhí)行計劃各項輸出的含義,下面創(chuàng)建三張數(shù)據(jù)庫表。

數(shù)據(jù)庫創(chuàng)建三張表

DROP TABLE IF EXISTS user; CREATE TABLE `user` (`id` int(11) NOT NULL,`name` varchar(45) DEFAULT NULL,`update_time` datetime DEFAULT NULL,PRIMARY KEY (`id`),KEY `idx_name` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;INSERT INTO user (`id`, `name`, `update_time`)VALUES (1,'a','2017-12-22 15:27:18'), (2,'b','2017-12-22 15:27:18'), (3,'c','2017-12-22 15:27:18');DROP TABLE IF EXISTS `group`; CREATE TABLE `group` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(10) DEFAULT NULL,PRIMARY KEY (`id`),KEY `idx_name` (`name`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;INSERT INTO `group` (`id`, `name`) VALUES (1,'group1'),(2,'group2'),(3,'group3');DROP TABLE IF EXISTS user_group; CREATE TABLE `user_group` (`id` int(11) NOT NULL,`user_id` int(11) NOT NULL,`group_id` int(11) NOT NULL,`remark` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`),KEY `idx_user_id` (`user_id`),KEY `idx_group_id` (`group_id`),KEY `idx_user_group_id` (`user_id`,`group_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;INSERT INTO user_group (`id`, `user_id`, `group_id`, `remark`)VALUES (1,1,1,'bak1'), (2,2,2,'bak2'), (3,3,3,'bak3');

EXPLAIN 輸出計劃參數(shù)詳解

下載了最新的 MySQL8.0+ 版本,直接執(zhí)行?EXPLAIN?,對比了 MySQL 5.0+ 版本執(zhí)行的?EXPLAIN EXTENDED?命令同樣都提供了一些查詢優(yōu)化的信息。除了執(zhí)行計劃各項輸出參數(shù)外,額外還有?filtered?列,是一個百分比的值,rows * filtered/100?可以估算出將要和?EXPLAIN?中前一個表進行連接的行數(shù) 。

如下所示:

EXPLAIN?中的列 接下來我們將詳細說明下?EXPLAIN?執(zhí)行結(jié)果每一列的信息。

1、id 列

設計表時通常會設計 id,一般會作為主鍵,執(zhí)行計劃的結(jié)果也不例外,也有 id 列,id?列編號是?SELECT?的序列號,并且 id 的順序是按?SELECT?出現(xiàn)的順序增長的。id列越大執(zhí)行優(yōu)先級越高,id 相同則從上往下執(zhí)行,id 為 NULL 最后執(zhí)行。

?

MySQL將?SELECT?查詢分為簡單查詢?SIMPLE?和復雜查詢?PRIMARY。

復雜查詢包括:簡單子查詢、派生表(?FROM?語句中的子查詢)、UNION?和?UNION ALL?查詢。

簡單查詢:

復雜查詢:

1)簡單子查詢

EXPLAIN SELECT (SELECT 1 from user LIMIT 1) from?user;

2)FROM?子句中的子查詢

EXPLAIN SELECT?FROM (SELECT id, count() as c from?group?GROUP BY name) as derived

這個查詢執(zhí)行時有個臨時表別名為?derived,外部?SELECT?查詢引用了這個臨時表

3)UNION?和?UNION ALL?查詢

EXPLAIN SELECT?FROM user UNION SELECT?FROM user;

UNION?結(jié)果總是放在一個匿名臨時表中,臨時表不在 SQL 中出現(xiàn),臨時表名為?<union1, 2>,因此它的?id?是?NULL,表明這個臨時表是為了合并兩個查詢結(jié)果集而創(chuàng)建的。

跟?UNION?對比,UNION ALL?無需為最終結(jié)果而去重,僅是單純的將多個查詢結(jié)果集中的記錄合并成一個并返回給用戶,所以不會使用到臨時表,故沒有?id?為?NULL?記錄。如下所示:

EXPLAIN SELECT?FROM user UNION ALL SELECT?FROM user;

注意點:子查詢優(yōu)化為連接查詢

查詢優(yōu)化器可能對子查詢進行重寫,進而轉(zhuǎn)換為連接查詢,查詢計劃中的兩個id值是相同的,如下所示:

EXPLAIN SELECT * FROM user WHERE id IN (SELECT user_id FROM?user_group);

2、select_type 列

MySQL中優(yōu)化器中的概念:

物化:

子查詢語句中的子查詢結(jié)果集中的記錄保存到臨時表的過程稱之為?物化(英文名:Materialize),簡單理解為存儲子查詢結(jié)果集的臨時表稱之為?物化表。

也正因為物化表的記錄都建立了索引(基于內(nèi)存的物化表有哈希索引,基于磁盤的有B+樹索引),因此通過?IN?語句判斷某個操作數(shù)在不在子查詢的結(jié)果集中變得很快,從而提升語句的性能。

半連接 semi-join:

也是跟?IN?語句子查詢有關。

通用語句:

SELECT ... FROM outer_tablesWHERE expr IN (SELECT ... FROM inner_tables ...) AND ...

outer_tables?表對?inner_tables?半連接的意思:

對于outer_tables的某條記錄來說,我們僅關心在inner_tables表中是否存在匹配的記錄,而不用關心具體有多少條記錄與之匹配,最終結(jié)果只保留 outer_tables 表的記錄。

每一個?SELECT?關鍵字的查詢都定義了一個?select_type?屬性,知道這個查詢屬性就能知道在整個查詢語句中所扮演的角色。

1)SIMPLE:簡單查詢。查詢不包含子查詢 和?UNION。

2)PRIMARY:復雜查詢中最外層的SELECT,可參照上面的?UNION?查詢語句。

3)SUBQUERY:包含的子查詢語句無法轉(zhuǎn)換為?semi-join,并且為不相關子查詢,查詢優(yōu)化器采用物化方案執(zhí)行該子查詢,該子查詢的第一個?SELECT?就會?SUBQUERY。該查詢由于被物化,只需要執(zhí)行一次。

4)DERIVED:對于采用物化形式執(zhí)行的包含派生表的查詢,該派生表的對應的子查詢?yōu)?DERIVED。

查詢語句如下所示:

EXPLAIN SELECT * FROM (SELECT id, count(*) as c FROM user GROUP BY id) AS derived_u where c>1;

5)UNION:在?UNION?查詢語句中的第二個和緊隨其后的?SELECT。

6)UNION RESULT:MySQL選擇使用臨時表完成?UNION?查詢的去重工作。

當?select_type?為這個值時,經(jīng)常可以看到table的值是?<unionN,M>,這說明匹配的 id 行 是這個集合的一部分。請看上面?UNION?查詢示例。

7)MATERIALIZED:當查詢優(yōu)化器執(zhí)行包含子查詢的語句時,選擇將子查詢物化之后與外層查詢進行連接查詢時,該子查詢類型為?MATERIALIZED。

8)DEPENDENT SUBQUERY:包含的子查詢語句無法轉(zhuǎn)換為?semi-join,并且為相關子查詢,則該子查詢的第一個?SELECT?就會?DEPENDENT SUBQUERY。該查詢可能會被執(zhí)行多次。

8)DEPENDENT UNION:包含的子查詢語句中包含了?UNION?或者?UNION ALL?的大查詢,這些查詢都依賴外層查詢,這些子查詢語句類型為?DEPENDENT UNION。

EXPLAIN SELECT * FROM user WHERE id IN (SELECT user_id FROM user_group WHERE name = 'a' UNION SELECT id FROM user WHERE name = 'b');

上面這個子查詢語句中的?SELECT user_id FROM user_group WHERE name = 'a'?這個小查詢是第一個子查詢,所以它的?select_type?為?DEPENDENT SUBQUERY,而?SELECT id FROM user WHERE name = 'b'?這個查詢在?UNION?后面,所以它的?select_type?為?DEPENDENT UNION。

最常見的值包括:SIMPLE?、PRIMARY、DERIVED、UNION。

3、table 列

table?列表示?EXPLAIN?的單獨行的唯一標識符。這個值可能是表名、表的別名或者一個未查詢產(chǎn)生臨時表的標識符,如派生表、子查詢或集合。

當?FROM?子句中有子查詢時,如果優(yōu)化器采用的物化方式,table 列是?<derivenN>?格式,表示當前查詢依賴?id=N?的查詢,于是先執(zhí)行?id=N?的查詢。

當使用?UNION?查詢時,UNION RESULT?的 table 列的值為?<UNION1,2>,1和2表示參與?UNION?的 SELECT 的行 id。

4、type 列

這一列表示關聯(lián)類型或訪問類型,即MySQL決定如何查找表中的行,查找數(shù)據(jù)行記錄的大概范圍。依次從最優(yōu)到最差分別為:system > const > eq_ref > ref > range > index > ALL 一般來說,得保證查詢達到range級別,最好達到ref NULL:mysql能夠在優(yōu)化階段分解查詢語句,在執(zhí)行階段用不著再訪問表或索引。例如:在索引列中選取最小值,可以單獨查找索引來完成,不需要在執(zhí)行時訪問表 mysql> explain select min(id) from user;

1)system,const:MySQL 能對查詢的某部分進行優(yōu)化并將其轉(zhuǎn)化成一個常量。用于主鍵或唯一二級索引列與常數(shù)比較時,所以表最多有一個匹配行,讀取1次,速度比較快。system是?const?的特例,表里只有一條記錄匹配時為?system。

EXPLAIN SELECT?FROM (SELECT?FROM user where id = 1) tmp;

2)eq_ref:在連接查詢時,如果被驅(qū)動表是通過主鍵或者唯一二級索引列等值匹配的方式進行訪問的,則對該被驅(qū)動表的訪問方法就是?eq_ref。這可能是在 const 之外最好的聯(lián)接類型了。

EXPLAIN SELECT * FROM user_group INNER JOIN user ON user_group.user_id = user.id;

3)ref:相比 eq_ref,不使用唯一索引,而是使用普通索引或者唯一性索引的部分前綴,索引要和某個值相比較,可能會找到多個符合條件的行。

a. 簡單?SELECT?查詢,name 是普通索引(非唯一索引)。

EXPLAIN SELECT * FROM user where user.name = 'a';

b.?關聯(lián)表查詢,idx_user_group_id (user_id,group_id)?為聯(lián)合索引,這里使用到了user_group聯(lián)合索引最左邊前綴 user_id。

EXPLAIN SELECT user_id FROM user LEFT JOIN user_group ON user.id = user_group.user_id;

4)ref_or_null:對普通二級索引進行等值查詢,該索引列也可以為NULL值時。

EXPLAIN SELECT * FROM user where user.name = 'a' OR name IS NULL;

5)index_merge:MySQL使用索引合并的方式執(zhí)行的。

EXPLAIN SELECT * FROM user WHERE user.name = 'a' OR user.id = 1;

6)range:使用索引獲取范圍區(qū)間的記錄,通常出現(xiàn)在?in, between ,> ,<, >=?等操作中。

EXPLAIN SELECT * FROM user WHERE user.id > 1;

7)index:掃描全表索引,這通常比ALL快一些。(index是從索引中讀取的,而?ALL?是從硬盤中讀取)

group?表里的兩個字段都有索引。

EXPLAIN SELECT * FROM?group;

8)ALL:即全表掃描,MySQL 需要從頭到尾去查找表中所需要的行。通常情況下這需要增加索引來進行優(yōu)化了。

EXPLAIN SELECT * FROM?user;

5、possible_keys 列

possible_keys?列表示查詢可能使用哪些索引來查找。

EXPLAIN?執(zhí)行計劃結(jié)果可能出現(xiàn)?possible_keys?列,而?key?顯示?NULL?的情況,這種情況是因為表中數(shù)據(jù)不多,MySQL 會認為索引對此查詢幫助不大,選擇了全表查詢。

如果?possible_keys?列為?NULL,則沒有相關的索引。在這種情況下,可以通過檢查?WHERE?子句去分析下,看看是否可以創(chuàng)造一個適當?shù)乃饕齺硖岣卟樵冃阅?#xff0c;然后用?EXPLAIN?查看效果。

另外注意:不是這一列的值越多越好,使用索引過多,查詢優(yōu)化器計算時查詢成本高,所以如果可能的話,盡量刪除那些不用的索引。

6、key 列

key?列表示實際采用哪個索引來優(yōu)化對該表的訪問。

如果沒有使用索引,則該列是 NULL。如果想強制 MySQL使用或忽視?possible_keys?列中的索引,在查詢中使用?force index、ignore index。

7、key_len 列

key_len?列表示當查詢優(yōu)化器決定使用某一個索引查詢時,該索引記錄的最大長度。

key_len?列計算規(guī)則如下:

  • 字符串

char(n):n字節(jié)長度

varchar(n):2字節(jié)存儲字符串長度,如果是utf-8,則長度 3n + 2

注意:該索引列可以存儲NULL值,則key_len比不可以存儲NULL值時多1個字節(jié)。

比如:varchar(50),則實際占用的key_len長度是 3 * 50 + 2 = 152,如果該列允許存儲NULL,則key_len長度是153。

  • 數(shù)值類型

tinyint:1字節(jié) smallint:2字節(jié) int:4字節(jié) bigint:8字節(jié) 

  • 時間類型

date:3字節(jié) timestamp:4字節(jié) datetime:8字節(jié)

索引最大長度是768字節(jié),當字符串過長時,MySQL 會做一個類似左前綴索引的處理,將前半部分的字符提取出來做索引。

舉例1:

user_group表中的聯(lián)合索引?idx_user_group_id?由?user_id?和?group_id?兩個int 列組成,并且每個 int 是 4 字節(jié)。

EXPLAIN SELECT * FROM user_group WHERE user_id = 2;

通過結(jié)果中的 key_len=4可推斷出查詢使用了第一個列:user_id?列來執(zhí)行索引查找。

舉例2:

再看?user?表 name 字段是 varchar(45) 變長字符串類型,key_len為138 等于?45 * 3 + 2 (變長字節(jié)) + 1字節(jié)(允許存儲NULL值)

EXPLAIN SELECT * FROM user WHERE name = 'a';

所以,以后再看到?key_len?字段的值,不要在懵逼咯,固定套路~

8、ref 列

ref?列顯示了在?key?列記錄的索引中,表查找值所用到的列或常量,常見的有:const(常量),字段名(例:user.id)。

9、rows 列

rows?列是查詢優(yōu)化器估計要讀取并檢測的行數(shù),注意這個不是結(jié)果集里的行數(shù)。

如果查詢優(yōu)化器使用全表掃描查詢,rows?列代表預計的需要掃碼的行數(shù);如果查詢優(yōu)化器使用索引執(zhí)行查詢,rows?列代表預計掃描的索引記錄行數(shù)。

10、filtered 列

對于單表來說意義不大,主要用于連接查詢中。

前文中也已提到?filtered?列,是一個百分比的值,對于連接查詢來說,主要看驅(qū)動表的?filtered列的值 ,通過?rows * filtered/100?計算可以估算出被驅(qū)動表還需要執(zhí)行的查詢次數(shù)。

EXPLAIN SELECT * FROM user INNER JOIN user_group ON user.id = user_group.user_id WHERE user.update_time = '2019-01-01';

可以看到驅(qū)動表user執(zhí)行的rows列為3行,filtered列為 33.33,計算驅(qū)動表的扇出值為 3 * 33.33% 約等于1,說明還需要對被驅(qū)動表執(zhí)行大約1次查詢。

11、Extra 列

Extra?列提供了一些額外信息。這一列在 MySQL中提供的信息有幾十個,這里僅列舉一些常見的重要值如下:

1)Using index:查詢的列被索引覆蓋,并且?WHERE?篩選條件是索引的前導列,使用了索引性能高。一般是使用了覆蓋索引(查詢列都是索引列字段)。對于 INNODB 存儲引擎來說,如果是輔助索引性能會有不少提高,并且也不需要回表查詢。

2)Using where Using index:查詢的列被索引覆蓋,并且?WHERE?篩選條件是索引列之一,但并不是索引的前導列,意味著無法直接通過索引查找來查詢到符合條件的數(shù)據(jù)。

3)NULL:查詢的列未被索引覆蓋,并且?WHERE?篩選條件是索引的前導列,意味著用到了索引,但是部分字段未被索引覆蓋,必須通過?回表?來查詢,不是純粹地用到了索引,也不是完全沒用到索引。

4)Using index condition:與Using where類似,查詢的列不完全被索引覆蓋,WHERE?條件中是一個前導列的范圍。

5)Using temporary:MySQL 中需要創(chuàng)建一張內(nèi)部臨時表來處理查詢,一般出現(xiàn)這種情況就需要考慮進行優(yōu)化了,首先是想到用索引來優(yōu)化。

通常在許多執(zhí)行包括DISTINCT、GROUP BY、ORDER BY等子句查詢過程中,如果不能有效利用索引來完成查詢,MySQL很有可能會尋求建立內(nèi)部臨時表來執(zhí)行查詢。

所以,執(zhí)行計劃中出現(xiàn)了?Using temporary?并不是個好兆頭,因為建立與維護臨時表要付出很大的成本的,要考慮使用索引來優(yōu)化改進。

6)Using filesort:MySQL 會對結(jié)果使用一個外部索引排序,而不是按索引次序從表里讀取行。此時 MySQL 會根據(jù)聯(lián)接類型瀏覽所有符合條件的記錄,并保存排序關鍵字和行指針,然后排序關鍵字并按順序檢索行信息。這種情況下一般也是要考慮使用索引來優(yōu)化的。

查詢中需要使用?filesort?的方式進行排序的記錄非常多,那么這個過長是很耗時的,想辦法將使用?文件排序?的執(zhí)行方式改進為使用索引進行排序。

7)Index merges:通常顯示為Using sort_union(...)?說明準備用?Sort-Union?索引合并方式來查詢;顯示為?Using union(...),說明準備用Union索引合并方式查詢;顯示為Using intersect(...),說明準備使用Intersect索引合并方式查詢。

8)LooseScan:在 IN 子查詢轉(zhuǎn)為?semi-join?時,如果采用的是?LooseScan?執(zhí)行策略,則會在Extra中提示。

9)FirstMatch(tbl_name):在 IN 子查詢轉(zhuǎn)為?semi-join?時,如果采用的是?FirstMatch?執(zhí)行策略,則會在Extra中提示。

10)Using join buffer:強調(diào)了在獲取連接條件時沒有使用索引,并且需要連接緩沖區(qū)來存儲中間結(jié)果。出現(xiàn)該值,應該注意,根據(jù)查詢的具體情況可能需要添加索引來改進性能。

我們所提到的回表操作 ,其實是一種隨機IO,比較耗時,所以盡量避免上面提到的回表操作,當發(fā)現(xiàn)Extra提示為?Using filesort、Using temporary?時就需要格外注意了,考慮索引優(yōu)化。

最佳姿勢索引實踐

新建?staff?表表演使用

# 重建 `staff` 表 DROP TABLE `staff`; CREATE TABLE `staff` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(24) NOT NULL DEFAULT '' COMMENT '姓名',`s_name` VARCHAR(24) NOT NULL DEFAULT '' COMMENT '花名',`s_no` INT(4) NOT NULL DEFAULT 0 COMMENT '工號',`work_age` int(11) NOT NULL DEFAULT '0' COMMENT '工齡',`position` varchar(20) NOT NULL DEFAULT '' COMMENT '職位',`arrival_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '入職時間',`remark` VARCHAR(500) DEFAULT NULL COMMENT '備注', # 允許 NULLPRIMARY KEY (`id`), # 主鍵UNIQUE KEY idx_s_name (s_name), # 唯一索引KEY idx_s_no (s_no), # 普通索引KEY `idx_name_age_position` (`name`,`work_age`,`position`) USING BTREE # 聯(lián)合索引 ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='員工記錄表'; # 初始化 `staff` 表數(shù)據(jù) INSERT INTO staff(name,s_name,s_no,work_age,position,arrival_time) VALUES('zhangsan','zs',10,2,'manager',NOW()); INSERT INTO staff(name,s_name,s_no,work_age,position,arrival_time) VALUES('lisi','ls',11,3,'dev',NOW()); INSERT INTO staff(name,s_name,s_no,work_age,position,arrival_time) VALUES('wangwu','ww',12,8,'dev',NOW()); INSERT INTO staff(name,s_name,s_no,work_age,position,arrival_time) VALUES('zhangliu','zl',110,5,'dev',NOW()); INSERT INTO staff(name,s_name,s_no,work_age,position,arrival_time) VALUES('xiaosun','xs',111,5,'dev',NOW()); INSERT INTO staff(name,s_name,s_no,work_age,position,arrival_time) VALUES('donggua','dg',200,3,'dev',NOW());

數(shù)據(jù)庫索引最佳實踐

1、全值匹配:

EXPLAIN SELECT * FROM staff WHERE name= 'zhangsan';

EXPLAIN SELECT * FROM staff WHERE name= 'zhangsan' AND work_age = 2;

EXPLAIN SELECT * FROM staff where name = 'zhangsan' AND work_age = 2 AND position = 'dev';

EXPLAIN SELECT * FROM staff where position = 'dev' AND name = 'zhangsan' AND work_age = 2;

最后一條,我們將?position?放到了?WHERE?條件后面,盡管沒有按照聯(lián)合索引的順序編寫條件,MySQL 優(yōu)化器會自動優(yōu)化,將 name 排到最前面去,所以還是會正確使用聯(lián)合索引的。

聯(lián)合索引創(chuàng)建后,你必須嚴格按照最左前綴的原理進行使用,否則會無法使用到索引。盡量按照這個順序去寫,這樣避免 MySQL 優(yōu)化器再次優(yōu)化了。

2、最佳左前綴法則:

?

如果索引了多列,要遵守最左前綴法則。指的是查詢從索引的最左前列開始并且不跳過索引中的列。

以下 SQL 符合最左前綴匹配法則:

EXPLAIN SELECT * FROM staff WHERE name = 'zhangsan' AND work_age = 3 AND position = 'manager';

EXPLAIN SELECT * FROM staff WHERE name = 'zhangsan' AND position = 'manager';

以下執(zhí)行都是全表掃描,type?為?ALL,都不符合最左前綴法則:

EXPLAIN SELECT * FROM staff WHERE work_age = 2 AND position ='dev';

EXPLAIN SELECT * FROM staff WHERE position = 'dev';

3、索引列上避免做計算操作

?

索引上盡量避免做函數(shù)計算等操作,會導致索引失效而轉(zhuǎn)向全表掃描。

WHERE?條件后面索引列使用函數(shù):

EXPLAIN SELECT?FROM staff WHERE LEFT(name, 5) = 'zhang'; EXPLAIN SELECT?FROM staff WHERE LOWER(name) = 'zhangsan';

EXPLAIN SELECT?FROM staff WHERE staff.s_no?2 > 3;

查詢的結(jié)果 type 列為?ALL,key 是空的,索引失效,全表掃描。

計算邏輯盡量放到業(yè)務層去處理,最大限度的命中索引,同時還能節(jié)省數(shù)據(jù)庫資源開銷。

4、范圍條件右邊的列無法使用索引

?

EXPLAIN SELECT * FROM staff WHERE name= 'zhangsan' AND work_age > 2 AND position ='dev';

我們看到了執(zhí)行結(jié)果中 type 為?range?級別,使用了范圍查找,而 position 字段并沒有用到索引(沒有使用到BTree的索引去查詢),只是從?name = 'zhangsan' AND work_age > 2?條件返回的結(jié)果集中,再過濾符合 position 字段條件的數(shù)據(jù)。

5、盡量使用覆蓋索引

?

覆蓋索引:簡單理解,只訪問建了索引的列。減少使用?SELECT *?語句查詢列。

使用了覆蓋索引:

EXPLAIN SELECT name,work_age FROM staff WHERE name= 'zhangsan' AND work_age = 3;

使用了?SELECT *?查詢:

EXPLAIN SELECT * FROM staff WHERE name= 'zhangsan' AND work_age = 3;

?

我們重點看下使用了?覆蓋索引?方式查詢,會在結(jié)果中?Extra?列顯示?Using index?,這說明在查詢列包含了索引列,不需要再次回表查詢了。而如果使用?SELECT *?方式查詢,查詢列包含非索引的列,Extra?顯示為?NULL,所以還會進行回表查詢。

附一個曾經(jīng)線上SQL的優(yōu)化記錄:

artist 表有幾十萬條的數(shù)據(jù)量,第一條執(zhí)行的SQL沒有索引直接查詢,查詢耗時?0.557?毫秒;第一次優(yōu)化新建 founded 字段作為普通索引,查詢耗時?0.0224?毫秒;第二次優(yōu)化再次重建聯(lián)合索引 founded_name,優(yōu)化后查詢耗時:0.0051?毫秒。因為使用了覆蓋索引查詢方式,基于此優(yōu)化,SQL查詢效率提升非常明顯。

6、范圍條件查找能夠命中索引

?

范圍條件主要包括?<、<=、>、>=、between?等。

若條件中范圍列有普通索引和主鍵索引同時存在, 優(yōu)先使用主鍵索引:

EXPLAIN SELECT * FROM staff WHERE staff.s_no > 10 AND staff.id > 2;

范圍列可以用到索引,注意聯(lián)合索引必須符合最左前綴法則,如果查詢條件中有兩個范圍列則無法全用到索引,優(yōu)化器會去選擇:

EXPLAIN SELECT * FROM staff WHERE staff.name != 'zl' AND staff.s_no > 1;

若條件中范圍查詢和等值查詢同時存在,優(yōu)先匹配等值查詢列的索引:

EXPLAIN SELECT * FROM staff WHERE staff.s_no > 10 AND staff.s_name = 'zl';

7、IS NOT NULL 無法使用索引

?

索引列建議都使用?NOT NULL 約束?及默認值,單列索引不存 NULL 值,聯(lián)合索引不存全部為 NULL 的值,如果列允許為 NULL,查詢結(jié)果可能不符合預期。

staff 表中為?remark?字段新建普通索引:

ALTER TABLE staff ADD INDEX idx_remark (remark);

IS NULL?查詢命中索引:

EXPLAIN SELECT * FROM staff WHERE staff.remark IS NULL;

IS NOT NULL?查詢不會命中索引:

EXPLAIN SELECT * FROM staff WHERE staff.name IS NOT NULL;

8、模糊條件查詢以通配符開頭索引失效

like '%xx'?或?like '%xx%'?前導模糊查詢不能命中索引:

EXPLAIN SELECT * from staff where name like '%zhang%';

如何使用模擬查詢才能命中索引?

a)like 'xx%'?非前導模糊查詢可以命中索引:

EXPLAIN SELECT * FROM staff WHERE name LIKE 'zhang%';

b)使用覆蓋索引,查詢字段必須要建立覆蓋索引字段

EXPLAIN SELECT name,work_age FROM staff WHERE name LIKE '%zhang%';

聯(lián)合索引是?idx_name_work_age_position

9、字符串類型不加單引號索引失效

字符串的數(shù)據(jù)類型一定要將常量值使用單引號,這個在日常開發(fā)中要特別注意的,數(shù)據(jù)類型出現(xiàn)隱式轉(zhuǎn)換的時候不會命中索引。

不加單引號索引失效

EXPLAIN SELECT * FROM staff WHERE name = 1;

name=1 類似于在該字段上做了一個函數(shù)運算,因此不會走索引的。

加單引號會命中索引:

EXPLAIN SELECT * FROM staff WHERE name = 'zhangsan';

10、OR使用多數(shù)情況下索引會失效

?

EXPLAIN SELECT * FROM staff WHERE name='zhangsan' OR work_age = 2;

盡管 name 和 work_age 是聯(lián)合索引,但是 work_age 列上并沒有建索引,所以使用了?OR?不會走索引。

如果?OR?前后都是聯(lián)合索引帶頭大哥 name 字段,那么就會用到索引,如下所示:

因?OR?后面的條件列中沒有索引,會走全表掃描。存在全表掃描的情況下,就沒有必要多一次索引掃描增加IO訪問。

可使用覆蓋索引查詢:

EXPLAIN SELECT name,work_age FROM staff WHERE name='zhangsan' OR work_age = 2;

OR 后面也使用索引列:

EXPLAIN SELECT * FROM staff WHERE name='zhangsan' OR s_name='wangwu';

s_name 是唯一索引,name是聯(lián)合索引第一個字段,兩者使用?OR?查詢結(jié)果?Extra?顯示?Using sort_union(idx_name_age_position,idx_s_name); Using where?解釋一下。

如果執(zhí)行計劃?Extra?列出現(xiàn)了?Using sort_union(...)?的提示,說明準備使用?Sort-Union?索引合并的方式執(zhí)行查詢。如果出現(xiàn)了?Using intersect(...)?的提示,說明準備使用?Intersect?索引合并方式執(zhí)行查詢,如果出現(xiàn)了?Using union(...)?的提示 ,說明準備使用?Union?索引合并方式執(zhí)行查詢。括號中?...?表示需要進行索引合并的索引名稱。

使用UNION優(yōu)化改進:

EXPLAIN SELECT?FROM staff WHERE name='zhangsan' UNION SELECT?FROM staff WHERE s_name = 'zs';

使用?UNION?執(zhí)行計劃中出現(xiàn)了第三條記錄,Extra?中出現(xiàn)?Using temporary,說明 MySQL因為不能有效利用索引,建立了內(nèi)部臨時表來執(zhí)行查詢。當你在使用?DISTINCT 、GROUP BY、UNION?等子句中的查詢過程中,都有可能會出現(xiàn)該擴展信息。

使用UNION ALL進一步優(yōu)化:

EXPLAIN SELECT?FROM staff WHERE name='zhangsan' UNION ALL SELECT?FROM staff WHERE s_name = 'zs';

執(zhí)行結(jié)果中不再出現(xiàn)內(nèi)部臨時表,具體用的時候結(jié)合實際需求來定是否使用。

11、負向查詢條件不能使用索引

負向查詢條件包括:!=、<>、NOT IN、NOT EXISTS、NOT LIKE?等。

不會命中索引:

EXPLAIN SELECT?FROM staff WHERE s_no !=1 AND s_no != 2; EXPLAIN SELECT?FROM staff WHERE s_no NOT IN (1,2);

使用IN優(yōu)化,命中索引:

EXPLAIN SELECT * FROM staff WHERE s_no IN (11,12);

但是使用?IN?命中索引有個前提,是查詢條件字段數(shù)據(jù)區(qū)分度要高,通常如:狀態(tài)、類型、性別之類的字段。

12、排序?qū)λ饕挠绊?/h3>

ORDER BY是經(jīng)常用的語句,排序也遵循最左前綴列的原則。

查詢所有列未命中索引:

EXPLAIN SELECT * FROM staff ORDER BY name,work_age;

覆蓋索引查詢可命中索引:

覆蓋索引能夠利用聯(lián)合索引查詢,但是?ORDER BY?后的條件查詢不符合最左前綴原則,執(zhí)行結(jié)果?Extra?中出現(xiàn)了?Using filesort?的提示,一般看到這個就要想辦法優(yōu)化了。

調(diào)整排序的兩個字段順序之后,Extra?會提示為?Using index,使用了索引,避免了排序的資源開銷:

EXPLAIN SELECT name,work_age FROM staff ORDER BY name,work_age;

13、局部索引的使用

局部索引,區(qū)別于最左列索引(順序取索引中靠左的列的查詢),它只取某列的一部分作為索引。

INNODB存儲引擎下,一般是字符串類型,很長,全部作為索引大大增加存儲空間,索引也需要維護,對于長字符串,又想作為索引列,可取的辦法就是取前一部分(局部),代表一整列作為索引串。

如何確保這個前綴能代表或大致代表這一列?MySQL中有個概念是?索引選擇性,是指索引中不重復的值的數(shù)目(也稱基數(shù)X)與整個表該列記錄總數(shù)(T)的比值。基數(shù)可以通過SHOW INDEX FROM 表名?查看。

比如一個列表 [1,2,2,3,5,6],總數(shù)是 6,不重復值數(shù)目為 5,選擇性為 5/6,因此選擇性范圍是[X/T, 1],這個值越大,表示列中不重復值越多,越適合作為局部索引,而唯一索引(UNIQUE KEY)的選擇性是1。

`SELECT COUNT(DISTINCT(CONCAT(LEFT(remark, N))/COUNT(*) FROM t; 測試出接近 1 的索引選擇性,其中N是索引的長度,窮舉法去找出N的值,然后再建索引。

創(chuàng)建?局部索引?,使用 remark 字段舉個例子

EXPLAIN SELECT * FROM staff where remark LIKE 'xxx%';

對 remark 字段重建局部索引:

ALTER TABLE staff DROP INDEX idx_remark_part, ADD INDEX idx_remark_part(remark(5));

再次執(zhí)行查詢:

EXPLAIN SELECT * FROM staff where remark LIKE 'xxx%';

索引優(yōu)化總結(jié)

上面列了大部分場景索引最佳實戰(zhàn),除此之外,不宜建索引的幾點小總結(jié):

1)更新非常頻繁字段不宜建索引

因為字段更新臺頻繁,會導致B+樹的頻繁的變更,重建索引。所以這個過程是十分消耗數(shù)據(jù)庫性能的。

2)區(qū)分度不大的字段不宜建索引

比如類似性別這類的字段,區(qū)分度不大,建立索引的意義不大。因為不能有效過濾數(shù)據(jù),性能和全表掃描相當。另外注意一點,返回數(shù)據(jù)的比例在?30%?之外的,優(yōu)化器不會選擇使用索引。

3)業(yè)務中有唯一特性的字段,建議建成唯一索引

業(yè)務中如果有唯一特性的字段,即使是多個字段的組合,也盡量都建成唯一索引。盡管唯一索引會影響插入效率,但是對于查詢的速度提升是非常明顯的。此外,還能夠提供校驗機制,如果沒有唯一索引,高并發(fā)場景下,可能還會產(chǎn)生臟數(shù)據(jù)。

4)多表關聯(lián)時,要確保關聯(lián)字段上必須有索引

5)創(chuàng)建索引時避免建立錯誤的認識

索引越多越好,認為一個查詢就需要建一個索引。

寧缺勿濫,認為索引會消耗空間、嚴重拖慢更新和新增速度。

抵制唯一索引,認為業(yè)務的唯一性一律需要在應用層通過“先查后插”方式解決。

過早優(yōu)化,在不了解系統(tǒng)的情況下就開始優(yōu)化。

6)最佳索引實踐口訣

如果你覺得上面哪些太啰嗦,有朋友已總結(jié)為一套優(yōu)化口訣,優(yōu)化SQL時也能提個醒吧。

全值匹配我最愛,最左前綴要遵守;

帶頭大哥不能死,中間兄弟不能斷;

索引列上少計算,范圍之后全失效;

Like百分寫最右,覆蓋索引不寫星;

不等空值還有or,索引失效要少用;

VAR引號不可丟,SQL高級也不難!

7)EXPLAIN?執(zhí)行計劃實踐總結(jié)

如果還是覺得?EXPLAIN?執(zhí)行計劃列太多了,也記不住呀,那么請重點關注以下幾列:

第1列:ID越大,執(zhí)行的優(yōu)先級越高;ID相等,從上往下優(yōu)先順序執(zhí)行。

第2列:select_type 查詢語句的類型,SIMPLE簡單查詢,PRIMARY復雜查詢,DERIVED衍生查詢(from子查詢的臨時表),派生表。

第4列:請重點掌握,type類型,查詢效率優(yōu)先級:system->const->eq_ref->ref->range->index->ALL

ALL?是最差的,system?是最好的,性能最佳,阿里巴巴開發(fā)規(guī)約中要求最差也得到?range?級別,而不能有?index、ALL。

最后,對于后端工程師而言,盡力都能掌握?EXPLAIN?的使用,寫完SQL請習慣性的用它幫助你分析一下,做一個對SQL性能有追求的程序員,因為SQL也是程序員必備技能,將慢查詢問題拍死在項目上線前夕。

如果覺得本文有所收獲,歡迎轉(zhuǎn)發(fā)分享。

參考資料:?

MySQL官網(wǎng)?

https://www.cnblogs.com/songwenjie/p/9402295.html?

https://www.cnblogs.com/phpdragon/p/8231533.html

總結(jié)

以上是生活随笔為你收集整理的一本彻底搞懂MySQL索引优化EXPLAIN百科全书的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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

一区二区三区在线观看免费 | 不卡中文字幕av | 国产成人精品一区二区三区网站观看 | 久久看毛片 | 午夜精品视频免费在线观看 | v片在线播放 | 色九色| 一区精品久久 | 在线亚洲午夜片av大片 | 色综合天天狠天天透天天伊人 | 日韩剧 | 激情丁香月 | 在线色亚洲 | 日韩三级视频在线观看 | 国产精品粉嫩 | 国产精品99久久久久久久久 | 久草剧场| 成人免费观看视频网站 | 天天天干天天射天天天操 | 久久精品国产精品 | 国产xx在线 | 中文字幕色播 | 国产精品免费一区二区三区在线观看 | 色综合天天射 | 亚洲欧洲成人 | 天天舔天天射天天操 | 亚洲第二色 | 91精品一区在线观看 | 国产成人精品日本亚洲999 | 国产精品毛片一区视频播 | 在线黄色免费av | 亚洲狠狠婷婷综合久久久 | 日韩69av| 亚洲 成人 欧美 | 精品亚洲男同gayvideo网站 | 欧美性成人 | 欧美在线1| 中文字幕在线网址 | 精品一区欧美 | 免费看黄的 | 天天干天天干天天干 | 日韩中文在线视频 | av大片网站 | 在线播放一区 | 精品久久国产精品 | 在线播放日韩av | 91av视频播放| 亚洲国产日韩在线 | 91视频免费视频 | a天堂最新版中文在线地址 久久99久久精品国产 | 国产高清在线免费 | 亚洲性xxxx | 色国产精品一区在线观看 | 99热精品在线观看 | 国产一区二区手机在线观看 | 日本丰满少妇免费一区 | 香蕉视频4aa | 五月婷婷一区二区三区 | 五月婷婷丁香在线观看 | 在线亚洲播放 | 外国av网| 91黄站| 五月天六月婷婷 | 91视频在线网址 | 99人久久精品视频最新地址 | 国产91精品在线播放 | 国产一二三四在线视频 | 在线黄色毛片 | 五月开心六月伊人色婷婷 | 碰天天操天天 | 国产一级黄色免费看 | 一区二区三区日韩精品 | 99热手机在线| www.色就是色 | 日韩中文在线播放 | 在线a人v观看视频 | 日韩a级免费视频 | 亚洲精品乱码久久久久久蜜桃91 | 一区精品久久 | 人人澡人人干 | 99热这里精品 | 黄色av成人在线 | 91男人影院 | 99热这里只有精品国产首页 | 久久国产一区二区三区 | 国产精品黑丝在线观看 | 欧美在线视频一区二区三区 | 在线国产能看的 | 国产精品成人aaaaa网站 | 国产高清黄色 | 九九视频网 | 日韩在线视频一区二区三区 | 中文字幕日韩无 | 五月导航 | 久久99国产精品二区护士 | 成人四虎影院 | 国产精品v欧美精品v日韩 | 高清久久久久久 | 免费a一级 | 91福利视频久久久久 | 久久久久国产精品免费 | 国产黄色免费看 | 精品国模一区二区 | 探花视频免费观看 | 国产视频高清 | 国产精品一区在线播放 | 亚洲国产黄色片 | 香蕉日日 | 亚洲欧美日韩精品一区二区 | 久久久www成人免费毛片 | 国产色黄网站 | 国内视频 | 粉嫩av一区二区三区四区五区 | 久久国产综合视频 | 午夜精品一区二区三区免费 | 一区精品在线 | 在线之家免费在线观看电影 | 精品综合久久久 | 日韩在线观看影院 | 国产精品不卡在线 | 久久这里只有精品23 | 88av网站 | 久久99亚洲网美利坚合众国 | 欧美国产不卡 | 欧美日韩3p | 五月婷婷黄色 | 91九色九色| 99热在线国产 | 国产精品国产三级国产不产一地 | 69国产精品成人在线播放 | 98福利在线| 在线韩国电影免费观影完整版 | 国产成a人亚洲精v品在线观看 | 婷色在线 | 最新日韩视频 | 99久久久久免费精品国产 | 日本精品视频在线观看 | 中国黄色一级大片 | 国产v在线播放 | 国产999在线观看 | www.久久成人 | 日韩福利在线观看 | 99久久超碰中文字幕伊人 | 九九热国产 | 天天插天天干天天操 | 国产高清在线观看av | 国产精品麻 | 日日夜夜天天久久 | 国产视频久久久 | 国产精品网红福利 | 中文字幕一区二区三区四区视频 | 欧美日韩久久不卡 | 永久免费在线 | 国产一区二区精品久久91 | 国产精品99久久久久久人免费 | 国产一及片 | 国产精品久久久一区二区 | 99久久精| 亚洲热视频 | 久久久久国产a免费观看rela | 欧美色噜噜 | 久久免费毛片视频 | 久久久国产一区二区 | 精品福利视频在线 | 在线91视频| 国产一区在线免费 | 国产欧美久久久精品影院 | 久久精品一区二区三区中文字幕 | 久久国产精品免费看 | 99九九热只有国产精品 | 四虎免费av | 成人午夜精品福利免费 | 午夜视频在线观看一区二区三区 | 亚洲成人精品 | 亚洲精品777 | 久久久免费视频播放 | 国产小视频在线播放 | 中文字幕乱在线伦视频中文字幕乱码在线 | 天天干天天草天天爽 | 丁香高清视频在线看看 | 99精品在线观看视频 | 欧美少妇的秘密 | 日韩av一区二区三区四区 | 日韩免费播放 | 国产精品av在线 | 日韩欧美一区二区在线播放 | 99久在线精品99re8热视频 | 久久专区 | 欧美另类美少妇69xxxx | 九九热视频在线播放 | 久久看毛片| 国产亚洲欧美精品久久久久久 | 日韩在线 一区二区 | 黄色片软件网站 | 国产成人精品在线播放 | 欧美资源| 黄色网中文字幕 | 亚洲免费av一区二区 | 欧美日韩精品在线观看 | 99精品国产成人一区二区 | 激情婷婷在线观看 | 97视频在线免费播放 | av在线com| 久草免费在线观看 | 国产成人在线免费观看 | 91在线视频播放 | 狠狠干天天色 | 中文字幕激情 | 国产手机在线观看 | 在线观看黄 | 久久av电影| 久草在在线 | 亚洲免费公开视频 | av在线精品 | 亚洲美女视频在线观看 | 人人干97| 99久久网站 | 九九国产精品视频 | 98超碰在线观看 | h视频在线看 | 国产又粗又硬又爽的视频 | 99精品偷拍视频一区二区三区 | 欧美调教网站 | 午夜精品麻豆 | 欧美日韩免费在线观看视频 | 91精品亚洲影视在线观看 | 欧美日韩亚洲精品在线 | 国产69精品久久99的直播节目 | 91精品综合在线观看 | 国产女人18毛片水真多18精品 | 日韩成人在线一区二区 | 美国人与动物xxxx | 91天堂素人约啪 | 中文字幕网站视频在线 | 久久国产经典 | 日韩中文字幕免费视频 | 日韩三级久久 | 久久草草热国产精品直播 | 在线观看av免费 | 成人一区二区在线观看 | 国产1区2区3区在线 亚洲自拍偷拍色图 | 色婷婷狠狠 | 亚洲欧美日本A∨在线观看 青青河边草观看完整版高清 | 97在线视频网站 | 美女精品网站 | 成年人免费在线观看 | 日日夜夜草| 久久久香蕉视频 | 国产91学生粉嫩喷水 | 中文在线8资源库 | 日韩欧美大片免费观看 | 亚洲欧洲国产视频 | 日韩毛片在线免费观看 | 欧美一级性视频 | 69国产成人综合久久精品欧美 | 中文字幕视频三区 | 欧美三级高清 | 亚洲欧洲在线视频 | 美女黄久久 | 亚洲欧洲成人精品av97 | 精品欧美小视频在线观看 | 日韩精品1区2区 | 久久精品国产一区二区电影 | 欧美高清成人 | 国产精品一区二区无线 | 国产精品国产三级国产不产一地 | 99久久电影| 97精品国产97久久久久久久久久久久 | 91香蕉视频黄色 | 国产一级视频在线观看 | 91在线一区二区 | 五月天婷婷狠狠 | 麻豆视频在线播放 | 亚洲一区精品人人爽人人躁 | 欧美激情亚洲综合 | 亚洲禁18久人片 | 超碰在线观看97 | 超碰在线人人爱 | 国产精品1区2区 | 在线天堂中文www视软件 | 国产精品视频免费在线观看 | 24小时日本在线www免费的 | 日韩一区二区三区高清免费看看 | 日韩一区正在播放 | 人人爽久久涩噜噜噜网站 | 九九九热精品 | 在线观看成人小视频 | av一级片 | 精品一区二区免费视频 | 久久精品视频中文字幕 | 2021国产精品 | 亚洲日本国产精品 | 国产明星视频三级a三级点| 欧美日韩一区二区三区免费视频 | 日韩在线观看影院 | 99在线热播 | 久久av在线| 国产色综合天天综合网 | 亚洲综合视频在线播放 | av成人在线看 | 开心色激情网 | 成年人在线免费视频观看 | 麻豆传媒在线免费看 | 免费a v视频 | 日韩在线观看视频免费 | 色a在线观看 | 麻豆国产精品永久免费视频 | 国产在线精品一区 | 欧美 日韩 国产 中文字幕 | 欧美91成人网 | 国产69久久精品成人看 | 99精品国产高清在线观看 | 亚洲精品国产综合99久久夜夜嗨 | 久久免费国产精品 | 成 人 免费 黄 色 视频 | 在线只有精品 | 精品a级片| 亚洲欧美日韩不卡 | 国产精品福利久久久 | 天天干视频在线 | 91成人免费在线 | 一区二区三区免费在线观看视频 | 国产精品久久久久久久免费观看 | 免费在线观看成人 | 日韩黄在线观看 | 国产一区二区在线播放 | 久久精品视频在线 | 久久久www成人免费毛片麻豆 | 91av在| 国产伦理久久精品久久久久_ | 欧美综合色在线图区 | 蜜臀av性久久久久蜜臀av | 亚洲九九九在线观看 | 免费涩涩网站 | 欧日韩在线视频 | 国产精品久久久久国产精品日日 | 久久久久蜜桃 | 日日爽天天爽 | 99精品毛片 | 激情电影在线观看 | 91精品久久久久久综合五月天 | 精品国产一区二区在线 | 欧美一级网站 | 欧美激情第八页 | 国产精品久久久久久久久久白浆 | 亚洲九九九在线观看 | 国产色资源 | 爱情影院aqdy鲁丝片二区 | 夜夜骑天天操 | 九九视频免费在线观看 | 国产区久久 | www色综合 | 999一区二区三区 | 手机在线日韩视频 | 久久久精品福利视频 | 中文字幕综合在线 | 手机看片中文字幕 | 日韩两性视频 | 久久午夜鲁丝片 | 亚洲欧美在线视频免费 | 成人超碰在线 | 中文字幕国产精品一区二区 | 午夜.dj高清免费观看视频 | 黄色片网站大全 | 天天艹天天 | 天堂av一区二区 | 天天干夜夜 | 三级黄色在线 | 亚洲视频aaa| 91av99| 粉嫩av一区二区三区四区 | 天天曰视频 | 国产成人三级在线观看 | 97av视频| 一级片免费观看视频 | www.超碰97.com| 久草在线视频资源 | 久久精品国产一区二区电影 | 人人看人人草 | 亚洲精品一区二区18漫画 | 在线精品一区二区 | 日韩欧美国产激情在线播放 | 亚洲精品美女视频 | 在线观看小视频 | 国产精品99蜜臀久久不卡二区 | 婷婷久久一区 | 亚洲三级av | 久草在线观看视频免费 | 91色一区二区三区 | a国产精品| 日本精品免费看 | 成人h动漫在线看 | 国产午夜av| 亚洲电影一区二区 | 在线看片一区 | 亚洲人xxx | 黄色av网站在线观看免费 | 粉嫩av一区二区三区四区在线观看 | 精品国产伦一区二区三区免费 | 国产精品久久久久久久久久久久午夜 | 国产1区2区3区精品美女 | 亚洲一区二区三区四区在线视频 | 狠狠色婷婷丁香六月 | 色婷婷狠狠五月综合天色拍 | 中文字幕在线成人 | 亚洲日本韩国一区二区 | 欧美一区二区三区在线观看 | 国产精品色婷婷视频 | 精品高清美女精品国产区 | 国产精品一区免费观看 | 日韩欧美亚州 | 精品99在线视频 | 久操视频在线播放 | av资源免费在线观看 | 日韩一区二区三区高清免费看看 | 91看片淫黄大片91 | 亚洲综合最新在线 | 99久久电影| 免费视频91蜜桃 | 亚洲精品在线免费播放 | 久久综合在线 | 日韩欧美一级二级 | 99精品国产99久久久久久福利 | 成人免费视频网站在线观看 | 欧美一级久久久 | 黄色三级网站在线观看 | 国产粉嫩在线 | 99久久网站 | 黄色一级大片在线观看 | 精品亚洲免a | 久久美女免费视频 | 96亚洲精品久久久蜜桃 | 99精品视频99 | 成人毛片在线观看 | a黄色| 国产伦精品一区二区三区免费 | 欧美激情综合色综合啪啪五月 | 黄色片视频在线观看 | av成人资源 | 麻豆国产网站入口 | 国产精品99久久久久久宅男 | 欧美日韩18 | 国产女人18毛片水真多18精品 | 久久精品久久精品久久 | 日韩字幕在线 | 东方av在 | 最近中文字幕 | 美女网站在线免费观看 | 超级碰碰免费视频 | 99精品久久久久久久 | 五月婷婷视频在线 | 91久久丝袜国产露脸动漫 | 亚洲乱码精品久久久久 | 欧美日韩二三区 | 国产精成人品免费观看 | 不卡国产视频 | 91资源在线免费观看 | 日本公妇在线观看高清 | 狠狠色婷婷丁香六月 | 欧美日韩视频在线一区 | 日日夜夜操操操操 | 午夜精品区| 国产精品一区二区久久精品爱涩 | av电影在线播放 | 丁香在线视频 | 久久精品中文字幕 | 日韩欧美区 | 天天狠狠干 | 激情综合中文娱乐网 | 国产成人精品一区一区一区 | 成年美女黄网站色大片免费看 | 白丝av免费观看 | 97人人模人人爽人人喊网 | 夜色资源站国产www在线视频 | 欧美在线你懂的 | 亚洲爽爽网 | 在线观看a视频 | 人人要人人澡人人爽人人dvd | 亚洲成人精品在线 | 日韩精品欧美精品 | 精品主播网红福利资源观看 | 久久深夜福利免费观看 | 久久99国产精品自在自在app | 人人舔人人舔 | www欧美日韩 | 天天操夜夜操 | 欧美一级免费黄色片 | 激情综合五月婷婷 | 国产精品免费麻豆入口 | 亚洲欧洲国产精品 | 国产精品免费在线播放 | 久久久私人影院 | 极品久久久久 | 婷五月天激情 | 特级毛片网 | 国产精品一区二区三区观看 | 激情综合色图 | 午夜精品一区二区三区在线播放 | 91污污| 国产a网站 | 欧美性网站 | 丁香婷婷综合五月 | 欧美福利久久 | 一区 在线 影院 | 日日操日日插 | 婷婷久久久久 | 国产精品视频永久免费播放 | 97福利在线 | 亚洲一区精品二人人爽久久 | 国产日韩欧美精品在线观看 | 久久国产精品色av免费看 | 精品久久久久久亚洲综合网站 | 免费成人短视频 | 天天操天天操天天操 | 99视频国产在线 | 伊人久久精品久久亚洲一区 | 久久免费精品一区二区三区 | 久草com| 欧美亚洲一区二区在线 | 一区二区三区在线视频观看58 | 免费观看v片在线观看 | 天天爽夜夜爽人人爽曰av | 福利在线看片 | 中文字幕在线国产 | 国产福利免费在线观看 | 粉嫩av一区二区三区四区五区 | 91精品色| 婷婷丁香激情综合 | 亚洲精品18日本一区app | 中文字幕在线观看亚洲 | 久久免费大片 | 久草在线最新视频 | 国产精品成人免费 | av官网在线 | 午夜精品一区二区三区在线视频 | 综合久久网站 | 国产日韩精品视频 | 99综合电影在线视频 | 午夜三级理论 | 九九久久影视 | 亚洲国产精品电影在线观看 | 日韩av看片 | 免费看成人片 | 日韩在线观看中文字幕 | 激情综合站 | 91av精品 | 狠狠狠狠狠操 | 国产精品夜夜夜一区二区三区尤 | 九九有精品| 国产原创在线视频 | 奇米网在线观看 | 在线观看中文av | 中文字幕韩在线第一页 | 亚洲综合色播 | 亚洲国产无| 九九热免费在线观看 | 久久久www成人免费毛片麻豆 | 亚洲一级片 | 日韩欧美一区二区三区在线 | 久操久 | 亚洲国产美女精品久久久久∴ | 天天操天天摸天天爽 | 在线观看中文字幕2021 | 国产精品欧美日韩 | 亚洲日本va午夜在线电影 | 高清一区二区 | 国产一级做a | 色欧美视频 | 国产中文字幕视频在线观看 | 人人看人人草 | 精品亚洲男同gayvideo网站 | 亚洲一区美女视频在线观看免费 | 国产精品免费一区二区 | 91麻豆精品国产91久久久无限制版 | 国产在线va | 福利视频 | 亚洲人在线7777777精品 | 精品国产伦一区二区三区观看说明 | 精品国产一二三 | 六月丁香激情网 | 久久成年视频 | 久久久久人人 | 手机在线看a | 久久综合色播五月 | 日韩在线观看三区 | 91热视频在线观看 | 青青久草在线 | av手机版| 丝袜美女在线观看 | 91天堂影院 | 欧美成人精品三级在线观看播放 | 欧美日韩一区二区三区视频 | 久久精品视频在线 | www.操.com| 五月婷婷香蕉 | 五月天亚洲激情 | 99精品国产aⅴ | 成人毛片一区 | 91重口视频 | 亚洲年轻女教师毛茸茸 | 午夜久久久久久久久久久 | 91精品啪在线观看国产 | 尤物一区二区三区 | 视频一区视频二区在线观看 | 成年人在线免费看片 | 婷婷久久综合网 | 久久99在线 | 91av大全 | av不卡中文 | 免费看成人 | 欧美a在线看 | 国产一区二区观看 | 日本久久免费电影 | 欧美日产在线观看 | 久久久久久久久免费 | 99精品在线视频播放 | 亚洲人成网站精品片在线观看 | 999在线观看视频 | 91精彩视频在线观看 | 久久伦理影院 | 久久综合狠狠综合久久激情 | 久久精品视频网址 | 日一日操一操 | 天天色天天操综合网 | 午夜性色| 欧美在线视频免费 | 91av片| 在线观看一级片 | 91精品国产麻豆国产自产影视 | 美女视频黄网站 | 日韩欧美精品在线视频 | 在线观看的a站 | 久久久免费 | 91视频下载 | 亚洲区精品视频 | 中文字幕在线播放av | 国产 日韩 中文字幕 | 国产.精品.日韩.另类.中文.在线.播放 | 国产123av | 麻豆视频免费观看 | 午夜免费视频网站 | 欧美日韩一区二区三区在线观看视频 | 国产精品成人一区 | 欧美性免费 | 福利精品在线 | 日韩激情在线 | 日韩中文字幕免费在线观看 | 亚洲免费精品一区二区 | 国产裸体视频网站 | 伊人资源站 | 中文字幕资源网 国产 | 国产一区二区三区高清播放 | av成人在线网站 | 中文在线免费观看 | 国产三级av在线 | 91在线视频免费 | 天天天天天操 | 四季av综合网站 | 国产精品久久久久久爽爽爽 | 在线岛国av | 成人欧美一区二区三区黑人麻豆 | 五月婷婷国产 | 国产精品久久久久久久av电影 | 免费在线观看视频一区 | 久久综合视频网 | 天天亚洲综合 | 久久99精品久久久久久秒播蜜臀 | 午夜久久成人 | 亚洲欧美日韩在线一区二区 | 亚洲欧美在线观看视频 | 免费在线观看av片 | 91成人免费看 | 最新在线你懂的 | 日韩理论在线观看 | 欧美va在线观看 | 超级碰碰免费视频 | 亚洲国产片色 | 国产精品美女久久久久久久 | 日韩 在线 | 国产精品自在线拍国产 | 999久久国产 | 婷婷国产v亚洲v欧美久久 | 日韩系列| 五月天色综合 | 亚洲在线a | 一区二区三区免费在线 | 国产又黄又硬又爽 | 在线看国产视频 | 女人18精品一区二区三区 | 久久人人插 | 在线v | 国产三级精品三级在线观看 | 亚洲午夜av久久乱码 | 亚洲aaa毛片 | 天天草夜夜 | 夜夜操狠狠操 | 91丨九色丨蝌蚪丨对白 | 久久视频在线观看中文字幕 | 超级碰碰碰免费视频 | 欧美成年黄网站色视频 | 亚洲精品国偷自产在线91正片 | 久久国产精品99久久久久久老狼 | 一级黄色免费 | 亚洲污视频 | 制服丝袜一区二区 | 国产黄色一级片在线 | 亚洲丝袜一区二区 | 五月激情在线 | 久久精品国产免费看久久精品 | 在线亚洲欧美视频 | 亚洲一级久久 | 国产精品久久久久久爽爽爽 | 精品国产激情 | 久久综合亚洲鲁鲁五月久久 | a成人在线| 91精品国产乱码在线观看 | 特级西西444www高清大视频 | 亚洲欧洲xxxx | 亚洲一区二区麻豆 | 二区三区精品 | 天天干夜夜想 | 亚洲国产三级在线 | 色网站在线免费观看 | 午夜在线看 | 欧美视频国产视频 | 久久久久久久久久久影院 | 日韩特级毛片 | 91电影福利 | 亚洲三级性片 | 国产精品视频免费观看 | 97在线观看视频免费 | 欧美日韩国产一区二区在线观看 | 91超碰在线播放 | 狠狠色丁香久久综合网 | 久久久久久亚洲精品 | 中文字幕亚洲综合久久五月天色无吗'' | 69国产盗摄一区二区三区五区 | 黄网站www| 五月婷婷综合激情网 | 精品美女在线观看 | 亚洲精品乱码久久久久久 | 91精品国产高清自在线观看 | 日韩二区三区在线 | 亚洲 精品在线视频 | 人人干人人搞 | 成人在线一区二区三区 | 欧美日韩免费网站 | 中文字幕在线观看完整 | 亚洲一区 影院 | 91成人蝌蚪| 91麻豆精品国产91久久久久久 | 久草在线视频免费资源观看 | 国产精品美女久久久久久久久久久 | 久久精品视频网址 | 天天综合视频在线观看 | 在线免费观看羞羞视频 | 一区二区理论片 | 天天拍天天色 | 国产美女精品视频 | 久久久黄色免费网站 | 国产视频精品久久 | www中文在线 | 成人黄色毛片 | 免费黄在线看 | 久草视频在线新免费 | 国产精品网在线观看 | 日韩黄在线观看 | 国产打女人屁股调教97 | av免费看在线 | 成人在线一区二区 | 亚洲精品色 | 国产福利一区二区三区在线观看 | av免费成人| 国产精品婷婷 | 亚洲电影网站 | 涩涩网站在线观看 | 在线免费观看一区二区三区 | 少妇bbb| 亚洲性少妇性猛交wwww乱大交 | 在线免费高清视频 | 免费av福利 | 国产精品久久久久影视 | 日韩午夜精品福利 | 国产精品男女 | 97超碰国产精品女人人人爽 | 亚洲精品高清视频 | 91精品国产乱码在线观看 | 在线免费观看羞羞视频 | 色av男人的天堂免费在线 | 欧美精品免费视频 | 日韩精品一区二区三区中文字幕 | 亚洲aⅴ久久精品 | 黄色看片| 日韩av中文在线 | 国内精品久久影院 | 亚洲香蕉视频 | 91精品一区在线观看 | 97网站| 久久av福利 | 在线91av | 久久国产精品99精国产 | 特级西西人体444是什么意思 | 久久电影国产免费久久电影 | 欧美久久综合 | 激情久久久久 | 精品99免费 | 国产精品久久久久久a | 最近免费观看的电影完整版 | 欧美在线不卡一区 | 色五丁香| 91亚瑟视频 | 久久高清免费视频 | 亚洲做受高潮欧美裸体 | 在线免费观看黄网站 | 欧美国产日韩一区二区三区 | av一区二区三区在线观看 | 一区二区欧美激情 | 中文字幕a∨在线乱码免费看 | 色天天天 | 亚洲欧美日韩中文在线 | 91精彩视频在线观看 | 日韩精品不卡在线观看 | 亚洲极色 | 日韩免费在线视频 | 黄污网| 亚洲三区在线 | 成人一区在线观看 | 国内精品免费久久影院 | 亚洲精品在线视频观看 | 国产精品夜夜夜一区二区三区尤 | 久草免费色站 | 成人免费共享视频 | 国产 在线观看 | 天天天综合网 | 天天爽夜夜爽人人爽一区二区 | 亚洲精品资源在线观看 | 中文字幕在线观看免费高清完整版 | 国产一区国产精品 | 97涩涩视频| 亚洲第一区在线观看 | 国产伦精品一区二区三区在线 | 久久久精品视频成人 | 日本中文字幕网 | 国产不卡片 | 亚洲精品www | 成人小视频在线观看免费 | 午夜精品一区二区三区在线观看 | 亚洲经典在线 | 亚洲精品午夜视频 | 欧美视频xxx | 亚洲欧美日韩在线一区二区 | www日韩视频 | 高清精品在线 | 黄色亚洲大片免费在线观看 | 亚洲精品乱码 | 激情www | 超碰97中文 | 精品视频在线观看 | 美女网站在线免费观看 | 亚洲国产一区二区精品专区 | 99视频国产精品免费观看 | 四虎影视欧美 | 国产黄色精品在线 | 成人黄色片在线播放 | 中文字幕在线中文 | 成人羞羞视频在线观看免费 | 久久9精品 | japanesexxxxfreehd乱熟 | 国产精品自产拍在线观看网站 | 一区二区三区手机在线观看 | 久久草在线免费 | 欧美日韩中文字幕视频 | 国产成在线观看免费视频 | 香蕉网在线播放 | 午夜三级福利 | 国产又粗又硬又爽的视频 | 美女又爽又黄 | 欧美日韩伦理在线 | 午夜色影院 | 天堂视频一区 | 欧美久久久久久久久久久 | 亚洲成av人片在线观看 | 天天色棕合合合合合合 | 69国产成人综合久久精品欧美 | 91伊人影院 | 91pony九色丨交换 | 亚洲精品在线免费看 | 日日躁夜夜躁aaaaxxxx | 午夜精品一区二区三区四区 | 麻豆一精品传二传媒短视频 | av福利在线| 四虎亚洲精品 | 欧洲一区二区在线观看 | 欧洲av不卡 | 伊人永久 | 亚洲在线免费视频 | 精品一区二区综合 | 成人午夜黄色 | 国产黄色片在线免费观看 | 91tv国产成人福利 | 国产精品va在线观看入 | 亚洲一级黄色 | 四虎国产视频 | 亚洲理论电影 | 国产日产欧美在线观看 | 精品日韩视频 | 婷婷视频 | av官网在线 | 久久综合电影 | 欧美综合在线观看 | 夜夜狠狠 | 国色天香第二季 | 久久久黄色免费网站 | 最近最新最好看中文视频 | 久久久综合电影 | 四虎在线视频免费观看 | 亚洲91中文字幕无线码三区 | 亚洲欧美日本一区二区三区 | 中文字幕黄色av | 韩国av三级 | 色婷婷色 | 国产高清在线不卡 | 欧美一级免费在线 | 日韩字幕| 久久国产精品区 | 99国产精品视频免费观看一公开 | 夜夜躁日日躁狠狠躁 | 久久久国产一区二区三区四区小说 | 91av社区| 亚洲日本va午夜在线电影 | 在线亚洲成人 | 欧美日韩中字 | 狠狠狠色丁香婷婷综合激情 | 夜夜夜草 | 精品成人久久 | 日韩欧美区 | 丰满少妇在线观看 | 色中文字幕在线观看 | 欧美天天综合网 | 久久久久久久国产精品 | 在线观看亚洲电影 | 色婷婷 亚洲 | 在线观看日韩免费视频 | 亚洲高清在线精品 | 久久精品首页 | 91欧美精品| 亚洲综合色丁香婷婷六月图片 | 中文字幕免费久久 | 欧美一二三在线 | a级一a一级在线观看 | 久久久久久久久久久久久9999 | 91av视频免费在线观看 | 91网站免费观看 | 99欧美视频| 久久亚洲精品电影 | 亚洲高清在线视频 | 91爱爱视频| 久久老司机精品视频 | av观看久久久 | 中文字幕一区二区三区四区在线视频 | 国产精品普通话 | 一区二区三区免费 | 国产福利一区二区三区在线观看 | 色诱亚洲精品久久久久久 | 国产一级一片免费播放放a 一区二区三区国产欧美 | 国产精品一区二区三区久久 | 日本一区二区三区免费观看 | 亚洲涩涩涩涩涩涩 | 91丨九色丨丝袜 | 亚洲成av人电影 | 在线成人免费av | 精品国产观看 | 亚洲人人精品 | 婷婷色在线观看 | 国产精品一区免费在线观看 | 亚洲精品xxx | 亚洲成人av片 | 四虎影视av | 在线日本v二区不卡 | 日韩av免费大片 | 成人黄色毛片 | 日日日视频 | 成人小视频在线免费观看 | av+在线播放在线播放 | 国产精品自产拍在线观看桃花 | 在线免费观看视频a | 2017狠狠干 | 国产视频一区二区在线 | av线上看 | 亚洲高清不卡av | av综合站 | 国产99久久99热这里精品5 | 日韩av中文字幕在线免费观看 | 国产精品第10页 | 免费视频99 | 色婷婷狠狠操 | 久久在线视频在线 | 日韩在线视频观看 |