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

歡迎訪問 生活随笔!

生活随笔

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

数据库

18000字的SQL优化大全,收藏直接起飞!

發布時間:2023/12/19 数据库 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 18000字的SQL优化大全,收藏直接起飞! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

來源:數據分析不是個事兒

很多朋友在做數據分析時,分析兩分鐘,跑數兩小時?

在使用SQL過程中不僅要關注數據結果,同樣要注意SQL語句的執行效率。

本文涉及三部分,篇幅較長,建議收藏后翻看:

  • SQL介紹

  • SQL優化方法

  • SQL優化實例

1、MySQL的基本架構

1)MySQL的基礎架構圖

左邊的client可以看成是客戶端,客戶端有很多,像我們經常你使用的CMD黑窗口,像我們經常用于學習的WorkBench,像企業經常使用的Navicat工具,它們都是一個客戶端。右邊的這一大堆都可以看成是Server(MySQL的服務端),我們將Server在細分為sql層和存儲引擎層。

當查詢出數據以后,會返回給執行器。執行器一方面將結果寫到查詢緩存里面,當你下次再次查詢的時候,就可以直接從查詢緩存中獲取到數據了。另一方面,直接將結果響應回客戶端。

2)查詢數據庫的引擎

① show engines;

② show variables like “%storage_engine%”;

3)指定數據庫對象的存儲引擎

create?table?tb(id?int(4)?auto_increment,name?varchar(5),dept?varchar(5),primary?key(id) )?engine=myISAM?auto_increment=1?default?charset=utf8;

SQL優化

1)為什么需要進行SQL優化?

在進行多表連接查詢、子查詢等操作的時候,由于你寫出的SQL語句欠佳,導致的服務器執行時間太長,我們等待結果的時間太長。基于此,我們需要學習怎么優化SQL。

2)mysql的編寫過程和解析過程

① 編寫過程

select?dinstinct??..from??..join?..on?..where?..group?by?..having?..order?by?..limit?..

② 解析過程

from?..?on..?join?..where?..group?by?..having?..select?dinstinct?..order?by?..limit?..

提供一個網站,詳細說明了mysql解析過程:

https://www.cnblogs.com/annsshadow/p/5037667.html

3)SQL優化—主要就是優化索引

優化SQL,最重要的就是優化SQL索引。

索引相當于字典的目錄。利用字典目錄查找漢字的過程,就相當于利用SQL索引查找某條記錄的過程。有了索引,就可以很方便快捷的定位某條記錄。

① 什么是索引?

索引就是幫助MySQL高效獲取數據的一種【數據結構】。索引是一種樹結構,MySQL中一般用的是【B+樹】。

② 索引圖示說明(這里用二叉樹來幫助我們理解索引)

樹形結構的特點是:子元素比父元素小的,放在左側;子元素比父元素大的,放在右側。

這個圖示只是為了幫我們簡單理解索引的,真實的關于【B+樹】的說明,我們會在下面進行說明。

索引是怎么查找數據的呢?兩個字【指向】,上圖中我們給age列指定了一個索引,即類似于右側的這種樹形結構。mysql表中的每一行記錄都有一個硬件地址,例如索引中的age=50,指向的就是源表中該行的標識符(“硬件地址”)。也就是說,樹形索引建立了與源表中每行記錄硬件地址的映射關系,當你指定了某個索引,這種映射關系也就建成了,這就是為什么我們可以通過索引快速定位源表中記錄的原因。

以【select * from student where age=33】查詢語句為例。當我們不加索引的時候,會從上到下掃描源表,當掃描到第5行的時候,找到了我們想要找到了元素,一共是查詢了5次。當添加了索引以后,就直接在樹形結構中進行查找,33比50小,就從左側查詢到了23,33大于23,就又查詢到了右側,這下找到了33,整個索引結束,一共進行了3次查找。是不是很方便,假如我們此時需要查找age=62,你再想想“添加索引”前后,查找次數的變化情況。

4)索引的弊端

1.當數據量很大的時候,索引也會很大(當然相比于源表來說,還是相當小的),也需要存放在內存/硬盤中(通常存放在硬盤中),占據一定的內存空間/物理空間。

2.索引并不適用于所有情況:a.少量數據;b.頻繁進行改動的字段,不適合做索引;c.很少使用的字段,不需要加索引;

3.索引會提高數據查詢效率,但是會降低“增、刪、改”的效率。當不使用索引的時候,我們進行數據的增刪改,只需要操作源表即可,但是當我們添加索引后,不僅需要修改源表,也需要再次修改索引,很麻煩。盡管是這樣,添加索引還是很劃算的,因為我們大多數使用的就是查詢,“查詢”對于程序的性能影響是很大的。

5)索引的優勢

1.提高查詢效率(降低了IO使用率)。當創建了索引后,查詢次數減少了。

2.降低CPU使用率。比如說【…order by age desc】這樣一個操作,當不加索引,會把源表加載到內存中做一個排序操作,極大的消耗了資源。但是使用了索引以后,第一索引本身就小一些,第二索引本身就是排好序的,左邊數據最小,右邊數據最大。

6)B+樹圖示說明

MySQL中索引使用的就是B+樹結構。

關于B+樹的說明:

首先,Btree一般指的都是【B+樹】,數據全部存放在葉子節點中。對于上圖來說,最下面的第3層,屬于葉子節點,真實數據部份都是存放在葉子節點當中的。那么對于第1、2層中的數據又是干嘛的呢?答:用于分割指針塊兒的,比如說小于26的找P1,介于26-30之間的找P2,大于30的找P3。

其次,三層【B+樹】可以存放上百萬條數據。這么多數據怎么放的呢?增加“節點數”。圖中我們只有三個節點。

最后,【B+樹】中查詢任意數據的次數,都是n次,n表示的是【B+樹】的高度。

3、索引的分類與創建

1)索引分類

單值索引

唯一索引

復合索引

① 單值索引

利用表中的某一個字段創建單值索引。一張表中往往有多個字段,也就是說每一列其實都可以創建一個索引,這個根據我們實際需求來進行創建。還需要注意的一點就是,一張表可以創建多個“單值索引”。

假如某一張表既有age字段,又有name字段,我們可以分別對age、name創建一個單值索引,這樣一張表就有了兩個單值索引。

② 唯一索引

也是利用表中的某一個字段創建單值索引,與單值索引不同的是:創建唯一索引的字段中的數據,不能有重復值。像age肯定有很多人的年齡相同,像name肯定有些人是重名的,因此都不適合創建“唯一索引”。像編號id、學號sid,對于每個人都不一樣,因此可以用于創建唯一索引。

③ 復合索引

多個列共同構成的索引。比如說我們創建這樣一個“復合索引”(name,age),先利用name進行索引查詢,當name相同的時候,我們利用age再進行一次篩選。注意:復合索引的字段并不是非要都用完,當我們利用name字段索引出我們想要的結果以后,就不需要再使用age進行再次篩選了。

2)創建索引

① 語法

語法:create 索引類型 索引名 on 表(字段);

建表語句如下:

查詢表結構如下:

② 創建索引的第一種方式

Ⅰ 創建單值索引

create?index?dept_index?on?tb(dept);

Ⅱ 創建唯一索引:這里我們假定name字段中的值都是唯一的

create?unique?index?name_index?on?tb(name);

Ⅲ 創建復合索引

create?index?dept_name_index?on?tb(dept,name);

③ 創建索引的第二種方式

先刪除之前創建的索引以后,再進行這種創建索引方式的測試;

語法:alter table 表名 add 索引類型 索引名(字段)

Ⅰ 創建單值索引

alter?table?tb?add?index?dept_index(dept);

Ⅱ 創建唯一索引:這里我們假定name字段中的值都是唯一的

alter?table?tb?add?unique?index?name_index(name);

Ⅲ 創建復合索引

alter?table?tb?add?index?dept_name_index(dept,name);

④ 補充說明

如果某個字段是primary key,那么該字段默認就是主鍵索引。

主鍵索引和唯一索引非常相似。相同點:該列中的數據都不能有相同值;不同點:主鍵索引不能有null值,但是唯一索引可以有null值。

3)索引刪除和索引查詢

① 索引刪除

語法:drop index 索引名 on 表名;

drop?index?name_index?on?tb;

② 索引查詢

語法:show index from 表名;

show?index?from?tb;

結果如下:

4、SQL性能問題的探索

人為優化:需要我們使用explain分析SQL的執行計劃。該執行計劃可以模擬SQL優化器執行SQL語句,可以幫助我們了解到自己編寫SQL的好壞。

