国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

MySQL索引和SQL調優(yōu)手冊

共 9420字,需瀏覽 19分鐘

 ·

2021-01-11 21:47

來自:掘金(作者:吳德寶AllenWu)

原文鏈接:

https://juejin.im/post/5a6873fbf265da3e393a97fa

MySQL索引

MySQL支持諸多存儲引擎,而各種存儲引擎對索引的支持也各不相同,因此MySQL數(shù)據(jù)庫支持多種索引類型,如BTree索引,哈希索引,全文索引等等。為了避免混亂,本文將只關注于BTree索引,因為這是平常使用MySQL時主要打交道的索引。

MySQL官方對索引的定義為:索引(Index)是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結構。提取句子主干,就可以得到索引的本質:索引是數(shù)據(jù)結構。

MySQL索引原理

索引目的

索引的目的在于提高查詢效率,可以類比字典,如果要查“mysql”這個單詞,我們肯定需要定位到m字母,然后從下往下找到y(tǒng)字母,再找到剩下的sql。如果沒有索引,那么你可能需要把所有單詞看一遍才能找到你想要的,如果我想找到m開頭的單詞呢?或者ze開頭的單詞呢?是不是覺得如果沒有索引,這個事情根本無法完成?

咱們去圖書館借書也是一樣,如果你要借某一本書,一定是先找到對應的分類科目,再找到對應的編號,這是生活中活生生的例子,通用索引,可以加快查詢速度,快速定位。

索引原理

所有索引原理都是一樣的,通過不斷的縮小想要獲得數(shù)據(jù)的范圍來篩選出最終想要的結果,同時把隨機的事件變成順序的事件,也就是我們總是通過同一種查找方式來鎖定數(shù)據(jù)。

數(shù)據(jù)庫也是一樣,但顯然要復雜許多,因為不僅面臨著等值查詢,還有范圍查詢(>、<、between)、模糊查詢(like)、并集查詢(or)、多值匹配(in【in本質上屬于多個or】)等等。數(shù)據(jù)庫應該選擇怎么樣的方式來應對所有的問題呢?

我們回想字典的例子,能不能把數(shù)據(jù)分成段,然后分段查詢呢?最簡單的如果1000條數(shù)據(jù),1到100分成第一段,101到200分成第二段,201到300分成第三段……這樣查第250條數(shù)據(jù),只要找第三段就可以了,一下子去除了90%的無效數(shù)據(jù)。但如果是1千萬的記錄呢,分成幾段比較好?

稍有算法基礎的同學會想到搜索樹,其平均復雜度是lgN,具有不錯的查詢性能。但這里我們忽略了一個關鍵的問題,復雜度模型是基于每次相同的操作成本來考慮的,數(shù)據(jù)庫實現(xiàn)比較復雜,數(shù)據(jù)保存在磁盤上,而為了提高性能,每次又可以把部分數(shù)據(jù)讀入內存來計算,因為我們知道訪問磁盤的成本大概是訪問內存的十萬倍左右,所以簡單的搜索樹難以滿足復雜的應用場景。

索引結構

任何一種數(shù)據(jù)結構都不是憑空產(chǎn)生的,一定會有它的背景和使用場景,我們現(xiàn)在總結一下,我們需要這種數(shù)據(jù)結構能夠做些什么,其實很簡單,那就是:每次查找數(shù)據(jù)時把磁盤IO次數(shù)控制在一個很小的數(shù)量級,最好是常數(shù)數(shù)量級。那么我們就想到如果一個高度可控的多路搜索樹是否能滿足需求呢?就這樣,b+樹應運而生。

b+樹的索引結構解釋

淺藍色的塊我們稱之為一個磁盤塊,可以看到每個磁盤塊包含幾個數(shù)據(jù)項(深藍色所示)和指針(黃色所示),如磁盤塊1包含數(shù)據(jù)項17和35,包含指針P1、P2、P3,P1表示小于17的磁盤塊,P2表示在17和35之間的磁盤塊,P3表示大于35的磁盤塊。真實的數(shù)據(jù)存在于葉子節(jié)點即3、5、9、10、13、15、28、29、36、60、75、79、90、99。非葉子節(jié)點不存儲真實的數(shù)據(jù),只存儲指引搜索方向的數(shù)據(jù)項,如17、35并不真實存在于數(shù)據(jù)表中。

b+樹的查找過程

如圖所示,如果要查找數(shù)據(jù)項29,那么首先會把磁盤塊1由磁盤加載到內存,此時發(fā)生一次IO,在內存中用二分查找確定29在17和35之間,鎖定磁盤塊1的P2指針,內存時間因為非常短(相比磁盤的IO)可以忽略不計,通過磁盤塊1的P2指針的磁盤地址把磁盤塊3由磁盤加載到內存,發(fā)生第二次IO,29在26和30之間,鎖定磁盤塊3的P2指針,通過指針加載磁盤塊8到內存,發(fā)生第三次IO,同時內存中做二分查找找到29,結束查詢,總計三次IO。

真實的情況是,3層的b+樹可以表示上百萬的數(shù)據(jù),如果上百萬的數(shù)據(jù)查找只需要三次IO,性能提高將是巨大的,如果沒有索引,每個數(shù)據(jù)項都要發(fā)生一次IO,那么總共需要百萬次的IO,顯然成本非常非常高。

b+樹性質

1、通過上面的分析,我們知道間越小,數(shù)據(jù)項的數(shù)量越多,樹的高度越低。這就是為什么每個數(shù)據(jù)項,即索引字段要盡量的小,比如int占4字節(jié),要比bigint8字節(jié)少一半。這也是為什么b+樹要求把真實的數(shù)據(jù)放到葉子節(jié)點而不是內層節(jié)點,一旦放到內層節(jié)點,磁盤塊的數(shù)據(jù)項會大幅度下降,導致樹增高。當數(shù)據(jù)項等于1時將會退化成線性表。

2、當b+樹的數(shù)據(jù)項是復合的數(shù)據(jù)結構,比如(name,age,sex)的時候,b+數(shù)是按照從左到右的順序來建立搜索樹的,比如當(張三,20,F)這樣的數(shù)據(jù)來檢索的時候,b+樹會優(yōu)先比較name來確定下一步的所搜方向,如果name相同再依次比較age和sex,最后得到檢索的數(shù)據(jù);但當(20,F)這樣的沒有name的數(shù)據(jù)來的時候,b+樹就不知道下一步該查哪個節(jié)點,因為建立搜索樹的時候name就是第一個比較因子,必須要先根據(jù)name來搜索才能知道下一步去哪里查詢。

比如當(張三,F)這樣的數(shù)據(jù)來檢索時,b+樹可以用name來指定搜索方向,但下一個字段age的缺失,所以只能把名字等于張三的數(shù)據(jù)都找到,然后再匹配性別是F的數(shù)據(jù)了, 這個是非常重要的性質,即索引的最左匹配特性。

MySQL 索引實現(xiàn)

在MySQL中,索引屬于存儲引擎級別的概念,不同存儲引擎對索引的實現(xiàn)方式是不同的,本文主要討論MyISAM和InnoDB兩個存儲引擎的索引實現(xiàn)方式。

MyISAM索引實現(xiàn)

MyISAM引擎使用B+Tree作為索引結構,葉節(jié)點的data域存放的是數(shù)據(jù)記錄的地址。

