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

歡迎訪問 生活随笔!

生活随笔

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

数据库

(转)MySQL索引原理及慢查询优化

發布時間:2025/3/19 数据库 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (转)MySQL索引原理及慢查询优化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉自美團技術博客,原文地址:http://tech.meituan.com/mysql-index.html

建索引的一些原則:

  • 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的查詢優化器會幫你優化成索引可以識別的形式
  • 3.盡量選擇區分度高的列作為索引,區分度的公式是count(distinct col)/count(*),表示字段不重復的比例,比例越大我們掃描的記錄數越少,唯一鍵的區分度是1,而一些狀態、性別字段可能在大數據面前區分度就是0,那可能有人會問,這個比例有什么經驗值嗎?使用場景不同,這個值也很難確定,一般需要join的字段我們都要求是0.1以上,即平均1條掃描10條記錄
  • 4.索引列不能參與計算,保持列“干凈”,比如from_unixtime(create_time) = ’2014-05-29’就不能使用到索引,原因很簡單,b+樹中存的都是數據表中的字段值,但進行檢索時,需要把所有元素都應用函數才能比較,顯然成本太大。所以語句應該寫成create_time = unix_timestamp(’2014-05-29’);
  • 5.盡量的擴展索引,不要新建索引。比如表中已經有a的索引,現在要加(a,b)的索引,那么只需要修改原來的索引即可

?“任何數據庫層面的優化都抵不上應用系統的優化

?

以下是正文:

?

MySQL憑借著出色的性能、低廉的成本、豐富的資源,已經成為絕大多數互聯網公司的首選關系型數據庫。雖然性能出色,但所謂“好馬配好鞍”,如何能夠更好的使用它,已經成為開發工程師的必修課,我們經常會從職位描述上看到諸如“精通MySQL”、“SQL語句優化”、“了解數據庫原理”等要求。我們知道一般的應用系統,讀寫比例在10:1左右,而且插入操作和一般的更新操作很少出現性能問題,遇到最多的,也是最容易出問題的,還是一些復雜的查詢操作,所以查詢語句的優化顯然是重中之重。
本人從13年7月份起,一直在美團核心業務系統部做慢查詢的優化工作,共計十余個系統,累計解決和積累了上百個慢查詢案例。隨著業務的復雜性提升,遇到的問題千奇百怪,五花八門,匪夷所思。本文旨在以開發工程師的角度來解釋數據庫索引的原理和如何優化慢查詢。

一個慢查詢引發的思考

selectcount(*) fromtask where status=2 and operator_id=20839 and operate_time>1371169729 and operate_time<1371174603 and type=2;

系統使用者反應有一個功能越來越慢,于是工程師找到了上面的SQL。
并且興致沖沖的找到了我,“這個SQL需要優化,給我把每個字段都加上索引”
我很驚訝,問道“為什么需要每個字段都加上索引?”
“把查詢的字段都加上索引會更快”工程師信心滿滿
“這種情況完全可以建一個聯合索引,因為是最左前綴匹配,所以operate_time需要放到最后,而且還需要把其他相關的查詢都拿來,需要做一個綜合評估。”
“聯合索引?最左前綴匹配?綜合評估?”工程師不禁陷入了沉思。
多數情況下,我們知道索引能夠提高查詢效率,但應該如何建立索引?索引的順序如何?許多人卻只知道大概。其實理解這些概念并不難,而且索引的原理遠沒有想象的那么復雜。

MySQL索引原理

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

##索引原理
除了詞典,生活中隨處可見索引的例子,如火車站的車次表、圖書的目錄等。它們的原理都是一樣的,通過不斷的縮小想要獲得數據的范圍來篩選出最終想要的結果,同時把隨機的事件變成順序的事件,也就是我們總是通過同一種查找方式來鎖定數據。
數據庫也是一樣,但顯然要復雜許多,因為不僅面臨著等值查詢,還有范圍查詢(>、<、between、in)、模糊查詢(like)、并集查詢(or)等等。數據庫應該選擇怎么樣的方式來應對所有的問題呢?我們回想字典的例子,能不能把數據分成段,然后分段查詢呢?最簡單的如果1000條數據,1到100分成第一段,101到200分成第二段,201到300分成第三段......這樣查第250條數據,只要找第三段就可以了,一下子去除了90%的無效數據。但如果是1千萬的記錄呢,分成幾段比較好?稍有算法基礎的同學會想到搜索樹,其平均復雜度是lgN,具有不錯的查詢性能。但這里我們忽略了一個關鍵的問題,復雜度模型是基于每次相同的操作成本來考慮的,數據庫實現比較復雜,數據保存在磁盤上,而為了提高性能,每次又可以把部分數據讀入內存來計算,因為我們知道訪問磁盤的成本大概是訪問內存的十萬倍左右,所以簡單的搜索樹難以滿足復雜的應用場景。

###磁盤IO與預讀
前面提到了訪問磁盤,那么這里先簡單介紹一下磁盤IO和預讀,磁盤讀取數據靠的是機械運動,每次讀取數據花費的時間可以分為尋道時間、旋轉延遲、傳輸時間三個部分,尋道時間指的是磁臂移動到指定磁道所需要的時間,主流磁盤一般在5ms以下;旋轉延遲就是我們經常聽說的磁盤轉速,比如一個磁盤7200轉,表示每分鐘能轉7200次,也就是說1秒鐘能轉120次,旋轉延遲就是1/120/2 = 4.17ms;傳輸時間指的是從磁盤讀出或將數據寫入磁盤的時間,一般在零點幾毫秒,相對于前兩個時間可以忽略不計。那么訪問一次磁盤的時間,即一次磁盤IO的時間約等于5+4.17 = 9ms左右,聽起來還挺不錯的,但要知道一臺500 -MIPS的機器每秒可以執行5億條指令,因為指令依靠的是電的性質,換句話說執行一次IO的時間可以執行40萬條指令,數據庫動輒十萬百萬乃至千萬級數據,每次9毫秒的時間,顯然是個災難。下圖是計算機硬件延遲的對比圖,供大家參考:

考慮到磁盤IO是非常高昂的操作,計算機操作系統做了一些優化,當一次IO時,不光把當前磁盤地址的數據,而是把相鄰的數據也都讀取到內存緩沖區內,因為局部預讀性原理告訴我們,當計算機訪問一個地址的數據的時候,與其相鄰的數據也會很快被訪問到。每一次IO讀取的數據我們稱之為一頁(page)。具體一頁有多大數據跟操作系統有關,一般為4k或8k,也就是我們讀取一頁內的數據時候,實際上才發生了一次IO,這個理論對于索引的數據結構設計非常有幫助。

###索引的數據結構
前面講了生活中索引的例子,索引的基本原理,數據庫的復雜性,又講了操作系統的相關知識,目的就是讓大家了解,任何一種數據結構都不是憑空產生的,一定會有它的背景和使用場景,我們現在總結一下,我們需要這種數據結構能夠做些什么,其實很簡單,那就是:每次查找數據時把磁盤IO次數控制在一個很小的數量級,最好是常數數量級。那么我們就想到如果一個高度可控的多路搜索樹是否能滿足需求呢?就這樣,b+樹應運而生。

###詳解b+樹