SQL優化器自動優化:最開始講述MySQL執行原理的時候,我們已經知道MySQL有一個優化器,當你寫了一個SQL語句的時候,SQL優化器如果認為你寫的SQL語句不夠好,就會自動寫一個好一些的等價SQL去執行。

SQL優化器自動優化功能【會干擾】我們的人為優化功能。當我們查看了SQL執行計劃以后,如果寫的不好,我們會去優化自己的SQL。當我們以為自己優化的很好的時候,最終的執行計劃,并不是按照我們優化好的SQL語句來執行的,而是有時候將我們優化好的SQL改變了,去執行。

SQL優化是一種概率問題,有時候系統會按照我們優化好的SQL去執行結果(優化器覺得你寫的差不多,就不會動你的SQL)。有時候優化器仍然會修改我們優化好的SQL,然后再去執行。

1)查看執行計劃

語法:explain + SQL語句

eg:explain select * from tb;

2)“執行計劃”中需要知道的幾個“關鍵字”

id :編號

select_type :查詢類型

table :表

type :類型

possible_keys :預測用到的索引

key :實際使用的索引

key_len :實際使用索引的長度

ref :表之間的引用

rows :通過索引查詢到的數據量

Extra :額外的信息

建表語句和插入數據:

#?建表語句 create?table?course (cid?int(3),cname?varchar(20),tid?int(3) );create?table?teacher (tid?int(3),tname?varchar(20),tcid?int(3) );create?table?teacherCard (tcid?int(3),tcdesc?varchar(200) );#?插入數據 insert?into?course?values(1,'java',1); insert?into?course?values(2,'html',1); insert?into?course?values(3,'sql',2); insert?into?course?values(4,'web',3);insert?into?teacher?values(1,'tz',1); insert?into?teacher?values(2,'tw',2); insert?into?teacher?values(3,'tl',3);insert?into?teacherCard?values(1,'tzdesc')?; insert?into?teacherCard?values(2,'twdesc')?; insert?into?teacherCard?values(3,'tldesc')?;

explain執行計劃常用關鍵字詳解

1)id關鍵字的使用說明

① 案例:查詢課程編號為2 或 教師證編號為3 的老師信息:

#?查看執行計劃 explain?select?t.* from?teacher?t,course?c,teacherCard?tc where?t.tid?=?c.tid?and?t.tcid?=?tc.tcid and?(c.cid?=?2?or?tc.tcid?=?3);

結果如下:

接著,在往teacher表中增加幾條數據。

insert?into?teacher?values(4,'ta',4); insert?into?teacher?values(5,'tb',5); insert?into?teacher?values(6,'tc',6);

再次查看執行計劃。

#?查看執行計劃 explain?select?t.* from?teacher?t,course?c,teacherCard?tc where?t.tid?=?c.tid?and?t.tcid?=?tc.tcid and?(c.cid?=?2?or?tc.tcid?=?3);

結果如下:

表的執行順序 ,因表數量改變而改變的原因:笛卡爾積。

a???b???c 2???3???4 最終:2 * 3 * 4 ?= 6 * 4 = 24 c???b???a 4???3???2 最終:4 * 3 * 2 = 12 * 2 = 24

分析:最終執行的條數,雖然是一致的。但是中間過程,有一張臨時表是6,一張臨時表是12,很明顯6 < 12,對于內存來說,數據量越小越好,因此優化器肯定會選擇第一種執行順序。

結論:id值相同,從上往下順序執行。表的執行順序因表數量的改變而改變。

② 案例:查詢教授SQL課程的老師的描述(desc)

#?查看執行計劃 explain?select?tc.tcdesc?from?teacherCard?tc? where?tc.tcid?=? (select?t.tcid?from?teacher?t?where??t.tid?=??(select?c.tid?from?course?c?where?c.cname?=?'sql') );

結果如下:

結論:id值不同,id值越大越優先查詢。這是由于在進行嵌套子查詢時,先查內層,再查外層。

③ 針對②做一個簡單的修改

#?查看執行計劃 explain?select?t.tname?,tc.tcdesc?from?teacher?t,teacherCard?tc? where?t.tcid=?tc.tcid and?t.tid?=?(select?c.tid?from?course?c?where?cname?=?'sql')?;

結果如下:

結論:id值有相同,又有不同。id值越大越優先;id值相同,從上往下順序執行。

2)select_type關鍵字的使用說明:查詢類型

① simple:簡單查詢

不包含子查詢,不包含union查詢。

explain?select?*?from?teacher;

結果如下:

② primary:包含子查詢的主查詢(最外層)

③ subquery:包含子查詢的主查詢(非最外層)

④ derived:衍生查詢(用到了臨時表)

a.在from子查詢中,只有一張表;

b.在from子查詢中,如果table1 union table2,則table1就是derived表;

explain?select??cr.cname????? from?(?select?*?from?course?where?tid?=?1??union?select?*?from?course?where?tid?=?2?)?cr?;

結果如下:

⑤ union:union之后的表稱之為union表,如上例

⑥ union result:告訴我們,哪些表之間使用了union查詢

3)type關鍵字的使用說明:索引類型

system、const只是理想狀況,實際上只能優化到index --> range --> ref這個級別。要對type進行優化的前提是,你得創建索引。

① system

源表只有一條數據(實際中,基本不可能);

衍生表只有一條數據的主查詢(偶爾可以達到)。

② const

僅僅能查到一條數據的SQL ,僅針對Primary key或unique索引類型有效。

explain?select?tid?from?test01?where?tid?=1?;

結果如下:

刪除以前的主鍵索引后,此時我們添加一個其他的普通索引:

create?index?test01_index?on?test01(tid)?; #?再次查看執行計劃 explain?select?tid?from?test01?where?tid?=1?;

結果如下:

③ eq_ref

唯一性索引,對于每個索引鍵的查詢,返回匹配唯一行數據(有且只有1個,不能多 、不能0),并且查詢結果和數據條數必須一致。

此種情況常見于唯一索引和主鍵索引。

delete?from?teacher?where?tcid?>=?4; alter?table?teacherCard?add?constraint?pk_tcid?primary?key(tcid); alter?table?teacher?add?constraint?uk_tcid?unique?index(tcid)?; explain?select?t.tcid?from?teacher?t,teacherCard?tc?where?t.tcid?=?tc.tcid?;

結果如下:

總結:以上SQL,用到的索引是t.tcid,即teacher表中的tcid字段;如果teacher表的數據個數和連接查詢的數據個數一致(都是3條數據),則有可能滿足eq_ref級別;否則無法滿足。條件很苛刻,很難達到。

④ ref

非唯一性索引,對于每個索引鍵的查詢,返回匹配的所有行(可以0,可以1,可以多)

準備數據:

創建索引,并查看執行計劃:

#?添加索引 alter?table?teacher?add?index?index_name?(tname)?; #?查看執行計劃 explain?select?*?from?teacher?????where?tname?=?'tz';

結果如下:

⑤ range

檢索指定范圍的行 ,where后面是一個范圍查詢(between, >, <, >=, in)

in有時候會失效,從而轉為無索引時候的ALL

#?添加索引 alter?table?teacher?add?index?tid_index?(tid)?; #?查看執行計劃:以下寫了一種等價SQL寫法,查看執行計劃 explain?select?t.*?from?teacher?t?where?t.tid?in?(1,2)?; explain?select?t.*?from?teacher?t?where?t.tid?<3?;

結果如下:

⑥ index

查詢全部索引中的數據(掃描整個索引)

⑦ ALL

查詢全部源表中的數據(暴力掃描全表)

注意:cid是索引字段,因此查詢索引字段,只需要掃描索引表即可。但是tid不是索引字段,查詢非索引字段,需要暴力掃描整個源表,會消耗更多的資源。

4)possible_keys和key

possible_keys可能用到的索引。是一種預測,不準。了解一下就好。

key指的是實際使用的索引。

#?先給course表的cname字段,添加一個索引 create?index?cname_index?on?course(cname); #?查看執行計劃 explain?select?t.tname?,tc.tcdesc?from?teacher?t,teacherCard?tc where?t.tcid=?tc.tcid and?t.tid?=?(select?c.tid?from?course?c?where?cname?=?'sql')?;

結果如下:

有一點需要注意的是:如果possible_key/key是NULL,則說明沒用索引。

5)key_len

索引的長度,用于判斷復合索引是否被完全使用(a,b,c)。

① 新建一張新表,用于測試

#?創建表 create?table?test_kl (name?char(20)?not?null?default?'' ); #?添加索引 alter?table?test_kl?add?index?index_name(name)?; #?查看執行計劃 explain?select?*?from?test_kl?where?name?=''?;

結果如下:

結果分析:因為我沒有設置服務端的字符集,因此默認的字符集使用的是latin1,對于latin1一個字符代表一個字節,因此這列的key_len的長度是20,表示使用了name這個索引。