下圖是MyISAM索引的原理圖:

這里設表一共有三列,假設我們以Col1為主鍵,則上圖便是一個MyISAM表的主索引(Primary key)示意圖??梢钥闯鯩yISAM的索引文件僅僅保存數(shù)據(jù)記錄的地址。在MyISAM中,主索引和輔助索引(Secondary key)在結構上沒有任何區(qū)別,只是主索引要求key是唯一的,而輔助索引的key可以重復。如果我們在Col2上建立一個輔助索引,則此索引的結構如下圖所示:

同樣也是一顆B+Tree,data域保存數(shù)據(jù)記錄的地址。因此,MyISAM中索引檢索的算法為首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,則取出其data域的值,然后以data域的值為地址,讀取相應數(shù)據(jù)記錄。

MyISAM的索引方式也叫做“非聚集”的,之所以這么稱呼是為了與InnoDB的聚集索引區(qū)分。

InnoDB索引實現(xiàn)

雖然InnoDB也使用B+Tree作為索引結構,但具體實現(xiàn)方式卻與MyISAM截然不同。

第一個重大區(qū)別是InnoDB的數(shù)據(jù)文件本身就是索引文件。從上文知道,MyISAM索引文件和數(shù)據(jù)文件是分離的,索引文件僅保存數(shù)據(jù)記錄的地址。而在InnoDB中,表數(shù)據(jù)文件本身就是按B+Tree組織的一個索引結構,這棵樹的葉節(jié)點data域保存了完整的數(shù)據(jù)記錄。這個索引的key是數(shù)據(jù)表的主鍵,因此InnoDB表數(shù)據(jù)文件本身就是主索引。

上圖是InnoDB主索引(同時也是數(shù)據(jù)文件)的示意圖,可以看到葉節(jié)點包含了完整的數(shù)據(jù)記錄。這種索引叫做聚集索引。因為InnoDB的數(shù)據(jù)文件本身要按主鍵聚集,所以InnoDB要求表必須有主鍵(MyISAM可以沒有),如果沒有顯式指定,則MySQL系統(tǒng)會自動選擇一個可以唯一標識數(shù)據(jù)記錄的列作為主鍵,如果不存在這種列,則MySQL自動為InnoDB表生成一個隱含字段作為主鍵,這個字段長度為6個字節(jié),類型為長整形。

第二個與MyISAM索引的不同是InnoDB的輔助索引data域存儲相應記錄主鍵的值而不是地址。換句話說,InnoDB的所有輔助索引都引用主鍵作為data域。例如,下圖為定義在Col3上的一個輔助索引:

這里以英文字符的ASCII碼作為比較準則。聚集索引這種實現(xiàn)方式使得按主鍵的搜索十分高效,但是輔助索引搜索需要檢索兩遍索引:首先檢索輔助索引獲得主鍵,然后用主鍵到主索引中檢索獲得記錄。

了解不同存儲引擎的索引實現(xiàn)方式對于正確使用和優(yōu)化索引都非常有幫助,例如知道了InnoDB的索引實現(xiàn)后,就很容易明白為什么不建議使用過長的字段作為主鍵,因為所有輔助索引都引用主索引,過長的主索引會令輔助索引變得過大。再例如,用非單調的字段作為主鍵在InnoDB中不是個好主意,因為InnoDB數(shù)據(jù)文件本身是一顆B+Tree,非單調的主鍵會造成在插入新記錄時數(shù)據(jù)文件為了維持B+Tree的特性而頻繁的分裂調整,十分低效,而使用自增字段作為主鍵則是一個很好的選擇。

如何建立合適的索引

建立索引的原理

一個最重要的原則是最左前綴原理,在提這個之前要先說下聯(lián)合索引,MySQL中的索引可以以一定順序引用多個列,這種索引叫做聯(lián)合索引,一般的,一個聯(lián)合索引是一個有序元組,其中各個元素均為數(shù)據(jù)表的一列。另外,單列索引可以看成聯(lián)合索引元素數(shù)為1的特例。

索引匹配的最左原則具體是說,假如索引列分別為A,B,C,順序也是A,B,C:

  • 那么查詢的時候,如果查詢【A】【A,B】 【A,B,C】,那么可以通過索引查詢

  • 如果查詢的時候,采用【A,C】,那么C這個雖然是索引,但是由于中間缺失了B,因此C這個索引是用不到的,只能用到A索引

  • 如果查詢的時候,采用【B】 【B,C】 【C】,由于沒有用到第一列索引,不是最左前綴,那么后面的索引也是用不到了

  • 如果查詢的時候,采用范圍查詢,并且是最左前綴,也就是第一列索引,那么可以用到索引,但是范圍后面的列無法用到索引

因為索引雖然加快了查詢速度,但索引也是有代價的:索引文件本身要消耗存儲空間,同時索引會加重插入、刪除和修改記錄時的負擔,另外,MySQL在運行時也要消耗資源維護索引,因此索引并不是越多越好

在使用InnoDB存儲引擎時,如果沒有特別的需要,請永遠使用一個與業(yè)務無關的自增字段作為主鍵。如果從數(shù)據(jù)庫索引優(yōu)化角度看,使用InnoDB引擎而不使用自增主鍵絕對是一個糟糕的主意。

InnoDB使用聚集索引,數(shù)據(jù)記錄本身被存于主索引(一顆B+Tree)的葉子節(jié)點上。這就要求同一個葉子節(jié)點內(大小為一個內存頁或磁盤頁)的各條數(shù)據(jù)記錄按主鍵順序存放,因此每當有一條新的記錄插入時,MySQL會根據(jù)其主鍵將其插入適當?shù)墓?jié)點和位置,如果頁面達到裝載因子(InnoDB默認為15/16),則開辟一個新的頁(節(jié)點)。如果表使用自增主鍵,那么每次插入新的記錄,記錄就會順序添加到當前索引節(jié)點的后續(xù)位置,當一頁寫滿,就會自動開辟一個新的頁。如下:

這樣就會形成一個緊湊的索引結構,近似順序填滿。由于每次插入時也不需要移動已有數(shù)據(jù),因此效率很高,也不會增加很多開銷在維護索引上。

如果使用非自增主鍵(如果身份證號或學號等),由于每次插入主鍵的值近似于隨機,因此每次新紀錄都要被插到現(xiàn)有索引頁得中間某個位置,如下:

此時MySQL不得不為了將新記錄插到合適位置而移動數(shù)據(jù),甚至目標頁面可能已經(jīng)被回寫到磁盤上而從緩存中清掉,此時又要從磁盤上讀回來,這增加了很多開銷,同時頻繁的移動、分頁操作造成了大量的碎片,得到了不夠緊湊的索引結構,后續(xù)不得不通過OPTIMIZE TABLE來重建表并優(yōu)化填充頁面。

因此,只要可以,請盡量在InnoDB上采用自增字段做主鍵。

建立索引的常用技巧

1、最左前綴匹配原則,非常重要的原則,mysql會一直向右匹配直到遇到范圍查詢(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)順序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引則都可以用到,a,b,d的順序可以任意調整。

2、=和in可以亂序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意順序,mysql的查詢優(yōu)化器會幫你優(yōu)化成索引可以識別的形式