如上圖,是一顆b+樹,關于b+樹的定義可以參見B+樹,這里只說一些重點,淺藍色的塊我們稱之為一個磁盤塊,可以看到每個磁盤塊包含幾個數據項(深藍色所示)和指針(黃色所示),如磁盤塊1包含數據項17和35,包含指針P1、P2、P3,P1表示小于17的磁盤塊,P2表示在17和35之間的磁盤塊,P3表示大于35的磁盤塊。真實的數據存在于葉子節點即3、5、9、10、13、15、28、29、36、60、75、79、90、99。非葉子節點只不存儲真實的數據,只存儲指引搜索方向的數據項,如17、35并不真實存在于數據表中。

###b+樹的查找過程
如圖所示,如果要查找數據項29,那么首先會把磁盤塊1由磁盤加載到內存,此時發生一次IO,在內存中用二分查找確定29在17和35之間,鎖定磁盤塊1的P2指針,內存時間因為非常短(相比磁盤的IO)可以忽略不計,通過磁盤塊1的P2指針的磁盤地址把磁盤塊3由磁盤加載到內存,發生第二次IO,29在26和30之間,鎖定磁盤塊3的P2指針,通過指針加載磁盤塊8到內存,發生第三次IO,同時內存中做二分查找找到29,結束查詢,總計三次IO。真實的情況是,3層的b+樹可以表示上百萬的數據,如果上百萬的數據查找只需要三次IO,性能提高將是巨大的,如果沒有索引,每個數據項都要發生一次IO,那么總共需要百萬次的IO,顯然成本非常非常高。

###b+樹性質
1.通過上面的分析,我們知道IO次數取決于b+數的高度h,假設當前數據表的數據為N,每個磁盤塊的數據項的數量是m,則有h=㏒(m+1)N,當數據量N一定的情況下,m越大,h越小;而m = 磁盤塊的大小 / 數據項的大小,磁盤塊的大小也就是一個數據頁的大小,是固定的,如果數據項占的空間越小,數據項的數量越多,樹的高度越低。這就是為什么每個數據項,即索引字段要盡量的小,比如int占4字節,要比bigint8字節少一半。這也是為什么b+樹要求把真實的數據放到葉子節點而不是內層節點,一旦放到內層節點,磁盤塊的數據項會大幅度下降,導致樹增高。當數據項等于1時將會退化成線性表。
2.當b+樹的數據項是復合的數據結構,比如(name,age,sex)的時候,b+數是按照從左到右的順序來建立搜索樹的,比如當(張三,20,F)這樣的數據來檢索的時候,b+樹會優先比較name來確定下一步的所搜方向,如果name相同再依次比較age和sex,最后得到檢索的數據;但當(20,F)這樣的沒有name的數據來的時候,b+樹就不知道下一步該查哪個節點,因為建立搜索樹的時候name就是第一個比較因子,必須要先根據name來搜索才能知道下一步去哪里查詢。比如當(張三,F)這樣的數據來檢索時,b+樹可以用name來指定搜索方向,但下一個字段age的缺失,所以只能把名字等于張三的數據都找到,然后再匹配性別是F的數據了, 這個是非常重要的性質,即索引的最左匹配特性。

慢查詢優化

關于MySQL索引原理是比較枯燥的東西,大家只需要有一個感性的認識,并不需要理解得非常透徹和深入。我們回頭來看看一開始我們說的慢查詢,了解完索引原理之后,大家是不是有什么想法呢?先總結一下索引的幾大基本原則

建索引的幾大原則

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的查詢優化器會幫你優化成索引可以識別的形式
3.盡量選擇區分度高的列作為索引,區分度的公式是count(distinct col)/count(*),表示字段不重復的比例,比例越大我們掃描的記錄數越少,唯一鍵的區分度是1,而一些狀態、性別字段可能在大數據面前區分度就是0,那可能有人會問,這個比例有什么經驗值嗎?使用場景不同,這個值也很難確定,一般需要join的字段我們都要求是0.1以上,即平均1條掃描10條記錄
4.索引列不能參與計算,保持列“干凈”,比如from_unixtime(create_time) = ’2014-05-29’就不能使用到索引,原因很簡單,b+樹中存的都是數據表中的字段值,但進行檢索時,需要把所有元素都應用函數才能比較,顯然成本太大。所以語句應該寫成create_time = unix_timestamp(’2014-05-29’);
5.盡量的擴展索引,不要新建索引。比如表中已經有a的索引,現在要加(a,b)的索引,那么只需要修改原來的索引即可

回到開始的慢查詢

根據最左匹配原則,最開始的sql語句的索引應該是status、operator_id、type、operate_time的聯合索引;其中status、operator_id、type的順序可以顛倒,所以我才會說,把這個表的所有相關查詢都找到,會綜合分析;
比如還有如下查詢

select * from task where status = 0 and type = 12 limit 10; select count(*) from task where status = 0 ;

那么索引建立成(status,type,operator_id,operate_time)就是非常正確的,因為可以覆蓋到所有情況。這個就是利用了索引的最左匹配的原則

查詢優化神器 - explain命令

關于explain命令相信大家并不陌生,具體用法和字段含義可以參考官網explain-output,這里需要強調rows是核心指標,絕大部分rows小的語句執行一定很快(有例外,下面會講到)。所以優化語句基本上都是在優化rows。

慢查詢優化基本步驟

0.先運行看看是否真的很慢,注意設置SQL_NO_CACHE
1.where條件單表查,鎖定最小返回記錄表。這句話的意思是把查詢語句的where都應用到表中返回的記錄數最小的表開始查起,單表每個字段分別查詢,看哪個字段的區分度最高
2.explain查看執行計劃,是否與1預期一致(從鎖定記錄較少的表開始查詢)
3.order by limit 形式的sql語句讓排序的表優先查
4.了解業務方使用場景
5.加索引時參照建索引的幾大原則
6.觀察結果,不符合預期繼續從0分析

幾個慢查詢案例

下面幾個例子詳細解釋了如何分析和優化慢查詢

復雜語句寫法

很多情況下,我們寫SQL只是為了實現功能,這只是第一步,不同的語句書寫方式對于效率往往有本質的差別,這要求我們對mysql的執行計劃和索引原則有非常清楚的認識,請看下面的語句

selectdistinct cert.emp_id fromcm_log cl inner join ( select emp.id as emp_id, emp_cert.id as cert_id from employee emp left join emp_certificate emp_cert on emp.id = emp_cert.emp_id where emp.is_deleted=0 ) cert on ( cl.ref_table='Employee' and cl.ref_oid= cert.emp_id ) or ( cl.ref_table='EmpCertificate' and cl.ref_oid= cert.cert_id ) where cl.last_upd_date >='2013-11-07 15:03:00' and cl.last_upd_date<='2013-11-08 16:00:00';

0.先運行一下,53條記錄 1.87秒,又沒有用聚合語句,比較慢

53 rows in set (1.87 sec)

1.explain

+----+-------------+------------+-------+---------------------------------+-----------------------+---------+-------------------+-------+--------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+------------+-------+---------------------------------+-----------------------+---------+-------------------+-------+--------------------------------+ | 1 | PRIMARY | cl | range | cm_log_cls_id,idx_last_upd_date | idx_last_upd_date | 8 | NULL | 379 | Using where; Using temporary | | 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 63727 | Using where; Using join buffer | | 2 | DERIVED | emp | ALL | NULL | NULL | NULL | NULL | 13317 | Using where | | 2 | DERIVED | emp_cert | ref | emp_certificate_empid | emp_certificate_empid | 4 | meituanorg.emp.id | 1 | Using index | +----+-------------+------------+-------+---------------------------------+-----------------------+---------+-------------------+-------+--------------------------------+