② 給test_kl表,新增name1列,該列沒有設置“not null”

結果如下:

結果分析:如果索引字段可以為null,則mysql底層會使用1個字節用于標識。

③ 刪除原來的索引name和name1,新增一個復合索引

#?刪除原來的索引name和name1 drop?index?index_name?on?test_kl?; drop?index?index_name1?on?test_kl?; #?增加一個復合索引? create?index?name_name1_index?on?test_kl(name,name1); #?查看執行計劃 explain?select?*?from?test_kl?where?name1?=?''?;?--121 explain?select?*?from?test_kl?where?name?=?''?;?--60

結果如下:

結果分析:對于下面這個執行計劃,可以看到我們只使用了復合索引的第一個索引字段name,因此key_len是20,這個很清楚。再看上面這個執行計劃,我們雖然僅僅在where后面使用了復合索引字段中的name1字段,但是你要使用復合索引的第2個索引字段,會默認使用了復合索引的第1個索引字段name,由于name1可以是null,因此key_len = 20 + 20 + 1 = 41呀!

④ 再次怎加一個name2字段,并為該字段創建一個索引。

不同的是:該字段數據類型是varchar

#?新增一個字段name2,name2可以為null alter?table?test_kl?add?column?name2?varchar(20)?;? #?給name2字段,設置為索引字段 alter?table?test_kl?add?index?name2_index(name2)?; #?查看執行計劃 explain?select?*?from?test_kl?where?name2?=?''?;

結果如下:

結果分析:key_len = 20 + 1 + 2,這個20 + 1我們知道,這個2又代表什么呢?原來varchar屬于可變長度,在mysql底層中,用2個字節標識可變長度。

6)ref

這里的ref的作用,指明當前表所參照的字段。

注意與type中的ref值區分。在type中,ref只是type類型的一種選項值。

#?給course表的tid字段,添加一個索引 create?index?tid_index?on?course(tid); #?查看執行計劃 explain?select?*?from?course?c,teacher?t? where?c.tid?=?t.tid?? and?t.tname?=?'tw';

結果如下:

結果分析:有兩個索引,c表的c.tid引用的是t表的tid字段,因此可以看到顯示結果為【數據庫名.t.tid】,t表的t.name引用的是一個常量"tw",因此可以看到結果顯示為const,表示一個常量。

7)rows(這個目前還是有點疑惑)

被索引優化查詢的數據個數 (實際通過索引而查詢到的數據個數)

explain?select?*? from?course?c,teacher?t?? where?c.tid?=?t.tid and?t.tname?=?'tz'?;

結果如下:

8)extra

表示其他的一些說明,也很有用。

① using filesort:針對單索引的情況

當出現了這個詞,表示你當前的SQL性能消耗較大。表示進行了一次“額外”的排序。常見于order by語句中。

Ⅰ 什么是“額外”的排序?

為了講清楚這個,我們首先要知道什么是排序。我們為了給某一個字段進行排序的時候,首先你得先查詢到這個字段,然后在將這個字段進行排序。

緊接著,我們查看如下兩個SQL語句的執行計劃。

#?新建一張表,建表同時創建索引 create?table?test02 (a1?char(3),a2?char(3),a3?char(3),index?idx_a1(a1),index?idx_a2(a2),index?idx_a3(a3) ); #?查看執行計劃 explain?select?*?from?test02?where?a1?=''?order?by?a1?; explain?select?*?from?test02?where?a1?=''?order?by?a2?;

結果如下:

結果分析:對于第一個執行計劃,where后面我們先查詢了a1字段,然后再利用a1做了依次排序,這個很輕松。但是對于第二個執行計劃,where后面我們查詢了a1字段,然而利用的卻是a2字段進行排序,此時myql底層會進行一次查詢,進行“額外”的排序。

總結:對于單索引,如果排序和查找是同一個字段,則不會出現using filesort;如果排序和查找不是同一個字段,則會出現using filesort;因此where哪些字段,就order by哪些些字段。

② using filesort:針對復合索引的情況

不能跨列(官方術語:最佳左前綴)

#?刪除test02的索引 drop?index?idx_a1?on?test02; drop?index?idx_a2?on?test02; drop?index?idx_a3?on?test02; #?創建一個復合索引 alter?table?test02?add?index?idx_a1_a2_a3?(a1,a2,a3)?; #?查看下面SQL語句的執行計劃 explain?select?*from?test02?where?a1=''?order?by?a3?;??--using?filesort explain?select?*from?test02?where?a2=''?order?by?a3?;?--using?filesort explain?select?*from?test02?where?a1=''?order?by?a2?;

結果如下:

結果分析:復合索引的順序是(a1,a2,a3),可以看到a1在最左邊,因此a1就叫做“最佳左前綴”,如果要使用后面的索引字段,必須先使用到這個a1字段。對于explain1,where后面我們使用a1字段,但是后面的排序使用了a3,直接跳過了a2,屬于跨列;對于explain2,where后面我們使用了a2字段,直接跳過了a1字段,也屬于跨列;對于explain3,where后面我們使用a1字段,后面使用的是a2字段,因此沒有出現【using filesort】。

③ using temporary

當出現了這個詞,也表示你當前的SQL性能消耗較大。這是由于當前SQL用到了臨時表。一般出現在group by中。

explain?select?a1?from?test02?where?a1?in?('1','2','3')?group?by?a1?; explain?select?a1?from?test02?where?a1?in?('1','2','3')?group?by?a2?;?--using?temporary

結果如下:

結果分析:當你查詢哪個字段,就按照那個字段分組,否則就會出現using temporary。

針對using temporary,我們在看一個例子:

using temporary表示需要額外再使用一張表,一般出現在group by語句中。雖然已經有表了,但是不適用,必須再來一張表。

再次來看mysql的編寫過程和解析過程。

Ⅰ 編寫過程

select?dinstinct??..from??..join?..on?..where?..group?by?..having?..order?by?..limit?..

Ⅱ 解析過程

from?..?on..?join?..where?..group?by?..having?..select?dinstinct?..order?by?..limit?..

很顯然,where后是group by,然后才是select。基于此,我們再查看如下兩個SQL語句的執行計劃。

explain?select?*?from?test03?where?a2=2?and?a4=4?group?by?a2,a4; explain?select?*?from?test03?where?a2=2?and?a4=4?group?by?a3;

分析如下:對于第一個執行計劃,where后面是a2和a4,接著我們按照a2和a4分組,很明顯這兩張表已經有了,直接在a2和a4上分組就行了。但是對于第二個執行計劃,where后面是a2和a4,接著我們卻按照a3分組,很明顯我們沒有a3這張表,因此有需要再來一張臨時表a3。因此就會出現using temporary。

④ using index

當你看到這個關鍵詞,恭喜你,表示你的SQL性能提升了。

using index稱之為“索引覆蓋”。

當出現了using index,就表示不用讀取源表,而只利用索引獲取數據,不需要回源表查詢。

只要使用到的列,全部出現在索引中,就是索引覆蓋。

#?刪除test02中的復合索引idx_a1_a2_a3 drop?index?idx_a1_a2_a3?on?test02; #?重新創建一個復合索引idx_a1_a2 create?index?idx_a1_a2?on?test02(a1,a2); #?查看執行計劃 explain?select?a1,a3?from?test02?where?a1=''?or?a3=?''?; explain?select?a1,a2?from?test02?where?a1=''?and?a2=?''?;

結果如下:

結果分析:我們創建的是a1和a2的復合索引,對于第一個執行計劃,我們卻出現了a3,該字段并沒有創建索引,因此沒有出現using index,而是using where,表示我們需要回表查詢。對于第二個執行計劃,屬于完全的索引覆蓋,因此出現了using index。

針對using index,我們在查看一個案例:

explain?select?a1,a2?from?test02?where?a1=''?or?a2=?''?; explain?select?a1,a2?from?test02;

結果如下:

如果用到了索引覆蓋(using index時),會對possible_keys和key造成影響:

a.如果沒有where,則索引只出現在key中;

b.如果有where,則索引 出現在key和possible_keys中。

⑤ using where

表示需要【回表查詢】,表示既在索引中進行了查詢,又回到了源表進行了查詢。

#?刪除test02中的復合索引idx_a1_a2 drop?index?idx_a1_a2?on?test02; #?將a1字段,新增為一個索引 create?index?a1_index?on?test02(a1); #?查看執行計劃 explain?select?a1,a3?from?test02?where?a1=""?and?a3=""?;

結果如下:

結果分析:我們既使用了索引a1,表示我們使用了索引進行查詢。但是又對于a3字段,我們并沒有使用索引,因此對于a3字段,需要回源表查詢,這個時候出現了using where。