3、盡量選擇區(qū)分度高的列作為索引,區(qū)分度的公式是count(distinct col)/count(*),表示字段不重復的比例,比例越大我們掃描的記錄數(shù)越少,唯一鍵的區(qū)分度是1,而一些狀態(tài)、性別字段可能在大數(shù)據(jù)面前區(qū)分度就是0,那可能有人會問,這個比例有什么經(jīng)驗值嗎?使用場景不同,這個值也很難確定,一般需要join的字段我們都要求是0.1以上,即平均1條掃描10條記錄

4、索引列不能參與計算,保持列“干凈”,比如from_unixtime(create_time) = ’2014-05-29’就不能使用到索引,原因很簡單,b+樹中存的都是數(shù)據(jù)表中的字段值,但進行檢索時,需要把所有元素都應用函數(shù)才能比較,顯然成本太大。所以語句應該寫成create_time = unix_timestamp(’2014-05-29’);

5、盡量的擴展索引,不要新建索引。比如表中已經(jīng)有a的索引,現(xiàn)在要加(a,b)的索引,那么只需要修改原來的索引即可,當然要考慮原有數(shù)據(jù)和線上使用情況


MySQL優(yōu)化

配置優(yōu)化

配置優(yōu)化指的MySQL 的 server端的配置,一般對于業(yè)務方而言,可以不用關注,畢竟會有專門的DBA來處理,但是對于原理的了解,我想,我們開發(fā),是需要了解的。

基本配置

innodb_buffer_pool_size

這是安裝完InnoDB后第一個應該設置的選項。緩沖池是數(shù)據(jù)和索引緩存的地方:這個值越大越好,這能保證你在大多數(shù)的讀取操作時使用的是內存而不是硬盤。典型的值是5-6GB(8GB內存),20-25GB(32GB內存),100-120GB(128GB內存)。

innodb_log_file_size

這是redo日志的大小。redo日志被用于確保寫操作快速而可靠并且在崩潰時恢復。一直到MySQL 5.1,它都難于調整,因為一方面你想讓它更大來提高性能,另一方面你想讓它更小來使得崩潰后更快恢復。

幸運的是從MySQL 5.5之后,崩潰恢復的性能的到了很大提升,這樣你就可以同時擁有較高的寫入性能和崩潰恢復性能了。一直到MySQL 5.5,redo日志的總尺寸被限定在4GB(默認可以有2個log文件)。這在MySQL 5.6里被提高了。如果你知道你的應用程序需要頻繁的寫入數(shù)據(jù)并且你使用的時MySQL 5.6,你可以一開始就把它這是成4G。

max_connections

如果你經(jīng)??吹健甌oo many connections'錯誤,是因為max_connections的值太低了。這非常常見因為應用程序沒有正確的關閉數(shù)據(jù)庫連接,你需要比默認的151連接數(shù)更大的值。

max_connection值被設高了(例如1000或更高)之后一個主要缺陷是當服務器運行1000個或更高的活動事務時會變的沒有響應。在應用程序里使用連接池或者在MySQL里使用進程池有助于解決這一問題。

InnoDB配置

innodb_file_per_table

這項設置告知InnoDB是否需要將所有表的數(shù)據(jù)和索引存放在共享表空間里(innodb_file_per_table = OFF) 或者為每張表的數(shù)據(jù)單獨放在一個.ibd文件(innodb_file_per_table = ON)。每張表一個文件允許你在drop、truncate或者rebuild表時回收磁盤空間。

這對于一些高級特性也是有必要的,比如數(shù)據(jù)壓縮。但是它不會帶來任何性能收益。你不想讓每張表一個文件的主要場景是:有非常多的表(比如10k+)。MySQL 5.6中,這個屬性默認值是ON,因此大部分情況下你什么都不需要做。對于之前的版本你必需在加載數(shù)據(jù)之前將這個屬性設置為ON,因為它只對新創(chuàng)建的表有影響。

innodb_flush_log_at_trx_commit

默認值為1,表示InnoDB完全支持ACID特性。當你的主要關注點是數(shù)據(jù)安全的時候這個值是最合適的,比如在一個主節(jié)點上。但是對于磁盤(讀寫)速度較慢的系統(tǒng),它會帶來很巨大的開銷,因為每次將改變flush到redo日志都需要額外的fsyncs。

將它的值設置為2會導致不太可靠(reliable)因為提交的事務僅僅每秒才flush一次到redo日志,但對于一些場景是可以接受的,比如對于主節(jié)點的備份節(jié)點這個值是可以接受的。如果值為0速度就更快了,但在系統(tǒng)崩潰時可能丟失一些數(shù)據(jù):只適用于備份節(jié)點。

innodb_flush_method

這項配置決定了數(shù)據(jù)和日志寫入硬盤的方式。一般來說,如果你有硬件RAID控制器,并且其獨立緩存采用write-back機制,并有著電池斷電保護,那么應該設置配置為O_DIRECT;否則,大多數(shù)情況下應將其設為fdatasync(默認值)。sysbench是一個可以幫助你決定這個選項的好工具。

innodb_log_buffer_size

這項配置決定了為尚未執(zhí)行的事務分配的緩存。其默認值(1MB)一般來說已經(jīng)夠用了,但是如果你的事務中包含有二進制大對象或者大文本字段的話,這點緩存很快就會被填滿并觸發(fā)額外的I/O操作。看看Innodb_log_waits狀態(tài)變量,如果它不是0,增加innodb_log_buffer_size。

其他設置

query_cache_size

query cache(查詢緩存)是一個眾所周知的瓶頸,甚至在并發(fā)并不多的時候也是如此。最佳選項是將其從一開始就停用,設置query_cache_size = 0(現(xiàn)在MySQL 5.6的默認值)并利用其他方法加速查詢:優(yōu)化索引、增加拷貝分散負載或者啟用額外的緩存(比如memcache或redis)。

如果你已經(jīng)為你的應用啟用了query cache并且還沒有發(fā)現(xiàn)任何問題,query cache可能對你有用。這是如果你想停用它,那就得小心了。

log_bin

如果你想讓數(shù)據(jù)庫服務器充當主節(jié)點的備份節(jié)點,那么開啟二進制日志是必須的。如果這么做了之后,還別忘了設置server_id為一個唯一的值。就算只有一個服務器,如果你想做基于時間點的數(shù)據(jù)恢復,這(開啟二進制日志)也是很有用的:從你最近的備份中恢復(全量備份),并應用二進制日志中的修改(增量備份)。

二進制日志一旦創(chuàng)建就將永久保存。所以如果你不想讓磁盤空間耗盡,你可以用 PURGE BINARY LOGS 來清除舊文件,或者設置 expire_logs_days 來指定過多少天日志將被自動清除。記錄二進制日志不是沒有開銷的,所以如果你在一個非主節(jié)點的復制節(jié)點上不需要它的話,那么建議關閉這個選項。

skip_name_resolve

當客戶端連接數(shù)據(jù)庫服務器時,服務器會進行主機名解析,并且當DNS很慢時,建立連接也會很慢。因此建議在啟動服務器時關閉skip_name_resolve選項而不進行DNS查找。唯一的局限是之后GRANT語句中只能使用IP地址了,因此在添加這項設置到一個已有系統(tǒng)中必須格外小心。

SQL 調優(yōu)