簡述一下執行計劃,首先mysql根據idx_last_upd_date索引掃描cm_log表獲得379條記錄;然后查表掃描了63727條記錄,分為兩部分,derived表示構造表,也就是不存在的表,可以簡單理解成是一個語句形成的結果集,后面的數字表示語句的ID。derived2表示的是ID = 2的查詢構造了虛擬表,并且返回了63727條記錄。我們再來看看ID = 2的語句究竟做了寫什么返回了這么大量的數據,首先全表掃描employee表13317條記錄,然后根據索引emp_certificate_empid關聯emp_certificate表,rows = 1表示,每個關聯都只鎖定了一條記錄,效率比較高。獲得后,再和cm_log的379條記錄根據規則關聯。從執行過程上可以看出返回了太多的數據,返回的數據絕大部分cm_log都用不到,因為cm_log只鎖定了379條記錄。
如何優化呢?可以看到我們在運行完后還是要和cm_log做join,那么我們能不能之前和cm_log做join呢?仔細分析語句不難發現,其基本思想是如果cm_log的ref_table是EmpCertificate就關聯emp_certificate表,如果ref_table是Employee就關聯employee表,我們完全可以拆成兩部分,并用union連接起來,注意這里用union,而不用union all是因為原語句有“distinct”來得到唯一的記錄,而union恰好具備了這種功能。如果原語句中沒有distinct不需要去重,我們就可以直接使用union all了,因為使用union需要去重的動作,會影響SQL性能。
優化過的語句如下

selectemp.id fromcm_log cl inner join employee emp on cl.ref_table = 'Employee' and cl.ref_oid = emp.id where cl.last_upd_date >='2013-11-07 15:03:00' and cl.last_upd_date<='2013-11-08 16:00:00' and emp.is_deleted = 0 union select emp.id from cm_log cl inner join emp_certificate ec on cl.ref_table = 'EmpCertificate' and cl.ref_oid = ec.id inner join employee emp on emp.id = ec.emp_id where cl.last_upd_date >='2013-11-07 15:03:00' and cl.last_upd_date<='2013-11-08 16:00:00' and emp.is_deleted = 0

4.不需要了解業務場景,只需要改造的語句和改造之前的語句保持結果一致

5.現有索引可以滿足,不需要建索引

6.用改造后的語句實驗一下,只需要10ms 降低了近200倍!

+----+--------------+------------+--------+---------------------------------+-------------------+---------+-----------------------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+--------------+------------+--------+---------------------------------+-------------------+---------+-----------------------+------+-------------+ | 1 | PRIMARY | cl | range | cm_log_cls_id,idx_last_upd_date | idx_last_upd_date | 8 | NULL | 379 | Using where | | 1 | PRIMARY | emp | eq_ref | PRIMARY | PRIMARY | 4 | meituanorg.cl.ref_oid | 1 | Using where | | 2 | UNION | cl | range | cm_log_cls_id,idx_last_upd_date | idx_last_upd_date | 8 | NULL | 379 | Using where | | 2 | UNION | ec | eq_ref | PRIMARY,emp_certificate_empid | PRIMARY | 4 | meituanorg.cl.ref_oid | 1 | | | 2 | UNION | emp | eq_ref | PRIMARY | PRIMARY | 4 | meituanorg.ec.emp_id | 1 | Using where | | NULL | UNION RESULT | <union1,2> | ALL | NULL | NULL | NULL | NULL | NULL | | +----+--------------+------------+--------+---------------------------------+-------------------+---------+-----------------------+------+-------------+ 53 rows in set (0.01 sec)

明確應用場景

舉這個例子的目的在于顛覆我們對列的區分度的認知,一般上我們認為區分度越高的列,越容易鎖定更少的記錄,但在一些特殊的情況下,這種理論是有局限性的

select* fromstage_poi sp wheresp.accurate_result=1 and ( sp.sync_status=0 or sp.sync_status=2 or sp.sync_status=4 );

0.先看看運行多長時間,951條數據6.22秒,真的很慢

951 rows in set (6.22 sec)

1.先explain,rows達到了361萬,type = ALL表明是全表掃描

+----+-------------+-------+------+---------------+------+---------+------+---------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+------+---------+------+---------+-------------+ | 1 | SIMPLE | sp | ALL | NULL | NULL | NULL | NULL | 3613155 | Using where | +----+-------------+-------+------+---------------+------+---------+------+---------+-------------+

2.所有字段都應用查詢返回記錄數,因為是單表查詢 0已經做過了951條

3.讓explain的rows 盡量逼近951

看一下accurate_result = 1的記錄數

select count(*),accurate_result from stage_poi group by accurate_result; +----------+-----------------+ | count(*) | accurate_result | +----------+-----------------+ | 1023 | -1 | | 2114655 | 0 | | 972815 | 1 | +----------+-----------------+

我們看到accurate_result這個字段的區分度非常低,整個表只有-1,0,1三個值,加上索引也無法鎖定特別少量的數據

再看一下sync_status字段的情況

select count(*),sync_status from stage_poi group by sync_status; +----------+-------------+ | count(*) | sync_status | +----------+-------------+ | 3080 | 0 | | 3085413 | 3 | +----------+-------------+

同樣的區分度也很低,根據理論,也不適合建立索引

問題分析到這,好像得出了這個表無法優化的結論,兩個列的區分度都很低,即便加上索引也只能適應這種情況,很難做普遍性的優化,比如當sync_status 0、3分布的很平均,那么鎖定記錄也是百萬級別的

4.找業務方去溝通,看看使用場景。業務方是這么來使用這個SQL語句的,每隔五分鐘會掃描符合條件的數據,處理完成后把sync_status這個字段變成1,五分鐘符合條件的記錄數并不會太多,1000個左右。了解了業務方的使用場景后,優化這個SQL就變得簡單了,因為業務方保證了數據的不平衡,如果加上索引可以過濾掉絕大部分不需要的數據

5.根據建立索引規則,使用如下語句建立索引

alter table stage_poi add index idx_acc_status(accurate_result,sync_status);

6.觀察預期結果,發現只需要200ms,快了30多倍。

952 rows in set (0.20 sec)

我們再來回顧一下分析問題的過程,單表查詢相對來說比較好優化,大部分時候只需要把where條件里面的字段依照規則加上索引就好,如果只是這種“無腦”優化的話,顯然一些區分度非常低的列,不應該加索引的列也會被加上索引,這樣會對插入、更新性能造成嚴重的影響,同時也有可能影響其它的查詢語句。所以我們第4步調差SQL的使用場景非常關鍵,我們只有知道這個業務場景,才能更好地輔助我們更好的分析和優化查詢語句。

無法優化的語句

selectc.id,c.name, c.position, c.sex, c.phone, c.office_phone, c.feature_info, c.birthday, c.creator_id, c.is_keyperson, c.giveup_reason, c.status, c.data_source, from_unixtime(c.created_time) as created_time, from_unixtime(c.last_modified) as last_modified, c.last_modified_user_id from contact c inner join contact_branch cb on c.id = cb.contact_id inner join branch_user bu on cb.branch_id = bu.branch_id and bu.status in ( 1, 2) inner join org_emp_info oei on oei.data_id = bu.user_id and oei.node_left >= 2875 and oei.node_right <= 10802 and oei.org_category = - 1 order by c.created_time desc limit 0 , 10;