⑥ impossible where(了解)

當where子句永遠為False的時候,會出現impossible where

#?查看執行計劃 explain?select?a1?from?test02?where?a1="a"?and?a1="b"?;

結果如下:

6、優化示例

1)引入案例

#?創建新表 create?table?test03 (a1?int(4)?not?null,a2?int(4)?not?null,a3?int(4)?not?null,a4?int(4)?not?null ); #?創建一個復合索引 create?index?a1_a2_a3_test03?on?test03(a1,a2,a3); #?查看執行計劃 explain?select?a3?from?test03?where?a1=1?and?a2=2?and?a3=3;

結果如下:

推薦寫法:復合索引順序和使用順序一致。

下面看看【不推薦寫法】:復合索引順序和使用順序不一致。

#?查看執行計劃 explain?select?a3?from?test03?where?a3=1?and?a2=2?and?a1=3;

結果如下:

結果分析:雖然結果和上述結果一致,但是不推薦這樣寫。但是這樣寫怎么又沒有問題呢?這是由于SQL優化器的功勞,它幫我們調整了順序。

最后再補充一點:對于復合索引,不要跨列使用

#?查看執行計劃 explain?select?a3?from?test03?where?a1=1?and?a3=2?group?by?a3;

結果如下:

結果分析:a1_a2_a3是一個復合索引,我們使用a1索引后,直接跨列使用了a3,直接跳過索引a2,因此索引a3失效了,當使用a3進行分組的時候,就會出現using where。

2)單表優化

#?創建新表 create?table?book (bid?int(4)?primary?key,name?varchar(20)?not?null,authorid?int(4)?not?null,publicid?int(4)?not?null,typeid?int(4)?not?null? ); #?插入數據 insert?into?book?values(1,'tjava',1,1,2)?; insert?into?book?values(2,'tc',2,1,2)?; insert?into?book?values(3,'wx',3,2,1)?; insert?into?book?values(4,'math',4,2,3)?;

結果如下:

案例:查詢authorid=1且typeid為2或3的bid,并根據typeid降序排列。

explain? select?bid?from?book? where?typeid?in(2,3)?and?authorid=1?? order?by?typeid?desc?;

結果如下:

這是沒有進行任何優化的SQL,可以看到typ為ALL類型,extra為using filesort,可以想象這個SQL有多恐怖。

優化:添加索引的時候,要根據MySQL解析順序添加索引,又回到了MySQL的解析順序,下面我們再來看看MySQL的解析順序。

from?..?on..?join?..where?..group?by?..having?..select?dinstinct?..order?by?..limit?..

① 優化1:基于此,我們進行索引的添加,并再次查看執行計劃。

#?添加索引 create?index?typeid_authorid_bid?on?book(typeid,authorid,bid); #?再次查看執行計劃 explain? select?bid?from?book? where?typeid?in(2,3)?and?authorid=1?? order?by?typeid?desc?;

結果如下:

結果分析:結果并不是和我們想象的一樣,還是出現了using where,查看索引長度key_len=8,表示我們只使用了2個索引,有一個索引失效了。

② 優化2:使用了in有時候會導致索引失效,基于此有了如下一種優化思路。

將in字段放在最后面。需要注意一點:每次創建新的索引的時候,最好是刪除以前的廢棄索引,否則有時候會產生干擾(索引之間)。

#?刪除以前的索引 drop?index?typeid_authorid_bid?on?book; #?再次創建索引 create?index?authorid_typeid_bid?on?book(authorid,typeid,bid); #?再次查看執行計劃 explain? select?bid?from?book? where?authorid=1??and?typeid?in(2,3)?? order?by?typeid?desc?;

結果如下:

結果分析:這里雖然沒有變化,但是這是一種優化思路。

總結如下:

a.最佳做前綴,保持索引的定義和使用的順序一致性

b.索引需要逐步優化(每次創建新索引,根據情況需要刪除以前的廢棄索引)

c.將含In的范圍查詢,放到where條件的最后,防止失效。

本例中同時出現了Using where(需要回原表); Using index(不需要回原表):原因,where authorid=1 and typeid in(2,3)中authorid在索引(authorid,typeid,bid)中,因此不需要回原表(直接在索引表中能查到);而typeid雖然也在索引(authorid,typeid,bid)中,但是含in的范圍查詢已經使該typeid索引失效,因此相當于沒有typeid這個索引,所以需要回原表(using where);

例如以下沒有了In,則不會出現using where:

explain?select?bid?from?book? where??authorid=1?and?typeid?=3 order?by?typeid?desc?;

結果如下:

3)兩表優化

#?創建teacher2新表 create?table?teacher2 (tid?int(4)?primary?key,cid?int(4)?not?null ); #?插入數據 insert?into?teacher2?values(1,2); insert?into?teacher2?values(2,1); insert?into?teacher2?values(3,3); #?創建course2新表 create?table?course2 (cid?int(4)?,cname?varchar(20) ); #?插入數據 insert?into?course2?values(1,'java'); insert?into?course2?values(2,'python'); insert?into?course2?values(3,'kotlin');

案例:使用一個左連接,查找教java課程的所有信息。

explain? select?* from?teacher2?t? left?outer?join?course2?c on?t.cid=c.cid? where?c.cname='java';

結果如下:

① 優化

對于兩張表,索引往哪里加?答:對于表連接,小表驅動大表。索引建立在經常使用的字段上。

為什么小表驅動大表好一些呢?

小表:10大表:300 #?小表驅動大表 select?...where?小表.x10=大表.x300?; for(int?i=0;i<小表.length10;i++) {for(int?j=0;j<大表.length300;j++){...} } #?大表驅動小表 select?...where?大表.x300=小表.x10?; for(int?i=0;i<大表.length300;i++) {for(int?j=0;j<小表.length10;j++){...} }

分析:以上2個FOR循環,最終都會循環3000次;但是對于雙層循環來說:一般建議,將數據小的循環,放外層。數據大的循環,放內層。不用管這是為什么,這是編程語言的一個原則,對于雙重循環,外層循環少,內存循環大,程序的性能越高。

結論:當編寫【…on t.cid=c.cid】時,將數據量小的表放左邊(假設此時t表數據量小,c表數據量大。)

我們已經知道了,對于兩表連接,需要利用小表驅動大表,例如【…on t.cid=c.cid】,t如果是小表(10條),c如果是大表(300條),那么t每循環1次,就需要循環300次,即t表的t.cid字段屬于,經常使用的字段,因此需要給cid字段添加索引。

更深入的說明:一般情況下,左連接給左表加索引。右連接給右表加索引。其他表需不需要加索引,我們逐步嘗試。

#?給左表的字段加索引 create?index?cid_teacher2?on?teacher2(cid); #?查看執行計劃 explain? select?* from?teacher2?t? left?outer?join?course2?c on?t.cid=c.cid? where?c.cname='java';

結果如下:

當然你可以下去接著優化,給cname添加一個索引。索引優化是一個逐步的過程,需要一點點嘗試。

#?給cname的字段加索引 create?index?cname_course2?on?course2(cname); #?查看執行計劃 explain? select?t.cid,c.cname from?teacher2?t? left?outer?join?course2?c on?t.cid=c.cid? where?c.cname='java';

結果如下:

最后補充一個:Using join buffer是extra中的一個選項,表示Mysql引擎使用了“連接緩存”,即MySQL底層動了你的SQL,你寫的太差了。

4)三表優化

  • 大于等于張表,優化原則一樣

  • 小表驅動大表

  • 索引建立在經常查詢的字段上

7、避免索引失效的一些原則

① 復合索引需要注意的點

  • 復合索引,不要跨列或無序使用(最佳左前綴)

  • 復合索引,盡量使用全索引匹配,也就是說,你建立幾個索引,就使用幾個索引

② 不要在索引上進行任何操作(計算、函數、類型轉換),否則索引失效

explain?select?*?from?book?where?authorid?=?1?and?typeid?=?2; explain?select?*?from?book?where?authorid*2?=?1?and?typeid?=?2?;

結果如下:

③ 索引不能使用不等于(!= <>)或is null (is not null),否則自身以及右側所有全部失效(針對大多數情況)。復合索引中如果有>,則自身和右側索引全部失效。

#?針對不是復合索引的情況 explain?select?*?from?book?where?authorid?!=?1?and?typeid?=2?; explain?select?*?from?book?where?authorid?!=?1?and?typeid?!=2?;

結果如下:

再觀看下面這個案例:

#?刪除單獨的索引 drop?index?authorid_index?on?book; drop?index?typeid_index?on?book; #?創建一個復合索引 alter?table?book?add?index?idx_book_at?(authorid,typeid); #?查看執行計劃 explain?select?*?from?book?where?authorid?>?1?and?typeid?=?2?; explain?select?*?from?book?where?authorid?=?1?and?typeid?>?2?;

結果如下:

結論:復合索引中如果有【>】,則自身和右側索引全部失效。

在看看復合索引中有【<】的情況:

我們學習索引優化 ,是一個大部分情況適用的結論,但由于SQL優化器等原因 該結論不是100%正確。一般而言, 范圍查詢(> < in),之后的索引失效。

④ SQL優化,是一種概率層面的優化。至于是否實際使用了我們的優化,需要通過explain進行推測。

#?刪除復合索引 drop?index?authorid_typeid_bid?on?book; #?為authorid和typeid,分別創建索引 create?index?authorid_index?on?book(authorid); create?index?typeid_index?on?book(typeid); #?查看執行計劃 explain?select?*?from?book?where?authorid?=?1?and?typeid?=2?;

結果如下:

結果分析:我們創建了兩個索引,但是實際上只使用了一個索引。因為對于兩個單獨的索引,程序覺得只用一個索引就夠了,不需要使用兩個。

當我們創建一個復合索引,再次執行上面的SQL:

#?查看執行計劃 explain?select?*?from?book?where?authorid?=?1?and?typeid?=2?;

結果如下:

⑤ 索引覆蓋,百分之百沒問題

⑥ like盡量以“常量”開頭,不要以’%'開頭,否則索引失效

explain?select?*?from?teacher?where?tname?like?"%x%"?; explain?select?*?from?teacher??where?tname?like?'x%'; explain?select?tname?from?teacher??where?tname?like?'%x%';

結果如下:

結論如下:like盡量不要使用類似"%x%"情況,但是可以使用"x%"情況。如果非使用 "%x%"情況,需要使用索引覆蓋。

⑦ 盡量不要使用類型轉換(顯示、隱式),否則索引失效

explain?select?*?from?teacher?where?tname?=?'abc'?; explain?select?*?from?teacher?where?tname?=?123?;

結果如下:

⑧ 盡量不要使用or,否則索引失效

explain?select?*?from?teacher?where?tname?=''?and?tcid?>1?; explain?select?*?from?teacher?where?tname?=''?or?tcid?>1?;

結果如下:

注意:or很猛,會讓自身索引和左右兩側的索引都失效。

8、一些其他的優化方法

1)exists和in的優化

如果主查詢的數據集大,則使用i關鍵字,效率高。

如果子查詢的數據集大,則使用exist關鍵字,效率高。

select?..from?table?where?exist?(子查詢)?; select?..from?table?where?字段?in??(子查詢)?;

2)order by優化

  • IO就是訪問硬盤文件的次數

  • using filesort 有兩種算法:雙路排序、單路排序(根據IO的次數)

  • MySQL4.1之前默認使用雙路排序;雙路:掃描2次磁盤(1:從磁盤讀取排序字段,對排序字段進行排序(在buffer中進行的排序)2:掃描其他字段)

  • MySQL4.1之后默認使用單路排序:只讀取一次(全部字段),在buffer中進行排序。但種單路排序會有一定的隱患(不一定真的是“單路/1次IO”,有可能多次IO)。原因:如果數據量特別大,則無法將所有字段的數據一次性讀取完畢,因此會進行“分片讀取、多次讀取”。

  • 注意:單路排序 比雙路排序 會占用更多的buffer。

  • 單路排序在使用時,如果數據大,可以考慮調大buffer的容量大小:

#?不一定真的是“單路/1次IO”,有可能多次IO set?max_length_for_sort_data?=?1024

如果max_length_for_sort_data值太低,則mysql會自動從 單路->雙路(太低:需要排序的列的總大小超過了max_length_for_sort_data定義的字節數)

① 提高order by查詢的策略:

  • 選擇使用單路、雙路 ;調整buffer的容量大小

  • 避免使用select * …(select后面寫所有字段,也比寫*效率高)

  • 復合索引,不要跨列使用 ,避免using filesort保證全部的排序字段,排序的一致性(都是升序或降序)

篇幅很長,內容較多,建議收藏。

點擊下方卡片進行關注,獲取更多內容

點分享

點收藏

點點贊

點在看

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的18000字的SQL优化大全,收藏直接起飞!的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