一般要進行SQL調優(yōu),那么就說有慢查詢的SQL,系統(tǒng)或者server可以開啟慢查詢日志,尤其是線上系統(tǒng),一般都會開啟慢查詢日志,如果有慢查詢,可以通過日志來過濾。但是知道了有需要優(yōu)化的SQL后,下面要做的就是如何進行調優(yōu)

慢查詢優(yōu)化基本步驟

  1. 先運行看看是否真的很慢,注意設置SQL_NO_CACHE

  2. where條件單表查,鎖定最小返回記錄表。這句話的意思是把查詢語句的where都應用到表中返回的記錄數(shù)最小的表開始查起,單表每個字段分別查詢,看哪個字段的區(qū)分度最高

  3. explain查看執(zhí)行計劃,是否與1預期一致(從鎖定記錄較少的表開始查詢)

  4. order by limit 形式的sql語句讓排序的表優(yōu)先查

  5. 了解業(yè)務方使用場景

  6. 加索引時參照建索引的幾大原則

  7. 觀察結果,不符合預期繼續(xù)從0分析

常用調優(yōu)手段

執(zhí)行計劃explain

在日常工作中,我們有時會開慢查詢去記錄一些執(zhí)行時間比較久的SQL語句,找出這些SQL語句并不意味著完事了,我們常常用到explain這個命令來查看一個這些SQL語句的執(zhí)行計劃,查看該SQL語句有沒有使用上了索引,有沒有做全表掃描,這都可以通過explain命令來查看。

所以我們深入了解MySQL的基于開銷的優(yōu)化器,還可以獲得很多可能被優(yōu)化器考慮到的訪問策略的細節(jié),以及當運行SQL語句時哪種策略預計會被優(yōu)化器采用。

使用explain 只需要在原有select 基礎上加上explain關鍵字就可以了,如下:

mysql>?explain?select?*?from?servers;
+----+-------------+---------+------+---------------+------+---------+------+------+-------+
|?id?|?select_type?|?table??|?type?|?possible_keys?|?key??|?key_len?|?ref??|?rows?|?Extra?|
+----+-------------+---------+------+---------------+------+---------+------+------+-------+
|
??1?|?SIMPLE??????|?servers?|?ALL??|?NULL??????????|?NULL?|?NULL????|?NULL?|????1?|?NULL??|
+----+-------------+---------+------+---------------+------+---------+------+------+-------+
1?row?in?set?(0.03?sec)

簡要解釋下explain各個字段的含義

  • id : 表示SQL執(zhí)行的順序的標識,SQL從大到小的執(zhí)行

  • select_type:表示查詢中每個select子句的類型

  • table:顯示這一行的數(shù)據(jù)是關于哪張表的,有時不是真實的表名字

  • type:表示MySQL在表中找到所需行的方式,又稱“訪問類型”。常用的類型有:ALL, index, range, ref, eq_ref, const, system, NULL(從左到右,性能從差到好)

  • possible_keys:指出MySQL能使用哪個索引在表中找到記錄,查詢涉及到的字段上若存在索引,則該索引將被列出,但不一定被查詢使用

  • Key:key列顯示MySQL實際決定使用的鍵(索引),如果沒有選擇索引,鍵是NULL。

  • key_len:表示索引中使用的字節(jié)數(shù),可通過該列計算查詢中使用的索引的長度(key_len顯示的值為索引字段的最大可能長度,并非實際使用長度,即key_len是根據(jù)表定義計算而得,不是通過表內檢索出的)

  • ref:表示上述表的連接匹配條件,即哪些列或常量被用于查找索引列上的值

  • rows:表示MySQL根據(jù)表統(tǒng)計信息及索引選用情況,估算的找到所需的記錄所需要讀取的行數(shù),理論上行數(shù)越少,查詢性能越好

  • Extra:該列包含MySQL解決查詢的詳細信息

EXPLAIN的特性

  • EXPLAIN不會告訴你關于觸發(fā)器、存儲過程的信息或用戶自定義函數(shù)對查詢的影響情況

  • EXPLAIN不考慮各種Cache

  • EXPLAIN不能顯示MySQL在執(zhí)行查詢時所作的優(yōu)化工作

  • 部分統(tǒng)計信息是估算的,并非精確值

  • EXPALIN只能解釋SELECT操作,其他操作要重寫為SELECT后查看執(zhí)行計劃。

實戰(zhàn)演練

表結構和查詢語句

假如有如下表結構

circlemessage_idx_0?|?CREATE?TABLE?`circlemessage_idx_0`?(
??`circle_id`?bigint(20)?unsigned?NOT?NULL?COMMENT?'群組id',
??`from_id`?bigint(20)?unsigned?NOT?NULL?COMMENT?'發(fā)送用戶id',
??`to_id`?bigint(20)?unsigned?NOT?NULL?COMMENT?'指定接收用戶id',
??`msg_id`?bigint(20)?unsigned?NOT?NULL?COMMENT?'消息ID',
??`type`?tinyint(3)?unsigned?NOT?NULL?DEFAULT?'0'?COMMENT?'消息類型',
??PRIMARY?KEY?(`msg_id`,`to_id`),
??KEY?`idx_from_circle`?(`from_id`,`circle_id`)
)?ENGINE=InnoDB?DEFAULT?CHARSET=utf8mb4?COLLATE=utf8mb4_bin

通過執(zhí)行計劃explain分析如下查詢語句

mysql>?explain?select?msg_id?from?circlemessage_idx_0?where??to_id?=?113487?and?circle_id=10019063??and?msg_id>=6273803462253938690??and?from_id?!=?113487?order?by?msg_id?asc?limit?30;
+----+-------------+---------------------+-------+-------------------------+---------+---------+------+--------+-------------+
|?id?|?select_type?|?table???????????????|?type??|?possible_keys???????????|?key?????|?key_len?|?ref??|?rows???|?Extra???????|
+----+-------------+---------------------+-------+-------------------------+---------+---------+------+--------+-------------+
|
??1?|?SIMPLE??????|?circlemessage_idx_0?|?range?|?PRIMARY,idx_from_circle?|?PRIMARY?|?16??????|?NULL?|?349780?|?Using?where?|
+----+-------------+---------------------+-------+-------------------------+---------+---------+------+--------+-------------+
1?row?in?set?(0.00?sec)


mysql>?explain?select?msg_id?from?circlemessage_idx_0?where??to_id?=?113487?and?circle_id=10019063???and?from_id?!=?113487?order?by?msg_id?asc?limit?30;
+----+-------------+---------------------+-------+-----------------+---------+---------+------+------+-------------+
|?id?|?select_type?|?table???????????????|?type??|?possible_keys???|?key?????|?key_len?|?ref??|?rows?|?Extra???????|
+----+-------------+---------------------+-------+-----------------+---------+---------+------+------+-------------+
|
??1?|?SIMPLE??????|?circlemessage_idx_0?|?index?|?idx_from_circle?|?PRIMARY?|?16??????|?NULL?|???30?|?Using?where?|
+----+-------------+---------------------+-------+-----------------+---------+---------+------+------+-------------+
1?row?in?set?(0.00?sec)

問題分析

通過上面兩個執(zhí)行計劃可以發(fā)現(xiàn)當沒有msg_id >= xxx這個查詢條件的時候,檢索的rows要少很多,并且兩者查詢的時候都用到了索引,而且用到的還只是主鍵索引。那說明索引應該是不合理的,沒有發(fā)揮最大作用。