還是幾個步驟
0.先看語句運行多長時間,10條記錄用了13秒,已經不可忍受

10 rows in set (13.06 sec)

1.explain

+----+-------------+-------+--------+-------------------------------------+-------------------------+---------+--------------------------+------+----------------------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+--------+-------------------------------------+-------------------------+---------+--------------------------+------+----------------------------------------------+ | 1 | SIMPLE | oei | ref | idx_category_left_right,idx_data_id | idx_category_left_right | 5 | const | 8849 | Using where; Using temporary; Using filesort | | 1 | SIMPLE | bu | ref | PRIMARY,idx_userid_status | idx_userid_status | 4 | meituancrm.oei.data_id | 76 | Using where; Using index | | 1 | SIMPLE | cb | ref | idx_branch_id,idx_contact_branch_id | idx_branch_id | 4 | meituancrm.bu.branch_id | 1 | | | 1 | SIMPLE | c | eq_ref | PRIMARY | PRIMARY | 108 | meituancrm.cb.contact_id | 1 | | +----+-------------+-------+--------+-------------------------------------+-------------------------+---------+--------------------------+------+----------------------------------------------+

從執行計劃上看,mysql先查org_emp_info表掃描8849記錄,再用索引idx_userid_status關聯branch_user表,再用索引idx_branch_id關聯contact_branch表,最后主鍵關聯contact表。
rows返回的都非常少,看不到有什么異常情況。我們在看一下語句,發現后面有order by + limit組合,會不會是排序量太大搞的?于是我們簡化SQL,去掉后面的order by 和 limit,看看到底用了多少記錄來排序

selectcount(*) fromcontact c inner join contact_branch cb on c.id = cb.contact_id inner join branch_user bu on cb.branch_id = bu.branch_id and bu.status in ( 1, 2) inner join org_emp_info oei on oei.data_id = bu.user_id and oei.node_left >= 2875 and oei.node_right <= 10802 and oei.org_category = - 1 +----------+ | count(*) | +----------+ | 778878 | +----------+ 1 row in set (5.19 sec)

發現排序之前居然鎖定了778878條記錄,如果針對70萬的結果集排序,將是災難性的,怪不得這么慢,那我們能不能換個思路,先根據contact的created_time排序,再來join會不會比較快呢?
于是改造成下面的語句,也可以用straight_join來優化
select
c.id,
c.name,
c.position,
c.sex,
c.phone,
c.office_phone,
c.feature_info,
c.birthday,
c.creator_id,
c.is_keyperson,
c.giveup_reason,
c.status,
c.data_source,
from_unixtime(c.created_time) as created_time,
from_unixtime(c.last_modified) as last_modified,
c.last_modified_user_id
from
contact c
where
exists (
select
1
from
contact_branch cb
inner join
branch_user bu
on cb.branch_id = bu.branch_id
and bu.status in (
1,
2)
inner join
org_emp_info oei
on oei.data_id = bu.user_id
and oei.node_left >= 2875
and oei.node_right <= 10802
and oei.org_category = - 1
where
c.id = cb.contact_id
)
order by
c.created_time desc limit 0 ,
10;