在线观看av黄色 | 久久另类小说 | 国内精品福利视频 | 伊人色播 | 中文字幕国语官网在线视频 | 天天爽天天搞 | 国产高清在线观看av | 日韩免 | 伊人天堂久久 | 观看免费av| 成人在线免费视频观看 | 特级西西444www大胆高清无视频 | 怡红院成人在线 | 丁香婷婷久久久综合精品国产 | 免费在线国产视频 | 免费观看国产精品视频 | 精品亚洲视频在线 | 久久99精品波多结衣一区 | 亚洲五月激情 | 国产视频中文字幕 | 在线亚洲欧美日韩 | 97精品国产一二三产区 | 国产精品www | 亚洲精品视 | 狠狠干夜夜操 | 国产亚洲精品av | 探花视频免费观看高清视频 | 久久久久五月天 | 大荫蒂欧美视频另类xxxx | 色综合久久久久久久久五月 | 免费进去里的视频 | 日本中文字幕在线一区 | 中文字幕在| 99久久精品免费看 | 亚洲精品久久久蜜桃直播 | a'aaa级片在线观看 | 久久久久久久久久久久影院 | 天天曰天天爽 | 亚洲精品美女久久17c | 一区二区三区免费在线 | av高清免费在线 | 欧美最爽乱淫视频播放 | 韩国一区二区在线观看 | 亚洲精品美女久久久 | 欧美另类一二三四区 | 久久在线影院 | 久久国产影视 | av免费看电影 | 看污网站| 亚洲视频一区二区三区在线观看 | av成人动漫在线观看 | 在线播放 亚洲 | 国产精品6 | 亚洲综合在线视频 | 婷婷久久国产 | 91视频首页 | 麻豆一区二区 | av大全在线看 | 婷婷视频在线播放 | 又黄又色又爽 | 国产一级二级在线播放 | 久在线观看视频 | 香蕉在线观看 | 亚洲国产精品视频 | 久久国产欧美日韩精品 | 91在线最新 | 日韩精品 在线视频 | 伊人五月天.com| 91视频中文字幕 | 黄色成人在线 | av中文字幕不卡 | 伊人永久 | 国产精品久久久久免费a∨ 欧美一级性生活片 | 黄污视频网站 | 日韩视频免费观看高清完整版在线 | 在线观看播放av | 日韩欧美网站 | 国产精品热视频 | 五月综合色婷婷 | 一区二区三区中文字幕在线观看 | 婷婷精品国产欧美精品亚洲人人爽 | 久久午夜剧场 | av不卡中文| 久久人人97超碰com | 欧美一区二区三区免费看 | 日韩手机视频 | 国产va饥渴难耐女保洁员在线观看 | 国产亚洲精品久久久久动 | 国产婷婷精品av在线 | 免费不卡中文字幕视频 | 成人影音av| 日韩精品一区二区免费 | 天天久久综合 | 国产精品不卡在线观看 | 国产精品久久久久久久久久免费看 | 久久ww | 成人av一级片 | 成年人在线免费看视频 | 最近在线中文字幕 | 欧美久久成人 | 九九九九九九精品任你躁 | 最近中文字幕免费观看 | 欧美国产日韩一区 | 免费久久片 | 国产一区二区影院 | 天堂久久电影网 | 天天操夜夜爱 | a级国产乱理论片在线观看 伊人宗合网 | 男女视频国产 | 免费黄色av电影 | 国产中文字幕一区二区三区 | 久久久久女人精品毛片 | 国产精品电影一区 | 久久亚洲精品国产亚洲老地址 | 精品国产视频在线观看 | 69av免费视频 | 99精品免费网 | 中文字幕在线日亚洲9 | 欧美在线观看小视频 | 久久手机视频 | 日韩欧美69 | 国产91小视频 | 麻豆视频国产在线观看 | 亚洲欧洲视频 | 免费三级大片 | 在线播放视频一区 | 五月婷婷六月综合 | 99国产一区| 黄色小说网站在线 | 五月婷av | 久久精品亚洲 | 五月天久久综合网 | 天天插天天干天天操 | 东方av在 | 成人h视频 | 国产精品成久久久久三级 | 91资源在线视频 | 久久国产网 | 久久久久久国产精品免费 | 日韩一区二区三区观看 | 精品人人爽 | 日韩电影黄色 | 久久综合精品国产一区二区三区 | 免费在线观看91 | 国产高清在线精品 | 波多野结衣亚洲一区二区 | 色综久久 | 国产精品视频在线观看 | 亚洲三级毛片 | 欧美夫妻性生活电影 | 色久天| 日韩电影中文字幕在线观看 | 亚洲人毛片 | 免费视频 你懂的 | 国产麻豆精品久久一二三 | 香蕉在线影院 | 欧美日韩三级在线观看 | 国产中文字幕在线看 | 91爱爱免费观看 | 亚洲精品色视频 | 精品国产91亚洲一区二区三区www | 中文字幕丝袜制服 | 国产精品永久在线 | 亚洲mv大片欧洲mv大片免费 | 8x成人免费视频 | 成人手机在线视频 | 亚洲欧美日韩一区二区三区在线观看 | 国产玖玖在线 | 美女久久一区 | 日韩视频一区二区三区在线播放免费观看 | 国产精品一区二区三区在线播放 | 99久国产| 久久国产一区 | 日韩视频免费 | 婷婷午夜 | 婷婷视频 | 国产精品一区二区在线免费观看 | 黄色网址中文字幕 | 成人app在线免费观看 | 中文字幕4| 蜜桃传媒一区二区 | 日韩久久精品一区二区 | 精品久久五月天 | 综合网成人 | 97av视频| 69国产精品视频免费观看 | 久草视频中文在线 | 夜夜澡人模人人添人人看 | 国内久久精品视频 | 国产精品一区一区三区 | 精品久久精品久久 | 久久亚洲国产精品 | 欧美久久久久久久久中文字幕 | 国产在线视频资源 | 国产精品久久久一区二区 | 成年人免费在线观看 | 99亚洲视频 | wwwwww色| 一区视频在线 | 成人a大片 | 欧美国产日韩一区二区 | 色综合久久久久久久久五月 | 国产露脸91国语对白 | 国产精品黄色在线观看 | 欧美色婷婷| 黄色a一级片 | 国产精品粉嫩 | 久av电影 | 国产精品成人免费精品自在线观看 | 福利av影院 | 日本中文字幕观看 | 久久欧美精品 | 久久人人爽av | 香蕉视频免费看 | 人人爱爱人人 | jizz999| 国产精品99精品久久免费 | 最近中文字幕高清字幕免费mv | 国产色综合天天综合网 | 亚洲香蕉视频 | 91桃色在线观看视频 | 国产黄色看片 | www.夜夜夜| 成人av亚洲 | 一级一片免费视频 | 欧美一区二区视频97 | 日韩电影一区二区三区在线观看 | 欧美 亚洲 另类 激情 另类 | 欧美日韩亚洲一 | 国产一级电影网 | 最近中文字幕mv | 久久网页| 在线观看成人福利 | 日日干夜夜干 | 天天插夜夜操 | 夜色资源网 | 亚洲经典在线 | 国产精品视频在线观看 | 欧美一二三区在线观看 | 一区二区视频在线看 | 黄色成年网站 | 麻豆91在线观看 | 天天干天天干天天色 | 久久歪歪| 欧美综合久久 | 亚洲第一区在线观看 | 超碰在线日韩 | 久久久久久久久久亚洲精品 | 欧美夫妻性生活电影 | 亚洲永久精品国产 | 免费a现在观看 | 一级片视频免费观看 | 国产免费三级在线观看 | 亚洲一区二区麻豆 | av在线播放一区二区三区 | 久久精品区 | 中文字幕视频一区 | 久久久久久久久久久精 | 超碰在线人人艹 | 狠狠操影视 | 亚洲精品久久久久久久不卡四虎 | 99资源网| 国产视频 久久久 | 狠狠狠狠狠干 | 在线成人免费av | 日韩超碰 | 五月婷婷激情 | 久久尤物电影视频在线观看 | 六月婷色 | 国产精品久久在线观看 | 久久超级碰视频 | 亚洲精品美女久久久久网站 | 欧洲精品久久久久毛片完整版 | 亚洲国产精品va在线看 | 三级视频国产 | 青青草久草在线 | 国产精品乱码一区二区视频 | 国产一区二区三区视频在线 | 久久一区二区三区四区 | 二区三区中文字幕 | 亚洲香蕉在线观看 | 欧美一区免费观看 | 在线观看91av| 九九欧美视频 | 国产日韩精品一区二区三区 | 亚色视频在线观看 | 天天操天天操天天操天天操天天操天天操 | 黄色特级一级片 | 国产精品久久久久久久久久久久久久 | 欧美精品在线观看一区 | 91在线看 | 麻豆91精品91久久久 | 国产69精品久久久久9999apgf | 午夜精品视频在线 | 亚洲精品在线网站 | 日韩久久久久久久久久久久 | 日韩欧美国产视频 | 人人看人人做人人澡 | 中文字幕中文字幕中文字幕 | 又长又大又黑又粗欧美 | 在线三级av | 岛国大片免费视频 | 国产综合精品一区二区三区 | 久久精品精品 | 日韩视频一区二区在线 | 91pony九色丨交换 | 色999在线| 狠狠地日 | 亚洲精品在线播放视频 | av福利网址导航大全 | 国产日韩精品欧美 | 国产色在线 | 五月综合色婷婷 | 伊人资源视频在线 | 国产成人a亚洲精品v | 成人小视频在线播放 | 国产人成在线观看 | 天堂在线免费视频 | 深爱激情综合网 | 国产剧情在线一区 | 国产精品99久久99久久久二8 | 亚洲日本三级 | 中文一区在线 | 91完整视频 | 中文字幕av一区二区三区四区 | 国产精品一区久久久久 | 91看片淫黄大片在线播放 | 韩国视频一区二区三区 | 国产一卡久久电影永久 | 三级黄色免费 | 精品日本视频 | 中文字幕免费成人 | 奇米网777 | 日韩黄视频 | 五月天天天操 | 丁香五婷| 香蕉视频免费看 | 久草www| 成人黄色小视频 | 色网站国产精品 | 香蕉久草| 精品一区二区亚洲 | 国产精品黑丝在线观看 | 日韩一区二区久久 | 高清av网| 久久国产精品小视频 | 免费看一级特黄a大片 | 国产精品久久久av久久久 | 伊人电影在线观看 | 美女网站视频免费黄 | 69夜色精品国产69乱 | 国产剧情久久 | 免费能看的黄色片 | 国产成人精品亚洲日本在线观看 | 欧美成人影音 | 天天色官网 | av日韩不卡| 日韩免费在线视频观看 | 在线国产片 | 天天干天天摸天天操 | 在线观看免费版高清版 | 天天爱综合 | 亚洲视频精选 | 欧美成年黄网站色视频 | 狠狠色丁香婷综合久久 | 天天干天天干天天射 | 亚洲蜜桃在线 | 国产亚洲午夜高清国产拍精品 | 九月婷婷人人澡人人添人人爽 | 天天操福利视频 | a一片一级 | 成人在线免费av | 激情综合久久 | 亚洲精品在线免费看 | 国产资源在线播放 | 精品视频久久久久久 | 国产中文字幕第一页 | 91精品播放 | 亚洲视屏 | 一区二区三区在线免费观看 | 伊人开心激情 | 国产精品激情偷乱一区二区∴ | 麻豆91视频 | 日韩综合视频在线观看 | 欧美一区二区三区四区夜夜大片 | 国产亚洲欧美精品久久久久久 | 国产成人精品一区二区三区福利 | 免费在线观看国产黄 | 婷婷激情综合网 | 亚洲高清视频一区二区三区 | 婷婷丁香五 | 日日麻批40分钟视频免费观看 | 国产96在线观看 | 麻花豆传媒mv在线观看网站 | 2024av在线播放| 亚洲视频2 | 天天草网站 | 国产精品一区二区果冻传媒 | 中文字幕av全部资源www中文字幕在线观看 | 国产字幕在线看 | 亚洲国产成人在线观看 | 欧日韩在线视频 | 日韩高清在线观看 | 中文在线免费一区三区 | 久久精品在线免费观看 | 成人在线观看免费 | 91精品视频播放 | 久久成人在线视频 | 黄色av电影网 | 中文字幕视频免费观看 | 久草在线视频资源 | 精品久久久精品 | 在线看国产一区 | 天天操夜夜操 | 亚洲综合小说 | 色综合天天色 | 中文字幕在线观看91 | 一区久久久| 亚洲精品视频在线免费播放 | 2024国产精品视频 | zzijzzij亚洲日本少妇熟睡 | 亚洲 欧美 91 | 亚洲开心激情 | 五月香视频在线观看 | 小草av在线播放 | 日韩理论影院 | 日日成人网 | 最新中文字幕在线资源 | 九九九热精品免费视频观看 | 久久精品伊人 | 888av | 天天操天天射天天 | 国产精品免费在线播放 | 欧美亚洲精品在线观看 | 成年人在线免费看视频 | 一级成人免费 | 国产一级a毛片视频爆浆 | 97精品国产97久久久久久春色 | 婷婷伊人综合亚洲综合网 | 欧美日韩亚洲在线观看 | 欧美激情视频三区 | 久久久国产精品网站 | 久久久久久久免费看 | 91黄色成人 | 91一区二区三区久久久久国产乱 | 99久国产 | 成 人 黄 色 视频播放1 | 超碰在线最新网址 | 欧美一区二区精美视频 | 激情在线免费视频 | 欧美最爽乱淫视频播放 | 久久第四色| 国产午夜激情视频 | 国产在线色 | 日韩经典一区二区三区 | 日韩av在线免费看 | 久久在线播放 | 亚洲综合色激情五月 | 日韩三级av| 97国产大学生情侣酒店的特点 | 国产中年夫妇高潮精品视频 | 西西大胆啪啪 | 久久久久女人精品毛片九一 | 久久视频这里有久久精品视频11 | 中文字幕高清 | 国产一级a毛片视频爆浆 | 精品国产综合区久久久久久 | 久久这里只有精品视频99 | 在线观看国产91 | 免费色av | 97**国产露脸精品国产 | 中文字幕一二三区 | 色丁香色婷婷 | 精品欧美一区二区三区久久久 | 美女性爽视频国产免费app | 欧美日韩久久久 | 国产精品美女久久久免费 | 免费色网| 97在线视频网站 | 久久人人插 | 欧美日韩精品影院 | 男女拍拍免费视频 | 最近日本字幕mv免费观看在线 | 亚洲激精日韩激精欧美精品 | 69亚洲乱| 日日夜夜操操操操 | 久久99视频免费 | 国产伦精品一区二区三区在线 | 欧美精品天堂 | 99爱在线| 国产精品爽爽爽 | 欧美日产在线观看 | 97超碰在线人人 | 成人午夜电影在线观看 | 天天操天天弄 | 伊人天堂久久 | 日韩在线中文字幕视频 | 九九九视频在线 | 天天干天天拍天天操 | 成人在线观看资源 | 免费男女羞羞的视频网站中文字幕 | 亚州视频在线 | 在线观看av大片 | 一区三区在线欧 | 日本中文在线观看 | 国产97在线观看 | 亚洲精品国产精品国自产观看浪潮 | 久久99久久精品 | 亚洲性xxxx | 91精品在线免费观看视频 | 91精品一区二区三区蜜臀 | 欧美日韩另类在线 | 国产一区黄色 | 天天鲁天天干天天射 | av片一区二区| 国产黄色精品在线观看 | 欧美国产日韩在线观看 | 久久精品香蕉视频 | 欧美激情第一页xxx 午夜性福利 | 色久天| 日韩免费高清 | www.av中文字幕.com | 人人草在线视频 | 久草视频观看 | 在线免费观看黄色小说 | 99久久影视 | 中文字幕一区二区三区久久 | 超碰在线人人 | 久久夜色精品国产亚洲aⅴ 91chinesexxx | 一区二区三区av在线 | 日韩中文字幕视频在线观看 | 狠狠色丁香久久综合网 | 手机av观看| 天天色综合天天 | 欧美成人免费在线 | 国产一区二区高清 | 色永久免费视频 | 久久桃花网 | 国产黄大片在线观看 | 天天干天天干天天 | 97免费视频在线播放 | 久久精品永久免费 | 亚洲一区美女视频在线观看免费 | 亚洲综合日韩在线 | av色影院 | 在线a视频 | 久久精品视频播放 | 97电影手机| 国产精品久久久久久一区二区三区 | 日韩免费中文字幕 | 国产 日韩 中文字幕 | 欧美日韩免费在线视频 | 黄色片毛片| 国产 欧美 日本 | 欧美亚洲国产一卡 | 91精品欧美一区二区三区 | 国产精品1区2区 | 精品国产伦一区二区三区 | 黄网在线免费观看 | 一区二区三区在线视频111 | 97超碰.com| 日韩精品专区在线影院重磅 | 国产一级在线 | 麻豆综合网 | 婷婷香蕉 | 婷婷色网址 | 欧美日韩国产在线 | 久久精品一区二区国产 | 在线国产一区二区 | 国产护士hd高朝护士1 | 国产精品激情在线观看 | 久久九九精品久久 | 国产成人精品999 | 99r在线精品| 日韩在线一区二区免费 | 福利视频网址 | 日本在线中文 | 日本婷婷色| 综合色婷婷 | 欧美精品久久久久久久久老牛影院 | 国产精品1区 | 国产精品毛片久久久久久久久久99999999 | 国产成人av在线 | 成人av免费播放 | 又黄又爽又无遮挡的视频 | 999久久国产精品免费观看网站 | 91久久国产综合精品女同国语 | 日韩精品一区二区三区中文字幕 | 天堂av在线网址 | 亚洲欧美日韩国产 | 久久免费视屏 | 天天干 夜夜操 | 超碰在线公开 | 国产成人精品三级 | 黄色免费在线视频 | 色姑娘综合网 | 国产一级视屏 | 97超碰资源总站 | 国产精品aⅴ | 国产免费精彩视频 | 99视频国产精品免费观看 | 欧美日韩精品在线 | 久草在线视频免费资源观看 | 在线观看视频日韩 | av日韩精品 | 久久不卡免费视频 | 亚洲国产字幕 | 99精品视频在线观看视频 | av资源中文字幕 | 国产精品丝袜在线 | 国产精品精品国产 | 黄色三级久久 | 波多野结衣在线观看一区 | 五月婷婷久草 | 91成品人影院 | 超碰97公开| 黄色av电影 | 中文字幕精品一区 | 在线观看国产日韩欧美 | 午夜骚影 | 超级av在线| 99久久久成人国产精品 | 黄色激情网址 | 亚洲激情国产精品 | 色狠狠操| 久久小视频 | 狠狠狠狠狠狠 | av在线网站免费观看 | 五月婷婷六月丁香激情 | 久久a热6 | 国产综合精品久久 | 国产 在线 日韩 | 国产成人精品综合久久久 | 国产精品美女在线 | 亚欧日韩成人h片 | 国产精品激情 | 97成人精品视频在线观看 | 久久免费国产精品1 | 日韩在线资源 | 中文字幕成人 | 在线а√天堂中文官网 | 国产精品高清一区二区三区 | 黄色福利网 | 免费a一级 | 视频二区在线 | 欧美 日韩 国产 中文字幕 | 日韩av进入 | 国产亚洲精品久久久久久久久久久久 | 日韩欧美一区二区三区在线观看 | 中文字幕视频一区 | 一区二区在线不卡 | 亚洲国内精品在线 | 国产精品久久久久久久7电影 | 丝袜美女视频网站 | www九九热 | 人人插超碰 | 国产v欧美 | 黄色在线成人 | 久久久久久蜜av免费网站 | 亚洲狠狠婷婷综合久久久 | 免费看91的网站 | 久久久电影 | 亚洲日本三级 | 日本中文字幕视频 | 黄色小网站免费看 | 国内成人精品视频 | 国产亚洲精品久久久久久 | 亚洲天天摸日日摸天天欢 | 麻豆传媒视频在线 | 亚洲免费一级 | 久久久精品欧美一区二区免费 | 免费观看av网站 | 天天色天天色天天色 | 久久人人爽av | 91av中文字幕 | 色婷丁香 | 91人人视频在线观看 | 96久久久| 欧美精品久久久久久久久久白贞 | 欧美伦理一区 | 日韩激情中文字幕 | 福利视频| 免费又黄又爽 | 午夜精品久久久久久中宇69 | 精品美女在线视频 | 国产女人18毛片水真多18精品 | 日韩在线免费看 | 色综合久久久久综合 | 亚洲综合精品在线 | www久| 五月视频| 亚洲精品2区 | 精品一区二区免费在线观看 | 五月天天av | 西西4444www大胆视频 | 久久黄色网页 | 亚洲精品国产精品国自产在线 | 黄色网www| 一区二区视频在线观看免费 | 日韩美在线观看 | 日韩专区中文字幕 | 日韩网站免费观看 | 天天干天天射天天插 | 碰超人人 | 日韩黄色在线观看 | 欧美一区二区三区激情视频 | 亚洲精品在线免费播放 | 天天操天天操一操 | 91在线看| 免费看片网站91 | 成人精品视频久久久久 | 91成人精品一区在线播放 | 中文字幕视频在线播放 | 亚洲 欧美日韩 国产 中文 | 天堂av一区二区 | 欧美爽爽爽 | 久久激情视频 久久 | 911精品美国片911久久久 | 成人影音在线 | 国产视频在线看 | 久操免费视频 | 激情网五月婷婷 | 91成人免费在线视频 | 久久久久久久久久久久影院 | 国产精彩在线视频 | 日韩精品亚洲专区在线观看 | 欧美激情视频一区二区三区 | 2018好看的中文在线观看 | 亚洲国产电影在线观看 | 中文字幕国产亚洲 | 麻花豆传媒mv在线观看网站 | 国产精品99久久久久 | 91精品专区 | 国产免费三级在线观看 | 五月婷婷色丁香 | 成人黄色在线 | 黄色一级网 | 国产精品中文 | 91喷水| 黄色网址中文字幕 | 91精品久久久久久久久 | 亚洲精品国产精品久久99热 | 99久久999久久久精玫瑰 | 国产+日韩欧美 | 91精品国产综合久久久久久久 | 中日韩男男gay无套 日韩精品一区二区三区高清免费 | 国产亚洲一区二区在线观看 | 亚洲va综合va国产va中文 | 亚洲一区二区三区毛片 | 在线免费黄色 | 97精品视频在线播放 | 热久久视久久精品18亚洲精品 | 欧美日韩中文在线视频 | 久久国产精品99久久久久久老狼 | www色网站 | 九九九九色 | 中日韩三级视频 | 午夜av一区二区三区 | 免费网站观看www在线观看 | 午夜精品久久久久 | 在线观看免费黄色 | 国产不卡av在线播放 | 日韩色视频在线观看 | 在线观看成人毛片 | www.亚洲视频 | 国产成人三级 | 91视频91蝌蚪 | 国产视频精品免费 | 国内免费久久久久久久久久久 | 一区二区中文字幕在线观看 | av黄色影院 | 这里只有精品视频在线 | 国产69精品久久久久99 | 国产精品乱码在线 | 超碰人在线 | 婷婷丁香激情五月 | 日韩免费不卡av | 黄色av三级在线 | 99热手机在线 | 久久精品99久久久久久2456 | 欧美一级裸体视频 | 国偷自产中文字幕亚洲手机在线 | 日本激情中文字幕 | 亚洲一区视频免费观看 | 久久成人午夜视频 | 97超级碰碰碰视频在线观看 | 欧美日韩在线观看一区 | 日韩色爱| 日韩精品中文字幕一区二区 | 日日夜夜天天操 | 日本中文字幕免费观看 | 久久亚洲专区 | 伊人中文网 | 激情婷婷av | 国产 视频 久久 | 91在线亚洲 | 国产伦精品一区二区三区无广告 | 免费视频99 | 色人久久| 国内精品久久久久久久久久清纯 | 一区二区三区在线影院 | 91chinesexxx| 在线免费中文字幕 | 婷婷av在线 | 日日干天天射 | 99在线高清视频在线播放 | 久久99久久99精品免费看小说 | 久久精品aaa | 伊人色**天天综合婷婷 | 玖操| 丁香伊人网 | 国产中文字幕久久 | 99久久久国产精品 | 国产一二区在线观看 | 人人插人人 | 成年人黄色在线观看 | 91成人看片 | 欧美久久久久久久久久久久 | 91视频免费网站 | 国产色女人 | 一区二区三区日韩视频在线观看 | 青青河边草免费视频 | 亚洲精品自拍 | 综合久久久久久 | 国产盗摄精品一区二区 | 国产视频一二区 | 久久dvd| 在线观看午夜 | 五月婷婷综合在线观看 | 狠狠色伊人亚洲综合网站野外 | 亚洲精品福利在线观看 | 麻豆你懂的 | 久久久资源 | 久久男人中文字幕资源站 | av在线免费播放 | 日韩免费在线 | 黄色软件视频大全免费下载 | 在线视频久 | 国产精品美女www爽爽爽视频 | 国产一区二区精品久久91 | 国产资源精品在线观看 | 香蕉免费在线 | 91久久电影 | 99久久国产免费看 | 亚洲美女精品 | 中文字幕视频在线播放 | 天堂麻豆 | 亚洲精品视频中文字幕 | 成人免费视频网站在线观看 | 成人免费xxx在线观看 | 天天操操操操操操 | 天天天天天天操 | 国产精品久久久久久久久久久久冷 | 国产精品久久一区二区三区, | 日本久久久精品视频 | 久久永久免费 | 午夜久草| 91九色最新 | 久久久久电影网站 | 成人黄色av免费在线观看 | 91精品在线视频 | 中文字幕免费不卡视频 | 人人狠狠综合久久亚洲婷 | 五月综合网站 | 午夜精品成人一区二区三区 | 亚洲乱码中文字幕综合 | 国产成人一区二区在线观看 | 97在线观看 | 制服丝袜在线 | av观看在线观看 | 亚洲精品高清一区二区三区四区 | 天天摸日日摸人人看 | 日本黄色免费观看 | 成人理论电影 | 人人爽人人爽av | 91av超碰| 91精品免费视频 | 91色在线观看 | 欧美精品一区二区免费 | 色婷婷激情电影 | 精品欧美一区二区在线观看 | 久久久www免费电影网 | 国产精品免费久久久 | 岛国大片免费视频 | 国产又粗又猛又色 | 特级黄录像视频 | 天海翼一区二区三区免费 | 欧美一区二区精品在线 | 十八岁免进欧美 | av在线播放快速免费阴 | 在线观看视频一区二区三区 | 中文字幕精品在线 | 97超在线| 亚洲精品999 | 国产精品国产三级在线专区 | 国产日韩视频在线 | 久久婷婷色综合 | 丁香婷婷激情国产高清秒播 | 激情图片区 | 婷婷色站 | 久草9视频 | 激情久久五月天 | av色综合网| 蜜臀精品久久久久久蜜臀 | 香蕉久久久久久久 | 91麻豆操 | 激情av网址| 91九色最新地址 | 我爱av激情网| 干干夜夜 | 天天躁日日躁狠狠躁av中文 | 精品国精品自拍自在线 | 色婷婷视频网 | 欧美色伊人 | 日日夜夜综合 | 成人黄色小说在线观看 | 国产最新视频在线 | 久久综合欧美精品亚洲一区 | 毛片永久新网址首页 | 欧美综合在线观看 | 亚洲精品综合欧美二区变态 | 色香com.| 久草在线视频网 | 婷婷在线观看视频 | 日韩区欧美久久久无人区 | 欧美一级电影在线观看 | 一区二区三区在线观看免费 | 狠狠操在线 | 久久精品国产99 | 亚洲一区二区三区精品在线观看 | 中文字幕 在线 一 二 | 国产午夜av | 在线观看中文字幕av | 久久草在线免费 | 免费看一级一片 | 国产精品久久久久久久久毛片 | 成年人电影免费看 | 中文字幕亚洲五码 | 久久久久久久久久久久av | 日韩理论| 亚洲爱爱视频 | 国产精品18毛片一区二区 | 久久精彩免费视频 | 久久久久久久久久久影院 | 一级黄色片在线观看 | av福利超碰网站 | 免费网站在线观看成人 | 懂色av懂色av粉嫩av分享吧 | 美女网站在线观看 | 在线成人短视频 | 日韩字幕| 国产欧美日韩一区 | 97在线观看视频国产 | 免费黄色av电影 | 国产精品人人做人人爽人人添 | 精品国产一区二区三区久久久 | 国产亚洲亚洲 | 狠狠做六月爱婷婷综合aⅴ 日本高清免费中文字幕 | 国产精品久久久毛片 | 91大神精品视频在线观看 | 狠狠干 狠狠操 | 亚洲国产中文在线 | 日韩免费区 | 毛片久久久 | 二区精品视频 | 日韩网站在线 | 亚洲首页 | 亚洲欧美综合 | 久久a v电影 | 992tv成人免费看片 | 国产美女视频一区 | 日韩av网址在线 | 久久极品| 亚洲美女视频在线 | 五月天六月婷婷 | 毛片网站在线看 | 精品国产一区二区三区久久 | 成人黄色大片在线观看 | 99热官网 | 超碰精品在线观看 | 国产精品久久久久9999吃药 | 99在线视频播放 | 亚洲激情影院 | 综合网久久 | 四虎在线免费观看 | av电影在线观看完整版一区二区 | 欧美国产日韩一区二区 | 黄色三级免费看 | 久久精品96| 五月婷婷丁香 | 国产精选在线 | 亚洲日韩中文字幕在线播放 | 亚洲国产精品小视频 | 亚洲视频电影在线 | 欧美一区影院 | 亚洲va韩国va欧美va精四季 | 337p日本欧洲亚洲大胆裸体艺术 | 国产99亚洲 |