分析這個執(zhí)行計劃可以看到,當包含msg_id >= xxx?查詢條件的時候,rows有34w多行,這種情況,說明檢索太多,要么就是表里面確實有這么大,要么就是索引不合理沒有用到索引,大都情況是沒用合理用到索引。列中所用到的索引也是PRIMARY,那就可能是(msg_id,to_id)的其中一個,注意我們建立表的時候msg_id索引的順序是在to_id前面的,因此MySQL查詢一定會優(yōu)先用msg_id索引,在使用了msg_id索引后,就已經(jīng)檢索出了34w行,并且由于msg_id的查詢條件是大于等于,因此,再這個查詢條件后,就不能再用到to_id的索引。

然后再看key_len長度為16,結合 key為PRIMARY,那么可以分析得知,只有一個主鍵索引被用到。

最后看看 type 值,是range,那么就說明這個查詢要么是范圍查詢,要么就是多值匹配。

請注意,from_id != xxx這樣的語句,是無法用到索引的。只有from_id = xxx就可以用到所以,因此from id 的索引其實可以不用,建立索引的時候就要考慮清楚

如何優(yōu)化

既然知道索引不合理,那么就要分析并調整索引。一般而言,我們既然要從單表里面查詢,那么就需要能夠知道大體,單表里面大致會有哪些數(shù)據(jù),現(xiàn)在的量級大概是多少。

然后開始下一步的分析,既然msgid是被設置為了主鍵,那一定是全局唯一的,所有,有多少數(shù)據(jù)量就至少會有多少條msgid;那么檢索msg_id基本就是檢索整個表了。我們要做的優(yōu)化就是要盡量減少索引,減少查詢的行數(shù);那么就需要思考,通過查詢哪些字段才能夠減少行數(shù)?比如,一個張表里面,所屬某個用戶的數(shù)據(jù),會不會比查詢msgid的行數(shù)要少?查詢某個用戶并且是屬于某個圈子的,那會不會就更少了?等等。

然后根據(jù)實際情況分析,單表里面命中to_id 的行數(shù)應該是會小于命中msg_id的,因此要首先保證能夠使用到to_id的索引,為此,可以設置主鍵的時候把msg_id和to_id的順序交互一下;但是,由于已經(jīng)是線上的表,已經(jīng)有了大量數(shù)據(jù),并且業(yè)務開始運行,這種情況下,修改主鍵會引發(fā)很多問題(當然修改索引是OK的),因此,不建議直接修改主鍵。

那么,為了保證有效使用to_id的索引,就要新建一個聯(lián)合索引;那么新建的聯(lián)合索引的第一索引字段必然是to_id,針對此業(yè)務場景,最好能夠再加上circle_id索引,這樣可以快速索引;這樣就得到了新的聯(lián)合索引(to_id,circle_id)的索引,然后,因為要找msg_id,為此,在此基礎上,再加上msg_id。最終得到的聯(lián)合索引為(to_id,circle_id,msg_id);這樣的話,就能夠快速檢索這樣的查詢語句了:where to_id = xxx and circle_id = xxx and msgId >= xxx

當然,索引的建立,也不是說某個sql 語句需要啥索引,就建立某個聯(lián)合索引,這樣的話,索引太多的話,寫的性能受影響(插入、刪除、修改),然后存儲空間也會相應增大;另外mysql在運行時也會消耗資源維護索引,所以,索引并不是越多越好,需要結合查詢最頻繁、最影響性能的sql來建立合適的索引。需要再說明的是,一個聯(lián)合索引或者一組主鍵就是一個btree,多個索引就是多個btree


總結

首先我們需要深入理解索引的原理和實現(xiàn),當理解了原理后,才能夠更有助于我們建立合適的索引。然后我們建立索引的時候,不要想當然,要先想清楚業(yè)務邏輯,再建立對應的表結構和索引。需要再次強調如下幾點:

  • 索引不是越多越好

  • 區(qū)分主鍵和索引

  • 理解索引結構原理

  • 理解查詢索引規(guī)則

參考

http://blog.codinglabs.org/articles/theory-of-mysql-index.html
https://tech.meituan.com/2014/06/30/mysql-index.html


瀏覽 55
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報
評論
圖片
表情
推薦
點贊
評論
收藏
分享

手機掃一掃分享