驗證一下效果 預計在1ms內,提升了13000多倍! ```sql 10 rows in set (0.00 sec)

本以為至此大工告成,但我們在前面的分析中漏了一個細節,先排序再join和先join再排序理論上開銷是一樣的,為何提升這么多是因為有一個limit!大致執行過程是:mysql先按索引排序得到前10條記錄,然后再去join過濾,當發現不夠10條的時候,再次去10條,再次join,這顯然在內層join過濾的數據非常多的時候,將是災難的,極端情況,內層一條數據都找不到,mysql還傻乎乎的每次取10條,幾乎遍歷了這個數據表!
用不同參數的SQL試驗下

selectsql_no_cache c.id,c.name, c.position, c.sex, c.phone, c.office_phone, c.feature_info, c.birthday, c.creator_id, c.is_keyperson, c.giveup_reason, c.status, c.data_source, from_unixtime(c.created_time) as created_time, from_unixtime(c.last_modified) as last_modified, c.last_modified_user_id from contact c where exists ( select 1 from contact_branch cb inner join branch_user bu on cb.branch_id = bu.branch_id and bu.status in ( 1, 2) inner join org_emp_info oei on oei.data_id = bu.user_id and oei.node_left >= 2875 and oei.node_right <= 2875 and oei.org_category = - 1 where c.id = cb.contact_id ) order by c.created_time desc limit 0 , 10; Empty set (2 min 18.99 sec)

2 min 18.99 sec!比之前的情況還糟糕很多。由于mysql的nested loop機制,遇到這種情況,基本是無法優化的。這條語句最終也只能交給應用系統去優化自己的邏輯了。
通過這個例子我們可以看到,并不是所有語句都能優化,而往往我們優化時,由于SQL用例回歸時落掉一些極端情況,會造成比原來還嚴重的后果。所以,第一:不要指望所有語句都能通過SQL優化,第二:不要過于自信,只針對具體case來優化,而忽略了更復雜的情況。

慢查詢的案例就分析到這兒,以上只是一些比較典型的案例。我們在優化過程中遇到過超過1000行,涉及到16個表join的“垃圾SQL”,也遇到過線上線下數據庫差異導致應用直接被慢查詢拖死,也遇到過varchar等值比較沒有寫單引號,還遇到過笛卡爾積查詢直接把從庫搞死。再多的案例其實也只是一些經驗的積累,如果我們熟悉查詢優化器、索引的內部原理,那么分析這些案例就變得特別簡單了。

寫在后面的話

本文以一個慢查詢案例引入了MySQL索引原理、優化慢查詢的一些方法論;并針對遇到的典型案例做了詳細的分析。其實做了這么長時間的語句優化后才發現,任何數據庫層面的優化都抵不上應用系統的優化,同樣是MySQL,可以用來支撐Google/FaceBook/Taobao應用,但可能連你的個人網站都撐不住。套用最近比較流行的話:“查詢容易,優化不易,且寫且珍惜!”

參考

參考文獻如下:
1.《高性能MySQL》
2.《數據結構與算法分析》

總結

以上是生活随笔為你收集整理的(转)MySQL索引原理及慢查询优化的全部內容,希望文章能夠幫你解決所遇到的問題。

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

国产视频91在线 | 欧美性另类 | 99精品视频精品精品视频 | 又黄又爽又湿又无遮挡的在线视频 | 国语久久| 久久福利影视 | 久久精品xxx | 亚洲精品免费在线观看视频 | 玖玖玖精品 | 久久少妇 | 五月婷婷丁香网 | 色婷婷狠狠 | 精品999| 久久久99精品免费观看app | 婷婷视频在线观看 | 国产欧美精品xxxx另类 | 免费在线观看av网址 | 欧美精品乱码久久久久 | 日韩欧美一区二区三区免费观看 | 亚洲永久精品在线观看 | 欧美黑人xxxx猛性大交 | 亚洲一区二区三区毛片 | 外国av网 | 成人三级网站在线观看 | 黄色三级久久 | avwww在线观看 | 超碰在线观看99 | 欧美日韩视频网站 | 在线观看mv的中文字幕网站 | 欧美一区免费在线观看 | 久久久久综合 | 久久天天躁夜夜躁狠狠躁2022 | 人人爽人人射 | 国产又粗又硬又长又爽的视频 | www激情久久 | av高清免费在线 | 久久影院一区 | 中文字幕日韩有码 | 毛片基地黄久久久久久天堂 | 婷婷综合 | av大片免费 | 久久观看免费视频 | 91精品国产欧美一区二区 | 午夜精品一区二区三区在线观看 | 亚洲欧洲精品一区 | 综合网久久 | 国产亚洲婷婷免费 | 性色视频在线 | 欧美性色综合网站 | 99热这里精品 | 日本性xxxxx 亚洲精品午夜久久久 | 久久99免费视频 | 免费观看日韩av | 欧美做受高潮 | 波多野结衣在线视频一区 | 91视频3p| 午夜影视一区 | 成人久久久精品国产乱码一区二区 | 精品国产一区二区三区久久久蜜臀 | av看片网址| 国产69精品久久久久99 | 激情婷婷丁香 | 97狠狠操| av综合av| 国产精品女人久久久 | 久久成人亚洲欧美电影 | 四虎国产精品免费观看视频优播 | 91精品国产92久久久久 | 天天操天天舔天天干 | 久久小视频 | 日本护士三级少妇三级999 | 99亚洲国产 | 亚洲精品美女在线观看 | 毛片在线播放网址 | 久久电影网站中文字幕 | 成人作爱视频 | 探花视频在线观看 | 日韩xxx视频 | 99九九热只有国产精品 | 免费看污在线观看 | 婷婷丁香六月 | 黄a在线观看 | 99久久精品免费一区 | 日韩在线在线 | 中文字幕在线视频第一页 | 亚洲欧洲国产日韩精品 | 色婷婷六月 | 日韩视频在线观看视频 | 91视频啪 | 日日夜夜精品视频天天综合网 | 久久视频6| 国产原创av在线 | 美女久久久久久久久久久 | 日韩欧美视频一区二区三区 | 337p日本大胆噜噜噜噜 | 黄色毛片视频免费观看中文 | 精品视频在线看 | 久久久久久久久国产 | av中文字幕在线观看网站 | 手机在线看永久av片免费 | 最新影院| 色黄www小说| 亚洲婷婷在线 | 色a网| 亚洲性视频 | 国产精品美女久久久久aⅴ 干干夜夜 | 又粗又长又大又爽又黄少妇毛片 | 国产不卡在线视频 | 国产区 在线 | 97色在线视频 | 成人一级视频在线观看 | 国产精品亚洲a | 麻豆91精品91久久久 | www.黄色在线 | 五月婷婷中文网 | av在线进入 | 免费看黄色大全 | 在线免费国产视频 | 美女久久久久久久久久 | 91免费试看 | 奇米导航 | 中文字幕亚洲高清 | 精品国产91亚洲一区二区三区www | 国产亚洲精品免费 | 中文理论片 | 日韩字幕在线 | 色永久免费视频 | 天天干 夜夜操 | 亚洲成年人av | 97超碰福利久久精品 | 欧美久久久久久久 | 久久国产热 | 国产91影视| 欧美精品三级在线观看 | 91日韩精品视频 | 欧美一级激情 | 天躁狠狠躁 | 精品免费视频123区 午夜久久成人 | 国产中文字幕91 | 在线观看av国产 | 999视频在线观看 | 丁香花中文在线免费观看 | 日韩99热 | 久久久精品视频成人 | 国产精品区在线观看 | 亚洲高清在线精品 | 伊人天堂av | 欧洲精品亚洲精品 | 涩涩爱夜夜爱 | 91av免费观看 | 国产在线自 | 欧美成人手机版 | 一区在线电影 | 亚洲成人中文在线 | 国产精品成人一区二区三区吃奶 | 午夜精品久久久久久久99热影院 | 高清av免费看| 精品人妖videos欧美人妖 | 欧美激情精品久久久久久 | 国产精品1区2区3区 久久免费视频7 | 免费观看黄色av | 欧美永久视频 | 精品国产乱码久久久久久天美 | 中文字幕在线观看不卡 | 精品嫩模福利一区二区蜜臀 | 亚洲电影毛片 | 欧美黄污视频 | 二区视频在线观看 | 天天操天天干天天爱 | 福利二区视频 | 日韩在线不卡视频 | 日本中文字幕网 | 亚在线播放中文视频 | 国产成人精品a | 四虎在线观看网址 | 国产精久久久久久久 | 午夜国产一区二区三区四区 | 欧美一区二区三区在线观看 | 日本性久久 | 色姑娘综合网 | 中文字幕亚洲欧美日韩2019 | 香蕉视频4aa | 97色在线观看免费视频 | 成人av一二三区 | 国产精品久久99综合免费观看尤物 | 欧美精品久久久久久久久久丰满 | 亚洲一区二区三区在线看 | 91中文字幕网 | www五月天| 亚州av网站大全 | 二区三区av | 麻豆视频免费入口 | 中文一区二区三区在线观看 | 亚洲精品久久在线 | av在线免费观看网站 | 99久久国产免费,99久久国产免费大片 | 成人av一区二区三区 | 国产999精品久久久影片官网 | 久久精品网址 | 婷婷日韩 | 97成人资源 | 日韩欧美精品在线观看视频 | 中文在线a√在线 | 波多野结衣一区二区 | 91久久精品一区二区三区 | 国产视频一区在线免费观看 | 亚洲国产日韩欧美 | 日韩特级毛片 | 97超碰人人看 | 国产中文字幕在线视频 | 国产精品网站 | 天天色成人网 | 日韩精品一区二区三区水蜜桃 | 三级黄色在线 | 久久久高清视频 | 一区二区三区精品在线视频 | 国产黄色观看 | 丁香六月综合网 | 欧美色一色| 99热99re6国产在线播放 | 日韩在线观看一区二区三区 | 777xxx欧美| 国产色在线观看 | 日韩毛片在线免费观看 | 久草在线国产 | av3级在线 | 色婷婷骚婷婷 | 嫩模bbw搡bbbb搡bbbb | 国产一区不卡在线 | 天天做夜夜做 | 六月丁香六月婷婷 | 国产免费观看久久黄 | 国产精品嫩草69影院 | 深夜免费福利 | 久久精品视频免费播放 | 免费国产一区二区视频 | 久久久精品国产一区二区 | 亚洲 中文字幕av | 99精品免费久久久久久久久 | 久久视频精品 | 丁香免费视频 | 午夜少妇一区二区三区 | 亚洲视频第一页 | 久久久久久高潮国产精品视 | 亚洲精品视频一 | 在线观看www91 | 免费看污污视频的网站 | 久久夜色精品亚洲噜噜国4 午夜视频在线观看欧美 | 天天操天天操天天操天天操 | 成人av动漫在线观看 | www在线观看视频 | 一区二区免费不卡在线 | 欧美成人tv | 亚洲国产精久久久久久久 | 夜夜澡人模人人添人人看 | 色网站视频 | 久久在草 | 欧美精品中文在线免费观看 | 国内外成人在线 | 一区二区三区影院 | 久色小说 | 久久视 | 在线观看黄色的网站 | 好看的国产精品视频 | 在线免费观看的av | 九色最新网址 | 午夜资源站 | 草莓视频在线观看免费观看 | 日韩电影一区二区三区在线观看 | 欧美日韩精品在线视频 | av在线成人 | 国产一在线精品一区在线观看 | 亚洲永久精品在线观看 | 日本巨乳在线 | 国产精品久久久久av福利动漫 | 国产色久| 日韩高清激情 | 中文字幕一区二区三区四区久久 | av在线之家电影网站 | 亚洲精品国产综合99久久夜夜嗨 | 久久精品久久国产 | 久热国产视频 | 欧美日韩高清一区二区三区 | 米奇四色影视 | 中文字幕在线观看一区二区 | 国产精品av在线免费观看 | 亚洲第二色 | 日本中文字幕在线电影 | 另类五月激情 | 91精品一区二区三区蜜臀 | 最新av网址在线观看 | 丁香视频在线观看 | 亚洲欧美国产精品18p | 日本精品久久久久影院 | 欧美精品一区二区在线观看 | 超碰人人草人人 | 亚洲精品国产精品国 | 韩国av电影在线观看 | 国产精品成人自产拍在线观看 | 91男人影院| 日韩电影久久久 | 色在线高清| www.天天干 | 精品91久久久久 | 黄色三级免费观看 | 国产丝袜制服在线 | 国产中文字幕在线播放 | av亚洲产国偷v产偷v自拍小说 | 美女免费视频网站 | 国产一区二区精 | 国产一区av在线 | 超碰在线最新 | 99热这里只有精品久久 | 欧美日韩aa | 香蕉视频国产在线观看 | 日韩免费在线播放 | 美国av大片 | 亚洲色图美腿丝袜 | 日批视频在线播放 | 热久精品| 高清不卡一区二区在线 | 日韩欧美综合视频 | a天堂免费 | 日韩com | bbb搡bbb爽爽爽 | 亚洲成人av一区二区 | 精品国产乱码久久久久久久 | 婷婷激情av | 高清一区二区三区 | 日韩在线精品一区 | 中文字幕成人在线观看 | 日韩二区在线 | 在线视频你懂得 | 精品国产一区二区三区男人吃奶 | 黄色大片国产 | 国产无套一区二区三区久久 | 在线观看mv的中文字幕网站 | 久久久久女人精品毛片九一 | 99免费在线视频 | 在线观看黄色 | 在线观看中文字幕网站 | 五月婷婷六月综合 | 草久久久久久久 | 成人黄色中文字幕 | 久久久久久久久久久国产精品 | 国产精品精品久久久久久 | 在线免费国产 | 欧美国产91 | 999电影免费在线观看 | 成人精品亚洲 | 国产一区二区三区午夜 | 98久久| 美女精品 | 中文字幕 在线看 | 国产最新视频在线 | 亚洲精品久久久久久中文传媒 | 奇米影视8888在线观看大全免费 | 国产一级黄色电影 | 91精品国产欧美一区二区成人 | 91超级碰 | 欧美日韩大片在线观看 | 99免费国产 | 欧美日韩一区二区三区在线免费观看 | 丁香六月网| 色综合天天视频在线观看 | 国产亚洲精品久久久久久久久久久久 | 伊人国产在线播放 | 97碰在线 | 中文字幕韩在线第一页 | 视频二区在线 | www.久草.com | 啪嗒啪嗒免费观看完整版 | 婷婷激情五月 | 欧美在线观看视频免费 | 美女啪啪图片 | 麻豆国产视频 | 在线一区观看 | 国产精品美女久久 | 中文网丁香综合网 | 久久九九网站 | 特级毛片网 | 91成人网在线播放 | 2018好看的中文在线观看 | 久久综合九色综合久久久精品综合 | 国产精品 日韩 | 亚洲乱码精品 | 日韩免费播放 | av一区二区三区在线播放 | 日韩精品免费在线视频 | 久久国内免费视频 | 亚洲区精品视频 | 黄色av网站在线观看 | 视频一区二区在线观看 | 午夜精品婷婷 | 狠狠干天天操 | 天天躁天天躁天天躁婷 | 欧美在线视频二区 | 日韩毛片在线免费观看 | 精品国产免费av | 91.精品高清在线观看 | 91精彩视频在线观看 | 91成人国产 | 亚洲视屏 | 国产精品乱码久久久 | 日韩成人在线免费观看 | 亚洲一区日韩 | 亚洲精品成人 | 国产精品久久久久久久久久妇女 | 国产精品成人自产拍在线观看 | 精品在线视频观看 | 国产精品视频免费看 | www.黄色| 99精品一区| 中文字幕黄色网 | 欧美午夜性 | 精品超碰 | 国产黄a三级三级 | 狠狠干天天射 | 亚洲精品久久久久久久不卡四虎 | 亚洲精品视频在线播放 | 国产在线毛片 | 中文国产在线观看 | 欧美疯狂性受xxxxx另类 | 日韩资源在线 | 黄色av网站在线观看免费 | 国产91学生粉嫩喷水 | 久久观看最新视频 | 91成品人影院 | a天堂在线看 | 国产剧在线观看片 | 国产91精品一区二区绿帽 | 国产黄a三级三级三级三级三级 | 久久亚洲免费视频 | 国产黄色精品网站 | 久久久影院官网 | 日本三级全黄少妇三2023 | 99re中文字幕 | 青春草视频在线播放 | 国产美女网站在线观看 | 亚洲国产剧情av | 免费在线观看一级片 | 久久不色| 福利二区视频 | 精品特级毛片 | 国产在线精品播放 | 婷婷5月色 | 国产 欧美 日产久久 | 99成人免费视频 | 国产精品a久久久久 | 国产一级高清 | 九九有精品 | 亚洲专区欧美专区 | 天天操天天色天天射 | 国产中文字幕在线播放 | 国产精品福利在线播放 | av噜噜噜在线播放 | 激情网站五月天 | 91传媒在线| 精品资源在线 | 在线播放第一页 | 国产99久久九九精品免费 | 97碰碰视频| 911国产在线观看 | 在线电影a | 成人一级片免费看 | 国产精品日韩在线播放 | 精品 激情 | 蜜臀久久99静品久久久久久 | 91视频成人免费 | 日韩av中文字幕在线 | www在线观看视频 | 久久综合狠狠狠色97 | 激情综合中文娱乐网 | 亚洲精品九九 | 91精品办公室少妇高潮对白 | 免费国产视频 | 欧美极品少妇xbxb性爽爽视频 | 国产亚洲精品久久久久久网站 | 欧美在线视频一区二区三区 | 99视频在线观看视频 | 久久人人97超碰com | 在线日韩精品视频 | 国产一级在线视频 | 午夜视频在线网站 | 日韩精品免费一区二区 | 亚洲午夜精品电影 | www好男人 | 免费在线观看一区二区三区 | 亚洲va综合va国产va中文 | 成人精品久久久 | 国产精品18毛片一区二区 | 免费的国产精品 | 麻豆91精品91久久久 | 日韩二区三区在线 | 欧美另类高潮 | 中文字幕色在线视频 | 欧美日韩3p | 国产婷婷久久 | 欧亚日韩精品一区二区在线 | 日日夜夜操av | 日韩三级免费观看 | 国产护士在线 | 欧美日韩国产精品一区 | 日韩精品一区二区在线观看 | 亚洲成人二区 | 久久99精品波多结衣一区 | 亚洲国产97在线精品一区 | 国产亚洲欧美在线视频 | 日韩在线免费视频观看 | 久久综合狠狠综合久久激情 | aav在线 | 色悠悠久久综合 | 激情图片区 | 97久久久免费福利网址 | 伊人天天干 | 日韩欧美一区二区三区视频 | 九九在线免费视频 | 一区二区中文字幕在线观看 | 久久精品一区二区三区国产主播 | 日韩 在线观看 | 国产麻豆电影在线观看 | 国产成人三级在线 | 国产乱码精品一区二区三区介绍 | 在线视频你懂得 | 亚欧日韩av| 91精品国产九九九久久久亚洲 | 国产精品av久久久久久无 | 亚洲国产精品女人久久久 | 在线看黄色av | 免费在线观看黄 | 中文字幕亚洲精品日韩 | 日本黄色免费在线 | 人人狠狠 | 精品专区一区二区 | 午夜视频99 | 日韩av成人在线观看 | 久操视频在线观看 | 91x色| 中文字幕在线一区观看 | 久久久久久久久久久免费 | 国精产品999国精产品视频 | 黄色三几片| 97操操| 久久毛片视频 | 蜜臀av性久久久久av蜜臀妖精 | 精品国产乱码久久久久久1区2匹 | 日韩一区二区三区在线观看 | 亚洲一级电影 | 色综合久久66 | 国产精品对白一区二区三区 | 亚洲黄色免费 | 97爱| 国产91精品在线播放 | 中文字幕在线播放日韩 | 国产蜜臀av | 波多野结衣电影久久 | 西西4444www大胆无视频 | 美女国内精品自产拍在线播放 | 在线不卡视频 | 日韩福利在线观看 | 亚洲蜜桃av| 国产精品毛片一区二区在线看 | 一级一级一片免费 | 久久久久久久久综合 | 欧美日韩一级视频 | 在线免费精品视频 | 国产综合在线视频 | 日本中文字幕在线电影 | 免费看三级黄色片 | 精品国产诱惑 | a天堂一码二码专区 | 日日夜夜中文字幕 | 免费观看www小视频的软件 | 国产999免费视频 | 少妇搡bbbb搡bbb搡69 | 黄色三级在线观看 | 欧美精品小视频 | 综合天天久久 | 91精品老司机久久一区啪 | 国产手机视频在线 | 久久99精品热在线观看 | 91久久奴性调教 | 91亚洲在线观看 | 日本久久精品 | 国产中文 | 国产一级电影免费观看 | 在线精品视频免费观看 | 国产热re99久久6国产精品 | 中文字幕有码在线 | 狠狠操在线| 久久av免费观看 | 亚洲国产日韩av | 日本 在线 视频 中文 有码 | 欧美日高清视频 | 激情综合色综合久久综合 | 久久激情电影 | 久久精品亚洲一区二区三区观看模式 | 麻豆成人精品视频 | 91精品国产高清自在线观看 | 成人av中文字幕 | ww视频在线观看 | 精品国产一区二区三区四区在线观看 | 欧洲一区二区三区精品 | 狠狠88综合久久久久综合网 | 久久躁日日躁aaaaxxxx | 国产特级毛片aaaaaa | 最近中文字幕mv免费高清在线 | 激情综合网色播五月 | 国产精品日韩久久久久 | 中文字幕亚洲欧美日韩 | 国产一级精品视频 | 欧美日韩一区二区三区不卡 | 观看免费av| 久久精品国产精品亚洲 | 日韩免费观看一区二区 | 综合激情网... | www在线观看国产 | 一区二区欧美在线观看 | 97视频免费观看 | 天天久久综合 | 精品一区免费 | 国产特级毛片aaaaaa毛片 | 久久久福利影院 | 91九色视频在线 | 美女视频免费一区二区 | 精品久久久久久综合日本 | 国产中文字幕网 | 91人人澡人人爽人人精品 | 国内精品久久久久久久久久久久 | 国产无遮挡猛进猛出免费软件 | av免费在线网| 国产视频在线播放 | 久久久久国产成人免费精品免费 | 九九欧美 | 在线视频久 | 免费久久99精品国产 | 亚洲精品国产片 | av在线最新 | 亚洲免费视频在线观看 | 久久久网 | 一区二区三区在线免费观看视频 | 色综合天 | 精选久久 | 99草视频在线观看 | 免费在线色视频 | 久艹在线观看视频 | 国产视频手机在线 | 国产一二区视频 | 成人三级网址 | 网站你懂的 | 日韩.com| 免费网站在线观看成人 | 日韩视频区 | 日韩成人免费在线 | 成人h视频 | 人人干人人干人人干 | 91女神的呻吟细腰翘臀美女 | 成年美女黄网站色大片免费看 | 精品国产一区二区三区久久影院 | 男女激情网址 | 久久综合九色综合网站 | 国产视频一区在线播放 | 国产资源网站 | 久久国产精品色婷婷 | 黄av资源 | 久久久久99精品国产片 | 五月天高清欧美mv | 婷婷国产在线 | 97热久久免费频精品99 | 免费看国产黄色 | 日韩网站中文字幕 | av大片免费在线观看 | 97av视频在线观看 | 成年人电影免费在线观看 | 日本久久综合网 | 久草在线资源网 | 三级av小说| 最新av免费 | 亚洲欧洲xxxx | 婷婷在线免费观看 | 欧美大荫蒂xxx | 一区二区三区久久精品 | 精品视频久久久 | 日本精油按摩3 | 天天综合色网 | 亚洲专区视频在线观看 | 久久精品91视频 | 成人小视频在线免费观看 | 日本久久91| 黄色小说在线免费观看 | 久久精久久精 | 久久精品免视看 | 国产精成人品免费观看 | 中文字幕专区高清在线观看 | 亚洲色五月 | 久久不射电影院 | 9在线观看免费高清完整版在线观看明 | 日韩一区二区三 | 久久视频在线免费观看 | 久久国产经典 | 日韩美女黄色片 | 中文字幕亚洲欧美 | 久久精品爱视频 | 欧美国产精品久久久久久免费 | 免费激情网 | 亚洲 综合 国产 精品 | 操天天操| 免费观看黄 | 欧美日韩另类在线观看 | 久久精品视频国产 | 天天操福利视频 | 久久丁香网 | 中文字幕日韩一区二区三区不卡 | 免费看毛片在线 | 手机在线观看国产精品 | 国产 在线观看 | 伊色综合久久之综合久久 | 色av网站 | 人人躁 | 久久99精品久久久久久 | 欧美色图88| 久久在现| 五月激情天| 色多多污污 | 久久九精品 | 成人在线视频论坛 | 91色亚洲| 精品 一区 在线 | 国产精品色在线 | 日韩精品一区二区三区免费视频观看 | 日韩二区三区在线 | 三级av在线 | 摸阴视频 | 综合久久久久 | 中文字幕乱在线伦视频中文字幕乱码在线 | 成人久久18免费网站麻豆 | 亚洲91中文字幕无线码三区 | 欧洲一区精品 | 亚洲午夜电影网 | 一区二区三区日韩在线观看 | 色a在线观看 | 色在线国产 | 国产成人精品久久亚洲高清不卡 | 美女黄色网在线播放 | 亚洲第一香蕉视频 | 成人免费视频网站在线观看 | 日韩中文在线电影 | 欧洲精品码一区二区三区免费看 | 97精品欧美91久久久久久 | 久久在线免费视频 | 91av视频在线免费观看 | 麻豆视频观看 | 国产黄色大片免费看 | 久久久.com | 天天操天天操天天操天天操天天操 | 免费在线观看中文字幕 | 99色视频 | 中文字幕电影一区 | 又黄又刺激视频 | 中国一级片在线 | 狠狠干狠狠色 | 婷婷亚洲五月 | 国产剧情在线一区 | 草久久久 | av中文字幕在线免费观看 | 成人久久久精品国产乱码一区二区 | 亚洲一区二区三区四区在线视频 | 亚洲综合色婷婷 | 久久国产精品99久久久久久丝袜 | 日韩精品在线观看av | 国产精品久久一区二区无卡 | 日韩精品一区二区三区在线视频 | 亚洲精品一区二区在线观看 | 狂野欧美激情性xxxx欧美 | 成人黄色在线视频 | 中文字幕一区av | 91精品久久久久久综合乱菊 | 久久伊人国产精品 | 亚洲爱爱视频 | 亚洲一级国产 | 麻豆视频一区二区 | 婷婷丁香久久五月婷婷 | 日日夜夜精品免费观看 | 手机看片午夜 | 密桃av在线 | 国产字幕av| 园产精品久久久久久久7电影 | 色97在线 | 国产精品美女久久久 | 中文字幕在线免费 | 精品久久91| 久久精品精品电影网 | 国产福利一区二区三区视频 | 国产成免费视频 | 99在线免费视频 | 国产日韩精品一区二区三区在线 | 色视频 在线 | www.久久免费 | 人人爽人人射 | 国产中文字幕在线 | 久久tv视频 | 国产99久久久国产精品免费看 | 日韩在线观看你懂得 | 国产破处在线视频 | 9999免费视频 | 成人网页在线免费观看 | 国产一级性生活 | 亚洲黄色在线观看 | 精品视频在线免费 | 日韩高清无线码2023 | av丝袜制服 | 欧美亚洲成人免费 | 91cn国产在线 | 色综合小说 | 狠狠色丁香婷婷综合久小说久 | 免费看亚洲毛片 | 三级黄色网址 | 国产色黄网站 | 天天草综合 | 悠悠av资源片 | 国产一区二区手机在线观看 | 亚洲久草在线视频 | 99热在线观看 | 一区二区不卡 | 麻豆免费在线视频 | 亚洲欧美激情插 | 中文超碰字幕 | 国产精品久久久久久婷婷天堂 | 51久久夜色精品国产麻豆 | 国产精品一区二区在线 | 美女一区网站 | 人人舔人人插 | 99久久久国产精品免费观看 | 日韩最新av在线 | 久久激情网站 | 天天操天天添 | 国产精品区二区三区日本 | av电影 一区二区 | 91福利视频网站 | 国产在线久草 | 天天干天天射天天插 | 成人免费看视频 | 91亚洲精品久久久中文字幕 | 91av在线免费播放 | 久久伦理网 | 黄色成人av网址 | 性色视频在线 | 片网站 | 亚洲精品成人在线 | 91av在线免费观看 | 欧美视频18 | 在线影院av | 色视频在线 | 玖玖视频国产 | 天天操天天干天天操天天干 | 最近日本字幕mv免费观看在线 | 久久久久久久久久久精 | 免费国产一区二区视频 | 黄色免费网站 | av网站在线观看播放 | 国产精品一区二区久久精品 | 国产在线不卡视频 | www.福利| 亚洲欧美婷婷六月色综合 | 97国产小视频 | 午夜视频在线观看一区二区三区 | 久久精品3 | 久久免费电影 | 在线观看精品一区 | 精品亚洲免a | 一二区av| 天天操网站 | 久久成人人人人精品欧 | av片一区| 国产字幕在线看 | 欧美精品被 | 日本久久电影网 | 欧美一区二区伦理片 | 日韩午夜小视频 | 久草精品电影 | 国产中文字幕一区二区三区 | 色综合狠狠干 | 成人国产精品久久久久久亚洲 | 国产在线传媒 | 中文av影院| 国产不卡视频 | 午夜av网站 | 91精品国产九九九久久久亚洲 | 深夜福利视频在线观看 | 日韩理论在线视频 | 91精品国产乱码在线观看 | 最近日韩中文字幕中文 | 国产专区日韩专区 | 国产丝袜制服在线 | 免费在线观看污网站 | 91中文字幕一区 | 欧美激情精品久久久久久变态 | 亚洲欧美日本一区二区三区 | 国产v在线播放 | 四虎在线免费视频 | 狠狠干网址| 久久精品久久99精品久久 | av片子在线观看 | 2023av| 操操综合 | 人人草天天草 | 国内精品久久久久影院优 | 日本在线中文在线 | 久久99久久99精品 | 久久电影网站中文字幕 | 国产精品网红直播 | 久久中文精品视频 | 五月天精品视频 | 欧美一级日韩三级 | 久久亚洲国产精品 | 成年人免费看的视频 | 久久久高清一区二区三区 | 99热99热 | 免费在线精品视频 | 午夜影视一区 | 国产中文视 | 欧美资源在线观看 | 国产精品一区免费观看 | 91精品久久久久久 | 在线国产日韩 | 亚洲黄色在线观看 | 97视频在线 | 日韩欧美99 | 91av原创 | 99视频在线 | 亚洲精品欧美成人 | 久久这里只有精品9 | 久久综合影音 | 天天爱综合 | 一区二区三区免费网站 | av在线亚洲天堂 | 香蕉视频免费在线播放 | 亚洲专区一二三 | 在线中文视频 | 国产精品一区二区在线观看 | 国产精品ⅴa有声小说 | 97精品国产91久久久久久久 | 在线一区观看 | 免费av在线网站 | 国产日本亚洲高清 | av成人动漫在线观看 | 日日干av | 亚洲欧美国产视频 | 天天干天天色2020 | 992tv在线观看网站 | 精品在线播放视频 | 天天操天天色天天射 | 久久精品79国产精品 | 92国产精品久久久久首页 | 狠狠撸电影| 狠狠夜夜| 国产视频一二区 | 日本丶国产丶欧美色综合 | 中文字幕av最新更新 | 精品一区精品二区 | 久久综合精品一区 | 久久精品观看 | 日本久久综合视频 | 色婷丁香 | 91九色蝌蚪国产 | 色五月成人 | 精品国产激情 | 日韩精品一区二区三区第95 | 91视频麻豆 | 91色国产| 操操操日日日干干干 | 精品久久久久亚洲 | 中文字幕在线观看网址 | av在线最新| 精品久久一区 | 久久综合久久综合这里只有精品 | 久久精品视频免费观看 | 美女视频黄频大全免费 | 精品久久久久久国产偷窥 | 欧美国产大片 | 丁香婷婷激情国产高清秒播 | 日本在线精品视频 | 久久精品九色 | 超碰精品在线观看 | 国产高清无线码2021 | 婷婷婷国产在线视频 | 99热最新在线 | 狠狠操91| 99精彩视频 | 亚洲国产中文字幕在线 | 午夜精品视频免费在线观看 | 国产精品99久久久 | 国产精品久久99精品毛片三a | 久草视频免费在线播放 | 99视频+国产日韩欧美 | 97在线影院 | 日韩电影在线一区二区 | 国产在线精品二区 |