分享
舉報

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 欧美草比视频| 911精品国产一区二区在线| 成人视频A片| 91久久精品一区二区三区| 色多多毛片| 影音先锋男人站| 欧美中文在线观看| 波多野结衣无码高清视频| 校园春色av| 欧美一级特黄真人做受| 日韩免费在线观看| 女同三区| 最近中文字幕高清2019中文字幕 | 久久黑人| 日本一区二区三区免费观看| aaa国产| 欧美日屄视频| 中文字幕婷婷五月天| 秋霞亚洲| 老鸭窝av免费入口在线观看| 国产欧美一区二区精品性色超碰| 综合天堂AV久久久久久久| 丁香婷婷一区二区三区| 国产91在线观看| AV黄色片| 国产成人自拍视频在线观看| 国产精品久久毛片| 国产精品视频色| 久久w| 日韩中文字幕无码人妻| 婷婷丁香五月激情一区综合网| 99精品久久| 亚洲av中文| 日韩精品成人无码免费| 秋霞国产| 国产玖玖| 亚洲女人在线| 成人福利在线观看| 91看片看婬黄大片女跟女| 国产综合久久久777777色胡同| 亚洲无码一区二区三区妃光| 大香蕉伊人操| 影音先锋AV资源网站| 天堂素人| 色aV牛牛在线观看| 1插菊花综合网| 91精品人妻一区二区三区蜜桃| 成人欧美| 中文天堂| 国产91无码精品秘入口新欢| 成人黄片18| 色哟哟国产| 成人性爱免费视频| 97精品人人妻人人| 无码伊人| 亚州高清无码视频| 日韩91在线| 2019国产精品| 一级a性色毛片| 男女AV网站| 国产精品小电影| 手机看片1024你懂的| 日本在线不卡视频| 性性性性性XXXXX| 蜜桃成人久久| 夜夜嗨AV一区二区三区啊| 婷婷五月天在线电影| 91麻豆免费看| 亚洲草逼视频| 精品國產一區二區三區久久蜜月| 中文字幕东京热加勒比| 精品国产va久久久久久| AV无码精品| 国产操逼免费| 搞搞网日本9| 日本成人中文字幕在线观看| 久久久久久久毛片| 香蕉网站操逼片| 在线成人亚洲| 91亚洲国产成人| 四虎影院中文字幕| 国产成人一级| 日本乱码视频| 俺也去com| 夜夜爽夜夜爽| 亚洲护士无码| 亚欧综合在线| 神马午夜激情| 日韩日逼网站| 欧美+日韩+国产+成人+在线| 亚洲无码在线精品| 波多野结衣久久精品| 无码国产精品一区二区视频| 9l视频自拍九色9l视频成人| 国产亲子乱XXXXimim/| 91国内精品视频| 亚洲草逼| 99久久婷婷国产综合精品hsex | 99视频精品全部免费看| 麻豆av在线观看| 熟妇人妻中文AV无码| 久草免费电影| 荫蒂添出高潮A片视频| 99精品视频在线观看免费| 韩国无码人妻| 黄色一级大片| 欧美第一页| 老司机AV91| 麻豆mdapp03.tⅴ| 欧美又大又粗| 欧美特黄AAAAAAAAA片| 中文字幕视频网站| 人妻少妇一区| 亚洲成人小说| 99热在线只有精品| 在线观看亚洲专区| 啪啪人妻| 国产午夜福利免费视频在线观看 | 亚洲日韩AV在线| 日本内射在线观看| 翔田千里无码破解| 欧美又大又粗| 91日日夜夜| 天天操天天插| 丁香五月婷婷综合| 麻豆av无码| 影音先锋色av| 性爱视频99| 中文字幕五码| 亚洲精品一区二区三区新线路| 国产91精品看黄网站在线观看| 另类在线| 亚洲AVwww| 亚洲高清视频无码| 午夜老司机福利一二三区| 成人毛片18女人毛片真水| 97精品在线观看| 国产精品黄色视频| 91av在线看| 欧美激情四射老司机| 97福利导航| 少婦揉BBBB揉BBBB揉| 欧美精品性爱视频| 国产一级a毛一级a做免费图片| 亚洲无码系列| 白虎高清无码大尺度免费在线观看| 欧美无遮挡| 亚洲色图第一页| 色色色色五月| 午夜高清无码视频| 亚洲无码在线免费观看| 青青草手机视频在线| 好好日视频| 国产精品高清无码| 成人看片黄a免费看视频| 91精品亚洲| 色mm在线播放| AV观看免费| 亚洲黄色免费看| 欧美性爱福利视频| 黄片免费看| 午夜无码鲁丝午夜免费| 成人中文字幕在线视频| 国产成人精品无码区在线| 国产91精品探花一区二区| 国产做受91一片二片老头| 2015中文字幕黄色视频| 亚洲一区视频在线| 国产一級A片免费看| 激情男人网| 亚洲日韩中文无码| 天天日夜夜爽| 大香蕉88| 2025中文字幕在线| 欧美日韩在线视频观看| 久久精品中文字幕| 国产玖玖爱| 黄色A级视频| 日本操逼片| 搡BBBB搡BBB搡我瞎了| 青草碰| 日本A∨在线| 久久久精品久久久| 超碰少妇| 99热最新| 国产又粗又大又爽| 无码中文AV| 亚洲无码精品在线| 亚洲无码网址| 欧美成人精品一区二区| 天天日夜夜撸| 一级黄色a片| 俺去俺来也www色视频| 亚洲精品国产精品乱码视99| 成人二区| 亚洲丁香五月激情| 青青操天天干| 国产成人无码Av片在线公司| 无码专区亚洲| 精品国产午夜福利在线观看| 一区二区三区四区免费| 东京热久久综合色五月老师| 天堂成人网站| 天天搞天天搞| 国产1区2区3区| 91精品人妻一区二区| 一区二区三区麻豆| 大香蕉天天操| 狠狠干大香蕉| 色操人| 五月天婷婷在线观看视频| 少妇高潮在线| 欧美在线色图| 欧美日韩一| 91精品国产一区二区三区四区大 | 国产成人无码一区二区在线播放| 操碰视频在线| 五月婷婷AV| 日韩色小说| 亚洲在线a| 色天天综合| 天天操夜夜爽| 天天日天天干天天爽| 日韩视频久久| 宅男视频| 日本一节片在线播放| 亚洲人人18XXX—20HD| 俺来也俺去也www色官网| 无码免费婬AV片在线观看| 偷拍92| 色综合成人| 91蜜桃网| 无码视频播放| 在线三级av| 国产无套内射视频| 98色色| 亚洲国产成人精品激情在线| 韩国三级HD久久精品| 麻豆A∨在线| 女神思瑞精品一区二区三区| 狠狠操婷婷| 久草中文网| 欧美无人区码suv| 操逼网123首页| 18AV在线观看| 操逼欧美| 一级成人电影| 精品无码一区二区三区的天堂| 乱子伦国产精品| 精品乱子伦一区二区三区毛| 婷婷五月天成人| 99er视频| 天天色区| 九九综合网| 九九成人网站| 成人在线看片| 久久国产欧美| 久艹在线| 国产在线视频第一页| 久久精品苍井空免费一区二| 波多野结衣不卡| 亚洲狼人久久久精品| 中文字幕一区二区二三区四区| 51成人网站| 中文资源在线√8| 久久久精品免费视频| 在线免费看黄片| 996热re视频精品视频这里| 天堂俺去俺来也www久久婷婷| 伊人网成人| 草久av| 日韩精品三级| 性欧美成人18| 翔田千里无码AV在线观看| 无码AⅤ一区二区三区| 欧美老女人操逼群| 日韩激情在线观看| 亚洲精品福利| 婷婷丁香五月在线| 午夜褔利| 九九免费视频| 操人视频网站| 中文字幕国产视频| 一级a一级a爱片兔兔软件| 国产精品乱子伦一区二区三区视频 | 国产精品久久久久久久久A| 婷婷操逼网| 国产高清精品软件丝瓜软件| 大香蕉综合闲人| 91在线无码精品秘入口国战| mm131亚洲国产精品久久| 日韩免费成人视频| 大香蕉在线精品视频| 欧美成人一级a片| 粉嫩99精品99久久久久久夜| 黄色片免费看| 精品av在线观看| 亚洲V视频| 日韩天堂在线播放| 日韩a级毛片| 亚洲图片激情乱伦小说| 中文字幕精品视频在线观看| 国产伦精品一区二区三区妓女| 操逼视频试看| 欧美日韩免费一区二区三区| 三级黄色免费| 亚洲最大福利视频| 天天操天天操| 无码人妻少妇| 精品91| 国产av日韩av| 久久久久综合| 影音先锋av网| 91精品国产麻豆国产自产在线| 精品国产乱码久久久久夜深人妻 | 中文字幕无码A片久久| 亚洲无码一二区| 操逼三级视频| 51AV在线| 亚洲三级在线| 老熟女伦一区二区三区| 成人免费无码婬片在线| 久久久久久久久久久久高清毛片一级 | 成人免费乱码大片a毛片蜜芽| 伊人无码视频| 无码直播| 久久凹凸视频| 久久久WWW成人免费无遮挡大片| 免费看的黄色视频| 大香蕉伊人操| 91人妻网| 久久狠狠干| 国产91精品在线观看| 人妻无码91| 这里只有精品久久| 美日韩一区二区| 久久综合伊人777777| 综合欧美国产视频二区| 亚洲精品国偷拍自产在线观看蜜桃| 激情婷婷| 中文字幕无码网站| 欧美第一页| 无码潮喷| 综合色国产精品欧美在线观看| 亚洲中文字幕人妻| 中文字幕免费视频在线播放| 成人一级a片| 伊人青草视频9| 亚洲黄在线观看| 91av视频| 日韩成人av在线| 丰滿老婦BBwBBwBBw| 欧美激情一级| 操逼免费| 国产网站免费| 91在线无码精品秘国产三年 | 久久久久黄片| 久草社区| 国内精品内射| 国产AV资源| 99er在线| 韩国日本美国免费毛片| 亚洲色偷精品一区二区三区| 国产成人一级| 亚洲精品熟女| 黄色一级片免费在线观看| 无码狠狠躁久久久久久久91| 香蕉成人网站在线观看| 免费一级黄色| 青青草视频91| 日韩高清无码一区二区| 大香蕉尹人在看| 日本无码一区二区三三| 欧美熟妇BBB搡BBB| 无码a区天堂| 欧美VA视频| 北条麻妃无码在线视频| AV一区二区三区四区| 亚洲五月六月| 久久久久久免费视频| 天天日日日干| 最近中文字幕免费mv第一季歌词強上 | 婷婷五月伊人| 成人免费版欧美州| 最新免费一区二区三区| 91精品视频在线| 91av免费在线观看| 三上悠亚一区二区| 无码狠狠躁久久久久久久91| 成人婷婷网| 成人性爱AV| 国产A片电影| 亚洲无码免费| 色婷婷一区二区三区久久| 影音先锋AV资源网站| 日本黄在线观看| 影音先锋黄色资源| 日韩电影一区| 色视频在线播放| 老女人操逼网| 夜夜高潮夜夜爽| 久久精品婷婷| 日韩三级毛片| 五月天久久| 激情小视频在线| 老女人毛片| 久综合网| 一区二区久久| 一级二级三级无码| 成人三级片视频| 久久久999久久久999精神| 免费黄色成人| 电影豹妹香港版| 日韩欧美国产视频| 午夜一本道| 91工厂露脸熟女| 特黄AAAAAAAA片免费直播| а√天堂中文最新版8| 亚洲欧美国产日韩字幕| 久久都是精品| 久久香蕉网| 国产精品成人免费久久黄AV片 | 丁香花五月激情| 中文字幕视频在线直播| 少妇综合网| 丰滿人妻一区二区三| 国产成人精品八戒| 丝袜足交在线| 国产一区二区在线播放| 国产精品123| 福利三区| 欧美大屌网站| 精品成人| 看黄片网站| 亚洲无码理论片| 亚洲午夜AV久久乱码| 久久99网站| 91网在线观看| 在线无码一区| 九一国产| 国产乱子伦-区二区| 成人视频在线播放| 成人午夜福利高清视频| 艹B视频| 婷婷精品| 成人性生活片| 免费观看成人毛片A片直播千姿| 黑人操逼视频| 国产黄色视频网站在线观看| 操国产美女| 少妇免费视频| 粉嫩av懂色av蜜臀av熟妇| 人妻少妇精品视频一区二区三区| 欧美色图在线视频| 黄色小说视频网站| 骚骚肥肥一区二区三区| 少妇精品无码一区二区免费视频| 日本成人久久| 成人免费视频一区二区三区| 亚洲人气无码AV| 无码一区三区| 亚洲在线成人视频| 国产卡一卡二在线观看| 国产黄色A片| 国产成人无码AⅤ片免费播放| 99热黄色| 污网站在线观看| 一级av在线| 性色在线| 四虎影库男人天堂| 北条麻妃无码在线播放| 一区二区三区四区精品视频| 波多野结衣福利视频| 熟女一区| 91在线无码精品秘蜜桃入口| 奇米色网| 国产免费av在线观看| 69毛片| 丁香五月六月| 中文字幕精品1| 性欧美成人播放77777| 国产在线观看| 久久久久久久97| 91视频入口| 大香蕉av一区二区三区在线观看 | 天天射天天操天天干| 亚洲日韩AV电影| 日韩A片一级无码免费蜜桃| 超碰在线国产| 影音先锋成人在线资源| 日韩无码123区| av在线天堂| 无码不卡在线观看| 色悠悠久久综合| 一牛影视精品av| 成人在线免费观看视频| www.6969成人片亚洲| 99久久国产热无码精品免费| 成人国产精品秘欧美高清| 一级片免费观看| 臭小子晚上让你爽个够视频| 噜噜噜久久久| 天堂在线观看AV| 91小电影| 亚洲视频免费播放| 天堂一区在线观看| 精品一区二区三区无码| 欧美自拍视频| 91成人18| 加勒比精品在线| 韩国三级HD久久精品| 影音先锋av网| 日韩视频免费观看高清完整版在线观| 亚洲综合一区二区| AV小说在线观看| 国产成人精品无码片子的价格| 天天日天天日天天日| 国产AV天堂| 欧美日韩精品一区二区| 久久中文字幕视频| 国产一级黄色大片| 中文字幕有码在线播放| 亚洲天堂一区| 日韩无码动漫| ThePorn-成人网站入口| 亚洲一区亚洲二区| h在线观看h| 色老板免费视频| 欧美AAA视频| 波多野结衣亚洲视频| 熟女资源网| 久久午夜无码鲁丝午夜精品| 国产无码一区二区三区| 黄色资源在线观看| 91精品丝袜久久久久久久久粉嫩 | 一级a免一级a做免费线看内裤| 精品国产成人| 久久九九99| 极品另类| 黄色视频网站国产| 久草视频播放| 免费在线观看视频a| 国产黄色一区| 日韩人妻无码一区二区三区七区 | 无码黄漫| 尤物视频在线观看视频| 久久久久久久久成人| 日本三级网址| 中文字字幕在线中文乱码电影| 91人人妻人人澡人人爽人人| 国产成人精品一区二| 蜜芽成人精品久久久视频| 亚洲午夜AV| 伊人久久狼人| 欧美日韩精品| 黄色美女视频网站| 日韩欧美精品一区二区| 色婷五月| 在线观看亚洲中文字幕| 加勒比久久88| 91在线无码精品国产三年| 久久精品一区二区| 亚洲无码在线播放| 桃色一区| 黄片无码免费| 国产操逼大片| 高潮毛片| 欧美日韩国产三级| 午夜亚洲AV永久无码精品蜜芽| 五月天激情视频| jizz99| 中文字幕永久| 日本国产在线观看| 99re6热在线精品视频| 黑人一区二区三区四区| 无码在线播放观看| 成人A片在线播放| 秋霞一区二区三区无码| 99久久99| 日韩精品久久| 日本黄在线观看| 一区二区三区四区视频在线| 日韩黄| 爆操网站| 天堂AV网站| 欧美日韩在线观看一区二区三区| 美女网站色| 激情av天堂| 黄色一区二区三区| 成人无码中文字幕| 18禁黄网| 国产成人av网站| 91麻豆精品国产91久久久吃药| 成人日皮视频| 久久国产免费视频| 狼友视频免费在线观看| 国产在线精品自拍| 日日操天天| 亚洲性爱综合| 青青草成人免费在线视频| 中文字幕在线看| 亚洲最大成人网站| 五月天丁香| 不卡av在线| 肉乳无码A片av| 91色在线| 思思热视频在线观看| 激情免费视频| 青青草精品在线视频| 日韩中文字幕在线人成网站| 九色PORNY丨自拍蝌蚪| 草久在线| 在线一区观看| 1024香蕉视频| 色大香蕉伊人| www.久久网| 成人一二区| 久久1234| 内射自拍| 乱码中文字幕日韩欧美在线 | 特级艺体西西444WWw| 五月丁香婷婷激情| 亚洲中文字墓| 日韩一区在线播放| 亚洲精品秘一区二区三区在线观看 | 天天爱天天操| 日本黄色片| 91精品国久久久久久无码一区二区三区| 神马午夜福利视频| 成人无码中文字幕| 日韩视频在线观看免费| 成人毛片在线观看| 日韩一级黄| 国产高清无码自拍| A片视频在线观看| 青青操B| 东北女人操逼| 国产中文字幕在线视频| 中文字幕日韩人妻在线| 岛国AV免费看| 韩日一区二区| 丁香六月天| 人善交精品一区二区三区| 国产区精品| 免费黄色成人视频| 亚洲三级片视频| 国产无套视频| 久草中文视频| 成人无码免费| 大香蕉三级片| 欧美一二三区| 国产做受91| 中文字幕福利| 亚洲AV无码成人精品| 一区二区三区不卡视频| AV资源在线| 国产午夜福利电影| 亚洲狠狠| 丰臀肥逼高清视频电影播放 | 婷婷激情综合| 成人大香蕉| 国产激情欧洲在线观看一区二区三区 | 国产18禁网站| 先锋资源久久| 麻豆精品国产传媒| 久久久久久久久久国产精品| 日韩综合在线观看| 日本中文视频| 国产三级片在线观看视频| 国产又爽又黄免费网站在线| 国产在线视频一区二区三区| 丁香婷婷五月色成人网站| 成人视频在线观看黄色18| 天堂在线中文字幕| 国产又爽又黄免费视频免费 | 嫩BBB槡BBBB槡BBBB免费视频| 国内自拍视频网| 婷婷五月天影视| 亚洲色图片区| 蜜芽成人网站| 欧美成人精品激情在线视频| 日韩久久免费视频| 性猛交AAAA片免费看蜜桃视频| 免费看黃色AAAAAA片| 香蕉一区| 无码内射视频| 黄色无無| 黄色激情AV| 国产婷婷精品| 一本久道视频一本久道| 三级片无码在线| 国产av播放| 天天搞天天搞| 久久超碰精品| 久草免费电影| 97资源超碰| jizzjizz国产| 久久国产精品视频| 中文字幕高清无码免费视频| 亚洲乱论| 操逼爆奶网站| 国产成人精品久久二区二区91| 一本色道综合久久欧美日韩精品| 在线观看内射视频| 国产三级三级三级| 日韩在线观看一区| 五月天久久久| 黄色视频网站免费| 免费av网站| 日本黄色视频官网| 亚洲av黄| 中文字幕免费av| 久操网在线| 成人大片在线观看| 中文字幕不卡视频| 中文字幕日韩在线视频| 91视频网站在线观看| 亚洲激情| 国产三级高清无码| 亚洲精品无码一区| 首屈一指视频在线观看| 一级午夜| 日韩中文字码无砖| 三级AV在线| 中文字幕无码人妻| 天堂网址激情网址| 青草青青视频| 老女人肏屄视频| 国产精品扒开腿做爽爽爽视频| 在线操B| 美女91视频| 中文天堂| 欧美视频在线观看| 日韩二| 日韩三区在线| 成人午夜无码| 亚洲精品中文字幕乱码三区91| 日韩无码免费播放| 四川少妇搡BBBB搡BBB视频网| 国产高清视频| 日韩中文无码一级A片| 成人网站大香蕉| 六月婷婷网| 黄片天堂| 四虎黄色网| 青青操在线视频| 午夜三级视频| 中文字幕乱伦视频| 黑人精品欧美一区二区蜜桃| 亚洲精品无码中文字幕| 亚洲黄色免费网站| 久久久久9999| 狼人狠干| 成人精品福利| 日韩中文无码字幕| 中文AV字幕| 在线国产视频| 免费在线观看中文字幕| 最新中文字幕无码| 成人伊人电影| 丁香欧美| 麻豆91精品人妻成人无码| 日韩欧美国产| 亚洲无码免费视频在线观看| 噜噜色小说| 先锋影音av资源站| 大香蕉999| 91日韩在线| 精品伊人大香蕉| 欧美一级a视频免费放| 精品五月天| 大色网小色网| 国产精品视频免费观看| 爱爱欧美| 亚洲日韩国产成人精品久久| 欧美黄色成人网站| 青青草无码成人天堂免费| 2019中文字幕在线免费观看| 日本一区二区视频在线观看| 黄色动漫在线免费观看| 三级无码中文| 三级片久久久| 亚洲高清无码久久| 亚洲AV无码成人精品区www| 欧美日韩在线看| 激情综合五月| 欧美午夜福利| 亚洲成人无码片| 国产网站精品| 一级黄片免费观看| 老熟女视频| 国产免费一区二区三区四区| 日韩视频中文字幕在线| 91色秘乱码一区二区| 欧美高清性XXXXHDvideosex| 人人摸人人干| 大香蕉综合伊人| 久热视频在线| 日韩免费在线观看视频| 黄色毛片网站| 成年人黄色视频免费观看| 色色色热| 久久99精品久久久水蜜桃| 国产久久久| 日韩AV成人无码久久电影| 亚洲日韩三级| 国产精品自拍小视频| 日皮视频在线观看| 午夜免费无码视频| 成人午夜福利高清视频| 好吊看视频| 亚洲视频日韩在线观看| 欧美色图在线观看视频| 欧美日韩激情视频| 国产乱伦电影| 欧美视频在线免费| 中文字幕在线码| 欧美一级特黄A片免费看| 草草网| 人与鲁牲交| 成人aV无码精品国产一区二区| 91免费国产视频| 青草av在| 欧美被操| 午夜蜜桃人妻一区二区| 乱伦91| 国产一区二区三区视频在线| 日韩激情在线观看| 无码精品人妻一区二区三区漫画| adn日韩av| 国产一区二区在线播放| 亚洲日本黄色视频| 欧美一区二区三区视频| 东方AV免费在线观看| 噜噜噜在线视频| 日本黄色小视频| 成人先锋AV| 日韩永久免费| 国产日韩视频| 亚洲欧美综合| 成人欧美一区二区三区在线观看 | 少妇搡BBBB搡BBB搡造水多,| 自拍偷拍精品视频| 五月综合激情| 西西444WWW无码视频软件| 黄色一级片免费观看| 黑人无码在线| 久久久久久亚洲精品| 大香蕉在线啪啪| 亚洲AV无码成人精品区欧洲| 午夜福利2025| 四川少BBB搡BBB爽爽爽| 久草资源网| 深爱婷婷网| 久久久波多野结衣| 日韩高清中文字幕| brazzers疯狂作爱| 人人干视频| 军人妓女院BD高清片在线播放| 国产欧美日韩综合| 动漫一区二区| 91婷婷五月天| 欧美激情性爱网站| 日本一本草久p| 豆花成人视频| 黄色视频免费在线看| 日本高清视频免费观看| 天天操网| 免费看黄色录像| 十八禁黄网站| 亚洲人成电影| 久一区| 亚洲无码成人片| 婷婷五月天青草| 欧美69影院| 婷婷色小说| 国产拍拍视频| 国产高清免费无码| 欧美自拍偷拍| 国产成人电影一区二区| 艹逼免费视频| 日韩毛片在线观看| 人妻18无码人伦一区二区三区精品 | 99综合| 精品一区二区三区无码| 国产精品成人99一区无码| 99re欧美激情| 北条麻妃在线一区二区| 国产在线不卡| 96精品久久久久久久久久| 狠狠躁日日躁夜夜躁2022麻豆| 欧美日韩国产在线| 息子交尾一区二区三区| 大鸡吧视频在线观看| 天天天天毛片| 亚洲一区二区三区在线播放| 天天操天天拍| 午夜一级| 国产在线视频一区| 1024黄|