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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

cpci检索为什么那么慢_索引原理与慢查询优化

發布時間:2025/3/19 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 cpci检索为什么那么慢_索引原理与慢查询优化 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、前言

為何要有索引?

一般的應用系統,讀寫比例在10:1左右,而且插入操作和一般的更新操作很少出現性能問題,在生產環境中,我們遇到最多的,也是最容易出問題的,還是一些復雜的查詢操作,因此對查詢語句的優化顯然是重中之重。說起加速查詢,就不得不提到索引了。

什么是索引?

索引在MySQL中也叫做“鍵”,是存儲引擎用于快速找到記錄的一種數據結構。索引對于良好的性能

非常關鍵,尤其是當表中的數據量越來越大時,索引對于性能的影響愈發重要。

索引優化應該是對查詢性能優化最有效的手段了。索引能夠輕易將查詢性能提高好幾個數量級。

索引相當于字典的音序表,如果要查某個字,如果不使用音序表,則需要從幾百頁中逐頁去查。

索引是應用程序設計和開發的一個重要方面。若索引太多,應用程序的性能可能會受到影響。而索引太少,對查詢性能又會產生影響,要找到一個平衡點,這對應用程序的性能至關重要。一些開發人員總是在事后才想起添加索引----我一直認為,這源于一種錯誤的開發模式。如果知道數據的使用,從一開始就應該在需要處添加索引。開發人員往往對數據庫的使用停留在應用的層面,比如編寫SQL語句、存儲過程之類,他們甚至可能不知道索引的存在,或認為事后讓相關DBA加上即可。DBA往往不夠了解業務的數據流,而添加索引需要通過監控大量的SQL語句進而從中找到問題,這個步驟所需的時間肯定是遠大于初始添加索引所需的時間,并且可能會遺漏一部分的索引。當然索引也并不是越多越好,我曾經遇到過這樣一個問題:某臺MySQL服務器iostat顯示磁盤使用率一直處于100%,經過分析后發現是由于開發人員添加了太多的索引,在刪除一些不必要的索引之后,磁盤使用率馬上下降為20%。可見索引的添加也是非常有技術含量的。

你是否對索引存在誤解?

二、索引的原理

索引原理

索引的目的在于提高查詢效率,與我們查閱圖書所用的目錄是一個道理:先定位到章,然后定位到該章下的一個小節,然后找到頁數。相似的例子還有:查字典,查火車車次,飛機航班等

本質都是:通過不斷地縮小想要獲取數據的范圍來篩選出最終想要的結果,同時把隨機的事件變成順序的事件,也就是說,有了這種索引機制,我們可以總是用同一種查找方式來鎖定數據。

數據庫也是一樣,但顯然要復雜的多,因為不僅面臨著等值查詢,還有范圍查詢(>、

磁盤IO與預讀

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

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

三、索引的數據結構

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

四、 聚集索引與輔助索引

在數據庫中,B+樹的高度一般都在2~4層,這也就是說查找某一個鍵值的行記錄時最多只需要2到4次IO,這倒不錯。因為當前一般的機械硬盤每秒至少可以做100次IO,2~4次的IO意味著查詢時間只需要0.02~0.04秒。

數據庫中的B+樹索引可以分為聚集索引(clustered index)和輔助索引(secondary index),

聚集索引與輔助索引相同的是:不管是聚集索引還是輔助索引,其內部都是B+樹的形式,即高度是平衡的,葉子結點存放著所有的數據。

聚集索引與輔助索引不同的是:葉子結點存放的是否是一整行的信息

1、聚集索引

#InnoDB存儲引擎表示索引組織表,即表中數據按照主鍵順序存放。而聚集索引(clustered index)就是按照每張表的主鍵構造一棵B+樹,同時葉子結點存放的即為整張表的行記錄數據,也將聚集索引的葉子結點稱為數據頁。聚集索引的這個特性決定了索引組織表中數據也是索引的一部分。同B+樹數據結構一樣,每個數據頁都通過一個雙向鏈表來進行鏈接。

#如果未定義主鍵,MySQL取第一個唯一索引(unique)而且只含非空列(NOT NULL)作為主鍵,InnoDB使用它作為聚簇索引。

#如果沒有這樣的列,InnoDB就自己產生一個這樣的ID值,它有六個字節,而且是隱藏的,使其作為聚簇索引。

#由于實際的數據頁只能按照一棵B+樹進行排序,因此每張表只能擁有一個聚集索引。在多少情況下,查詢優化器傾向于采用聚集索引。因為聚集索引能夠在B+樹索引的葉子節點上直接找到數據。此外由于定義了數據的邏輯順序,聚集索引能夠特別快地訪問針對范圍值得查詢。

View Code

聚集索引的好處之一:它對主鍵的排序查找和范圍查找速度非常快,葉子節點的數據就是用戶所要查詢的數據。如用戶需要查找一張表,查詢最后的10位用戶信息,由于B+樹索引是雙向鏈表,所以用戶可以快速找到最后一個數據頁,并取出10條記錄

#參照第六小結測試索引的準備階段來創建出表s1

mysql> desc s1; #最開始沒有主鍵

+--------+-------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+--------+-------------+------+-----+---------+-------+

| id | int(11) | NO | | NULL | |

| name | varchar(20) | YES | | NULL | |

| gender | char(6) | YES | | NULL | |

| email | varchar(50) | YES | | NULL | |

+--------+-------------+------+-----+---------+-------+

4 rows in set (0.00sec)

mysql> explain select * from s1 order by id desc limit 10; #Using filesort,需要二次排序

+----+-------------+-------+------------+------+---------------+------+---------+------+---------+----------+----------------+

| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |

+----+-------------+-------+------------+------+---------------+------+---------+------+---------+----------+----------------+

| 1 | SIMPLE | s1 | NULL | ALL | NULL | NULL | NULL | NULL | 2633472 | 100.00 | Using filesort |

+----+-------------+-------+------------+------+---------------+------+---------+------+---------+----------+----------------+

1 row in set, 1 warning (0.11sec)

mysql> alter table s1 add primary key(id); #添加主鍵

Query OK, 0 rows affected (13.37sec)

Records: 0 Duplicates: 0 Warnings: 0

mysql> explain select * from s1 order by id desc limit 10; #基于主鍵的聚集索引在創建完畢后就已經完成了排序,無需二次排序

+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------+

| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |

+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------+

| 1 | SIMPLE | s1 | NULL | index | NULL | PRIMARY | 4 | NULL | 10 | 100.00 | NULL |

+----+-------------+-------+------------+-------+---------------+---------+---------+------+------+----------+-------+

1 row in set, 1 warning (0.04 sec)

View Code

聚集索引的好處之二:范圍查詢(range query),即如果要查找主鍵某一范圍內的數據,通過葉子節點的上層中間節點就可以得到頁的范圍,之后直接讀取數據頁即可

mysql>alter table s1 drop primary key;

Query OK,2699998 rows affected (24.23sec)

Records:2699998Duplicates: 0 Warnings: 0

mysql>desc s1;+--------+-------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+--------+-------------+------+-----+---------+-------+

| id | int(11) | NO | | NULL | |

| name | varchar(20) | YES | | NULL | |

| gender | char(6) | YES | | NULL | |

| email | varchar(50) | YES | | NULL | |

+--------+-------------+------+-----+---------+-------+

4 rows in set (0.12sec)

mysql> explain select * from s1 where id > 1 and id < 1000000; #沒有聚集索引,預估需要檢索的rows數如下

+----+-------------+-------+------------+------+---------------+------+---------+------+---------+----------+-------------+

| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |

+----+-------------+-------+------------+------+---------------+------+---------+------+---------+----------+-------------+

| 1 | SIMPLE | s1 | NULL | ALL | NULL | NULL | NULL | NULL | 2690100 | 11.11 | Using where |

+----+-------------+-------+------------+------+---------------+------+---------+------+---------+----------+-------------+

1 row in set, 1 warning (0.00sec)

mysql>alter table s1 add primary key(id);

Query OK, 0 rows affected (16.25sec)

Records: 0 Duplicates: 0 Warnings: 0

mysql> explain select * from s1 where id > 1 and id < 1000000; #有聚集索引,預估需要檢索的rows數如下

+----+-------------+-------+------------+-------+---------------+---------+---------+------+---------+----------+-------------+

| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |

+----+-------------+-------+------------+-------+---------------+---------+---------+------+---------+----------+-------------+

| 1 | SIMPLE | s1 | NULL | range | PRIMARY | PRIMARY | 4 | NULL | 1343355 | 100.00 | Using where |

+----+-------------+-------+------------+-------+---------------+---------+---------+------+---------+----------+-------------+

1 row in set, 1 warning (0.09 sec)

View Code

2、輔助索引

表中除了聚集索引外其他索引都是輔助索引(Secondary Index,也稱為非聚集索引),與聚集索引的區別是:輔助索引的葉子節點不包含行記錄的全部數據。

葉子節點除了包含鍵值以外,每個葉子節點中的索引行中還包含一個書簽(bookmark)。該書簽用來告訴InnoDB存儲引擎去哪里可以找到與索引相對應的行數據。

由于InnoDB存儲引擎是索引組織表,因此InnoDB存儲引擎的輔助索引的書簽就是相應行數據的聚集索引鍵。如下圖

輔助索引的存在并不影響數據在聚集索引中的組織,因此每張表上可以有多個輔助索引,但只能有一個聚集索引。當通過輔助索引來尋找數據時,InnoDB存儲引擎會遍歷輔助索引并通過葉子級別的指針獲得只想主鍵索引的主鍵,然后再通過主鍵索引來找到一個完整的行記錄。

舉例來說,如果在一棵高度為3的輔助索引樹種查找數據,那需要對這個輔助索引樹遍歷3次找到指定主鍵,如果聚集索引樹的高度同樣為3,那么還需要對聚集索引樹進行3次查找,最終找到一個完整的行數據所在的頁,因此一共需要6次邏輯IO訪問才能得到最終的一個數據頁。

五、MySQL索引管理

1. 功能

#1. 索引的功能就是加速查找#2. mysql中的primary key,unique,聯合唯一也都是索引,這些索引除了加速查找以外,還有約束的功能

2. MySQL常用的索引

普通索引INDEX:加速查找

唯一索引:-主鍵索引PRIMARY KEY:加速查找+約束(不為空、不能重復)-唯一索引UNIQUE:加速查找+約束(不能重復)

聯合索引:-PRIMARY KEY(id,name):聯合主鍵索引-UNIQUE(id,name):聯合唯一索引-INDEX(id,name):聯合普通索引

舉個例子來說,比如你在為某商場做一個會員卡的系統。

這個系統有一個會員表

有下列字段:

會員編號 INT

會員姓名 VARCHAR(10)

會員身份證號碼 VARCHAR(18)

會員電話 VARCHAR(10)

會員住址 VARCHAR(50)

會員備注信息 TEXT

那么這個 會員編號,作為主鍵,使用 PRIMARY

會員姓名 如果要建索引的話,那么就是普通的 INDEX

會員身份證號碼 如果要建索引的話,那么可以選擇 UNIQUE (唯一的,不允許重復)#除此之外還有全文索引,即FULLTEXT

會員備注信息 , 如果需要建索引的話,可以選擇全文搜索。

用于搜索很長一篇文章的時候,效果最好。

用在比較短的文本,如果就一兩行字的,普通的 INDEX 也可以。

但其實對于全文搜索,我們并不會使用MySQL自帶的該索引,而是會選擇第三方軟件如Sphinx,專門來做全文搜索。#其他的如空間索引SPATIAL,了解即可,幾乎不用

View Code

3.?索引的兩大類型hash與btree

#我們可以在創建上述索引的時候,為其指定索引類型,分兩類

hash類型的索引:查詢單條快,范圍查詢慢

btree類型的索引:b+樹,層數越多,數據量指數級增長(我們就用它,因為innodb默認支持它)#不同的存儲引擎支持的索引類型也不一樣

InnoDB 支持事務,支持行級別鎖定,支持 B-tree、Full-text 等索引,不支持 Hash 索引;

MyISAM 不支持事務,支持表級別鎖定,支持 B-tree、Full-text 等索引,不支持 Hash 索引;

Memory 不支持事務,支持表級別鎖定,支持 B-tree、Hash 等索引,不支持 Full-text 索引;

NDB 支持事務,支持行級別鎖定,支持 Hash 索引,不支持 B-tree、Full-text 等索引;

Archive 不支持事務,支持表級別鎖定,不支持 B-tree、Hash、Full-text 等索引;

4.?創建/刪除索引的語法

#方法一:創建表時

CREATE TABLE 表名 (

字段名1 數據類型 [完整性約束條件…],

字段名2 數據類型 [完整性約束條件…],

[UNIQUE| FULLTEXT | SPATIAL ] INDEX |KEY6.

[索引名] (字段名[(長度)] [ASC|DESC])

);#方法二:CREATE在已存在的表上創建索引

CREATE [UNIQUE | FULLTEXT |SPATIAL ] INDEX 索引名

ON 表名 (字段名[(長度)] [ASC|DESC]) ;#方法三:ALTER TABLE在已存在的表上創建索引

ALTER TABLE 表名 ADD [UNIQUE | FULLTEXT |SPATIAL ] INDEX

索引名 (字段名[(長度)] [ASC|DESC]) ;#刪除索引:DROP INDEX 索引名 ON 表名字;

#方式一

create table t1(

id int,

name char,

age int,

sex enum('male','female'),

unique key uni_id(id),

index ix_name(name)#index沒有key

);#方式二

create index ix_age on t1(age);#方式三

alter table t1 add index ix_sex(sex);#查看

mysql>show create table t1;| t1 |CREATE TABLE `t1` (

`id` int(11) DEFAULT NULL,

`name` char(1) DEFAULT NULL,

`age` int(11) DEFAULT NULL,

`sex` enum('male','female') DEFAULT NULL,

UNIQUE KEY `uni_id` (`id`),

KEY `ix_name` (`name`),

KEY `ix_age` (`age`),

KEY `ix_sex` (`sex`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1

示范

六、測試索引

1. 準備

#1. 準備表

create table s1(

id int,

name varchar(20),

gender char(6),

email varchar(50)

);#2. 創建存儲過程,實現批量插入記錄

delimiter $$ #聲明存儲過程的結束符號為$$

create procedure auto_insert1()

BEGIN

declare i int default1;while(i<3000000)do

insert into s1 values(i,'egon','male',concat('egon',i,'@oldboy'));

set i=i+1;

endwhile;

END$$#$$結束

delimiter ; #重新聲明分號為結束符號

#3. 查看存儲過程

show create procedure auto_insert1\G#4. 調用存儲過程

call auto_insert1();

View Code

2. 在沒有索引的前提下測試查詢速度

#無索引:mysql根本就不知道到底是否存在id等于333333333的記錄,只能把數據表從頭到尾掃描一遍,此時有多少個磁盤塊就需要進行多少IO操作,所以查詢速度很慢

mysql> select * from s1 where id=333333333;

Empty set (0.33 sec)

3. 在表中已經存在大量數據的前提下,為某個字段段建立索引,建立速度會很慢

4.在索引建立完畢后,以該字段為查詢條件時,查詢速度提升明顯

PS:

1. mysql先去索引表里根據b+樹的搜索原理很快搜索到id等于333333333的記錄不存在,IO大大降低,因而速度明顯提升

2. 我們可以去mysql的data目錄下找到該表,可以看到占用的硬盤空間多了

3. 需要注意,如下圖

5 總結

#1. 一定是為搜索條件的字段創建索引,比如select * from s1 where id = 333;就需要為id加上索引

#2. 在表中已經有大量數據的情況下,建索引會很慢,且占用硬盤空間,建完后查詢速度加快

比如create index idx on s1(id);會掃描表中所有的數據,然后以id為數據項,創建索引結構,存放于硬盤的表中。

建完以后,再查詢就會很快了。#3. 需要注意的是:innodb表的索引會存放于s1.ibd文件中,而myisam表的索引則會有單獨的索引文件table1.MYI

MySAM索引文件和數據文件是分離的,索引文件僅保存數據記錄的地址。而在innodb中,表數據文件本身就是按照B+Tree(BTree即Balance True)組織的一個索引結構,這棵樹的葉節點data域保存了完整的數據記錄。這個索引的key是數據表的主鍵,因此innodb表數據文件本身就是主索引。

因為inndob的數據文件要按照主鍵聚集,所以innodb要求表必須要有主鍵(Myisam可以沒有),如果沒有顯式定義,則mysql系統會自動選擇一個可以唯一標識數據記錄的列作為主鍵,如果不存在這種列,則mysql會自動為innodb表生成一個隱含字段作為主鍵,這字段的長度為6個字節,類型為長整型.

總結

七. 正確使用索引

并不是說我們創建了索引就一定會加快查詢速度,若想利用索引達到預想的提高查詢速度的效果,我們在添加索引時,必須遵循一些規則,避免不恰當索引,過多索引的問題

我們知道對于查詢的三種情況:緩存查詢,全盤掃描,索引掃描,其中緩存查詢為最快,要盡量避免全盤掃描。

我們可以通過explain(desc)命令獲取優化器選擇后的執行計劃

explain select * from city where countrycode='CHN'\G

#執行結果

id: 1select_type: SIMPLE

table: t1

partitions: NULL

type: range

possible_keys: PRIMARY

key: PRIMARY

key_len:4ref: NULL

rows:9filtered:100.00Extra: Using where

上述結果,有些關鍵的字段值得我們注意

關鍵字之type

我們可以看到此次的type為range,是索引范圍掃描

對于索引掃描來講,又可以細劃分,可以判斷是哪一種類的索引掃描

type的具體類型介紹:

數據準備

+-------------+----------+------+-----+---------+----------------+

| Field | Type | Null | Key | Default | Extra |

+-------------+----------+------+-----+---------+----------------+

| ID | int(11) | NO | PRI | NULL | auto_increment |

| Name | char(35) | NO | | | |

| CountryCode | char(3) | NO | MUL | | |

| District | char(20) | NO | | | |

| Population | int(11) | NO | | 0 | |

+-------------+----------+------+-----+---------+----------------+

#可以看出除了ID建了一個聚集索引,CountryCode建了一個普通索引外,其余字段都沒有索引

city表結構

select count(*) fromcity;+----------+

| count(*) |

+----------+

| 4079 |

+----------+

city表內數據量

1.? ALL:全盤掃描

desc select * from city where Name="ShangHai"\G;#Name字段沒有建立索引,查詢是全盤掃描

id:1select_type: SIMPLE

table: city

partitions: NULL

type: ALL

possible_keys: NULL

key: NULL

key_len: NULL

ref: NULL

rows:4188filtered:10.00Extra: Using where

View Code

2. Index:全索引掃描

desc select CountryCode fromcity\G;

id:1select_type: SIMPLE

table: city

partitions: NULL

type: index

possible_keys: NULL

key: CountryCode

key_len:3ref: NULL

rows:4188filtered:100.00Extra: Using index

View Code

3. range:索引范圍掃描

desc select * from city where CountryCode in ("CHN","USA");

where后面跟

where> < >= <=

#不能!=

in or between and

#不能是not in

like 'CH%'

#不能是前綴%,如like '%HN'

View Code

in 或者 or改寫成 union all

select* from city where countrycode='CHN'union all

select* from city where countrycode='USA';#type為ref

View Code

4.?ref:輔助索引的等值查詢

select * from city where countrycode='CHN'

View Code

5. eq_ref:多表鏈接查詢(join on )

6.?const ,system:主鍵或唯一鍵等值查詢

desc select * from city where ID=2252;

View Code

關鍵字之Extra

對于語句在Extra列會出現Using filesort,根據mysql官方文檔對他的描述:

MySQL must do an extra pass to find out how to retrieve the rows in sorted order. The sort is done by going through all rows according to the join type and storing the sort key and pointer to the row for all rows that match the WHERE clause.

Using filesort 是Mysql里一種速度比較慢的外部排序,盡量避免

usingfilesort: 文件排序

將order by、group by、distinct 后的列和where條件列建立聯合索引

關鍵字之possible_keys:代表可能會走的索引

關鍵字之key: 真正走的索引

八. 聯合索引和覆蓋索引

一 聯合索引

聯合索引時指對表上的多個列合起來做一個索引。聯合索引的創建方法與單個索引的創建方法一樣,不同之處在僅在于有多個索引列,如下

mysql>create table t(->a int,->b int,->primary key(a),->key idx_a_b(a,b)->);

Query OK, 0 rows affected (0.11 sec)

那么何時需要使用聯合索引呢?在討論這個問題之前,先來看一下聯合索引內部的結果。從本質上來說,聯合索引就是一棵B+樹,不同的是聯合索引的鍵值得數量不是1,而是>=2。接著來討論兩個整型列組成的聯合索引,假定兩個鍵值得名稱分別為a、b如圖

可以看到這與我們之前看到的單個鍵的B+樹并沒有什么不同,鍵值都是排序的,通過葉子結點可以邏輯上順序地讀出所有數據,就上面的例子來說,即(1,1),(1,2),(2,1),(2,4),(3,1),(3,2),數據按(a,b)的順序進行了存放。

因此,對于查詢select * from table where a=xxx and b=xxx, 顯然是可以使用(a,b) 這個聯合索引的,對于單個列a的查詢select * from table where a=xxx,也是可以使用(a,b)這個索引的。

但對于b列的查詢select * from table where b=xxx,則不可以使用(a,b) 索引,其實你不難發現原因,葉子節點上b的值為1、2、1、4、1、2顯然不是排序的,因此對于b列的查詢使用不到(a,b) 索引

聯合索引的第二個好處是在第一個鍵相同的情況下,已經對第二個鍵進行了排序處理,例如在很多情況下應用程序都需要查詢某個用戶的購物情況,并按照時間進行排序,最后取出最近三次的購買記錄,這時使用聯合索引可以幫我們避免多一次的排序操作,因為索引本身在葉子節點已經排序了,如下

#===========準備表==============

create table buy_log(

userid int unsignednotnull,

buy_date date

);

insert into buy_log values

(1,'2009-01-01'),

(2,'2009-01-01'),

(3,'2009-01-01'),

(1,'2009-02-01'),

(3,'2009-02-01'),

(1,'2009-03-01'),

(1,'2009-04-01');

alter table buy_log add key(userid);

alter table buy_log add key(userid,buy_date);#===========驗證==============

mysql>show create table buy_log;| buy_log |CREATE TABLE `buy_log` (

`userid` int(10) unsigned NOT NULL,

`buy_date` date DEFAULT NULL,

KEY `userid` (`userid`),

KEY `userid_2` (`userid`,`buy_date`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

#可以看到possible_keys在這里有兩個索引可以用,分別是單個索引userid與聯合索引userid_2,但是優化器最終選擇了使用的key是userid因為該索引的葉子節點包含單個鍵值,所以理論上一個頁能存放的記錄應該更多

mysql> explain select * from buy_log where userid=2;+----+-------------+---------+------+-----------------+--------+---------+-------+------+-------+

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

+----+-------------+---------+------+-----------------+--------+---------+-------+------+-------+

| 1 | SIMPLE | buy_log | ref | userid,userid_2 | userid | 4 | const | 1 | |

+----+-------------+---------+------+-----------------+--------+---------+-------+------+-------+

1 row in set (0.00sec)#接著假定要取出userid為1的最近3次的購買記錄,用的就是聯合索引userid_2了,因為在這個索引中,在userid=1的情況下,buy_date都已經排序好了

mysql> explain select * from buy_log where userid=1 order by buy_date desc limit 3;+----+-------------+---------+------+-----------------+----------+---------+-------+------+--------------------------+

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

+----+-------------+---------+------+-----------------+----------+---------+-------+------+--------------------------+

| 1 | SIMPLE | buy_log | ref | userid,userid_2 | userid_2 | 4 | const | 4 | Using where; Using index |

+----+-------------+---------+------+-----------------+----------+---------+-------+------+--------------------------+

1 row in set (0.00sec)#ps:如果extra的排序顯示是Using filesort,則意味著在查出數據后需要二次排序(如下查詢語句,沒有先用where userid=3先定位范圍,于是即便命中索引也沒用,需要二次排序)

mysql> explain select * from buy_log order by buy_date desc limit 3;+----+-------------+---------+-------+---------------+----------+---------+------+------+-----------------------------+

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

+----+-------------+---------+-------+---------------+----------+---------+------+------+-----------------------------+

| 1 | SIMPLE | buy_log | index | NULL | userid_2 | 8 | NULL | 7 | Using index; Using filesort |

+----+-------------+---------+-------+---------------+----------+---------+------+------+-----------------------------+

#對于聯合索引(a,b),下述語句可以直接使用該索引,無需二次排序

select ... from table where a=xxx order by b;#然后對于聯合索引(a,b,c)來首,下列語句同樣可以直接通過索引得到結果

select ... from table where a=xxx order by b;

select ...from table where a=xxx and b=xxx order by c;#但是對于聯合索引(a,b,c),下列語句不能通過索引直接得到結果,還需要自己執行一次filesort操作,因為索引(a,c)并未排序

select ... from table where a=xxx order by c;

View Code

二 覆蓋索引

InnoDB存儲引擎支持覆蓋索引(covering index,或稱索引覆蓋),即從輔助索引中就可以得到查詢記錄,而不需要查詢聚集索引中的記錄。

使用覆蓋索引的一個好處是:輔助索引不包含整行記錄的所有信息,故其大小要遠小于聚集索引,因此可以減少大量的IO操作

注意:覆蓋索引技術最早是在InnoDB Plugin中完成并實現,這意味著對于InnoDB版本小于1.0的,或者MySQL數據庫版本為5.0以下的,InnoDB存儲引擎不支持覆蓋索引特性

對于InnoDB存儲引擎的輔助索引而言,由于其包含了主鍵信息,因此其葉子節點存放的數據為(primary key1,priamey key2,...,key1,key2,...)。例如

select age from s1 where id=123 and name = 'bob; #id字段有索引,但是name字段沒有索引,該sql命中了索引,但未覆蓋,需要去聚集索引中再查找詳細信息。

最牛逼的情況是,索引字段覆蓋了所有,那全程通過索引來加速查詢以及獲取結果就ok了

mysql>desc s1;+--------+-------------+------+-----+---------+-------+

| Field | Type | Null | Key | Default | Extra |

+--------+-------------+------+-----+---------+-------+

| id | int(11) | NO | | NULL | |

| name | varchar(20) | YES | | NULL | |

| gender | char(6) | YES | | NULL | |

| email | varchar(50) | YES | | NULL | |

+--------+-------------+------+-----+---------+-------+

4 rows in set (0.21sec)

mysql> explain select name from s1 where id=1000; #沒有任何索引

+----+-------------+-------+------------+------+---------------+------+---------+------+---------+----------+-------------+

| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |

+----+-------------+-------+------------+------+---------------+------+---------+------+---------+----------+-------------+

| 1 | SIMPLE | s1 | NULL | ALL | NULL | NULL | NULL | NULL | 2688336 | 10.00 | Using where |

+----+-------------+-------+------------+------+---------------+------+---------+------+---------+----------+-------------+

1 row in set, 1 warning (0.00sec)

mysql> create index idx_id on s1(id); #創建索引

Query OK, 0 rows affected (4.16sec)

Records: 0 Duplicates: 0 Warnings: 0

mysql> explain select name from s1 where id=1000; #命中輔助索引,但是未覆蓋索引,還需要從聚集索引中查找name

+----+-------------+-------+------------+------+---------------+--------+---------+-------+------+----------+-------+

| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |

+----+-------------+-------+------------+------+---------------+--------+---------+-------+------+----------+-------+

| 1 | SIMPLE | s1 | NULL | ref | idx_id | idx_id | 4 | const | 1 | 100.00 | NULL |

+----+-------------+-------+------------+------+---------------+--------+---------+-------+------+----------+-------+

1 row in set, 1 warning (0.08sec)

mysql> explain select id from s1 where id=1000; #在輔助索引中就找到了全部信息,Using index代表覆蓋索引

+----+-------------+-------+------------+------+---------------+--------+---------+-------+------+----------+-------------+

| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |

+----+-------------+-------+------------+------+---------------+--------+---------+-------+------+----------+-------------+

| 1 | SIMPLE | s1 | NULL | ref | idx_id | idx_id | 4 | const | 1 | 100.00 | Using index |

+----+-------------+-------+------------+------+---------------+--------+---------+-------+------+----------+-------------+

1 row in set, 1 warning (0.03 sec)

View Code

覆蓋索引的另外一個好處是對某些統計問題而言的。基于上一小結創建的表buy_log,查詢計劃如下

mysql> explain select count(*) frombuy_log;+----+-------------+---------+-------+---------------+--------+---------+------+------+-------------+

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

+----+-------------+---------+-------+---------------+--------+---------+------+------+-------------+

| 1 | SIMPLE | buy_log | index | NULL | userid | 4 | NULL | 7 | Using index |

+----+-------------+---------+-------+---------------+--------+---------+------+------+-------------+

1 row in set (0.00 sec)

View Code

innodb存儲引擎并不會選擇通過查詢聚集索引來進行統計。由于buy_log表有輔助索引,而輔助索引遠小于聚集索引,選擇輔助索引可以減少IO操作,故優化器的選擇如上key為userid輔助索引

對于(a,b)形式的聯合索引,一般是不可以選擇b中所謂的查詢條件。但如果是統計操作,并且是覆蓋索引,則優化器還是會選擇使用該索引,如下

#聯合索引userid_2(userid,buy_date),一般情況,我們按照buy_date是無法使用該索引的,但特殊情況下:查詢語句是統計操作,且是覆蓋索引,則按照buy_date當做查詢條件時,也可以使用該聯合索引

mysql> explain select count(*) from buy_log where buy_date >= '2011-01-01' and buy_date < '2011-02-01';+----+-------------+---------+-------+---------------+----------+---------+------+------+--------------------------+

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

+----+-------------+---------+-------+---------------+----------+---------+------+------+--------------------------+

| 1 | SIMPLE | buy_log | index | NULL | userid_2 | 8 | NULL | 7 | Using where; Using index |

+----+-------------+---------+-------+---------------+----------+---------+------+------+--------------------------+

1 row in set (0.00 sec)

View Code

九. 索引使用的相關問題

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

我們編寫存儲過程為表s1批量添加記錄,name字段的值均為egon,也就是說name這個字段的區分度很低(gender字段也是一樣的,我們稍后再搭理它)

回憶b+樹的結構,查詢的速度與樹的高度成反比,要想將樹的高低控制的很低,需要保證:在某一層內數據項均是按照從左到右,從小到大的順序依次排開,即左1

而對于區分度低的字段,無法找到大小關系,因為值都是相等的,毫無疑問,還想要用b+樹存放這些等值的數據,只能增加樹的高度,字段的區分度越低,則樹的高度越高。極端的情況,索引字段的值都一樣,那么b+樹幾乎成了一根棍。本例中就是這種極端的情況,name字段所有的值均為'egon'

#現在我們得出一個結論:為區分度低的字段建立索引,索引樹的高度會很高,然而這具體會帶來什么影響呢???

#1:如果條件是name='xxxx',那么肯定是可以第一時間判斷出'xxxx'是不在索引樹中的(因為樹中所有的值均為'egon’),所以查詢速度很快

#2:如果條件正好是name='egon',查詢時,我們永遠無法從樹的某個位置得到一個明確的范圍,只能往下找,往下找,往下找。。。這與全表掃描的IO次數沒有多大區別,所以速度很慢

View Code

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

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

5?最左前綴匹配原則(詳見第八小節),非常重要的原則,對于組合索引mysql會一直向右匹配直到遇到范圍查詢(>、 3 and d = 4 如果建立(a,b,c,d)順序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引則都可以用到,a,b,d的順序可以任意調整。

6.其他情況

-使用函數

select* from tb1 where reverse(email) = 'egon';-類型不一致

如果列是字符串類型,傳入條件是必須用引號引起來,不然...

select* from tb1 where email = 999;#排序條件為索引,則select字段必須也是索引字段,否則無法命中

-order by

select namefroms1 order by email desc;

當根據索引排序時候,select查詢的字段如果不是索引,則速度仍然很慢

select emailfroms1 order by email desc;

特別的:如果對主鍵排序,則還是速度很快:

select* fromtb1 order by nid desc;-組合索引最左前綴

如果組合索引為:(name,email)

nameand email --命中索引

name--命中索引

email--未命中索引- count(1)或count(列)代替count(*)在mysql中沒有差別了- create index xxxx on tb(title(19)) #text類型,必須制定長度

View Code

總結

以上是生活随笔為你收集整理的cpci检索为什么那么慢_索引原理与慢查询优化的全部內容,希望文章能夠幫你解決所遇到的問題。

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

国产一级免费片 | 99视频久 | 欧美视屏一区二区 | 亚洲免费观看视频 | 最近中文字幕完整视频高清1 | 国产精品毛片网 | 欧美激情在线看 | 91超碰免费在线 | 国产精品午夜久久久久久99热 | av女优中文字幕在线观看 | 天天色宗合| 福利视频入口 | 99视频在线看 | 国产高清不卡 | 五月精品| 亚洲国产成人精品在线观看 | 99中文字幕在线观看 | 高清av不卡 | 精品伊人久久久 | 一级一级一片免费 | 久久天天躁夜夜躁狠狠躁2022 | 97日日碰人人模人人澡分享吧 | 日韩电影一区二区在线观看 | 福利视频第一页 | 在线免费观看黄网站 | 婷婷婷国产在线视频 | 国产精品av免费在线观看 | 午夜精品婷婷 | 久久国产乱 | 欧美日韩在线视频一区 | 在线色视频小说 | 国产91欧美 | 国产精品99久久久久的智能播放 | 日韩va欧美va亚洲va久久 | 一区二区丝袜 | 日韩欧美有码在线 | 成人av在线观 | 免费观看完整版无人区 | 日韩视频www| av黄色一级片 | 国产精品第52页 | 中文字幕在线观看第一页 | 日韩黄色免费在线观看 | 99精品视频免费观看视频 | 国产精品com | 99在线免费观看视频 | 中文字幕成人在线 | 在线观看国产一区 | 亚洲九九九在线观看 | 手机在线看a| 中文字幕免费不卡视频 | 亚洲欧美乱综合图片区小说区 | 色狠狠操 | 精品天堂av| 99久久er热在这里只有精品15 | 91久久电影| 国产一区高清在线 | 亚洲精品视频在 | 麻豆成人网 | 干av在线| 精品视频在线视频 | 狠狠干激情| 国产日产精品一区二区三区四区的观看方式 | 国产又粗又猛又黄又爽 | 精品国产99国产精品 | 国产尤物视频在线 | 一区三区视频在线观看 | 97超碰资源总站 | 成年人视频在线 | 亚洲黄色激情小说 | 国产手机在线 | 亚洲精品视频免费观看 | 国内精品久久久久久久久久久久 | 91麻豆精品国产91 | 日韩在线色| 国产精品一区二区视频 | 99热这里只有精品在线观看 | 久久成人亚洲欧美电影 | 高清不卡免费视频 | 国产黄色片免费 | 精品国产自在精品国产精野外直播 | 97电影院在线观看 | 国产欧美在线一区二区三区 | 欧美久久久久久久久中文字幕 | 久久久免费高清视频 | 香蕉在线播放 | 国产一区二区在线播放视频 | 国产一区在线免费 | 成人一级在线观看 | 欧美在线一二 | 天天干,夜夜爽 | 国产精品mv在线观看 | 在线观看成人av | 91中文字幕在线播放 | 91av电影 | 成人a毛片| 人人插人人插 | 亚洲国产精品一区二区尤物区 | 国产精品视频免费观看 | 国产午夜在线观看 | 精品久久久久久电影 | 免费日韩电影 | 特级黄录像视频 | 波多野结衣亚洲一区二区 | 精品国偷自产国产一区 | 五月天综合激情网 | 一区二区三区免费在线观看视频 | 午夜av电影 | 天天操天天操天天操 | 中文字幕中文字幕在线中文字幕三区 | 国产成人三级三级三级97 | 成年人视频免费在线播放 | 久久福利精品 | 亚洲视频中文 | 粉嫩aⅴ一区二区三区 | 亚洲在线精品 | 国产精品视屏 | 夜夜干天天操 | 久久伊人色综合 | 91夜夜夜 | 国产正在播放 | 久久久久亚洲国产 | 伊人欧美 | 香蕉在线播放 | 午夜视频黄 | 97国产超碰在线 | 日日摸日日添日日躁av | 特黄特色特刺激视频免费播放 | 国色天香第二季 | 中文字幕日韩在线播放 | 色www免费视频 | 国产精品久久久久久久久蜜臀 | 精品久久网站 | 丁香影院在线 | 好看的国产精品视频 | 国产精品成人一区二区三区 | 毛片播放网站 | 久草视频99| 欧美久久久影院 | 日韩欧美网址 | 精品在线视频播放 | 天天艹天天 | 欧美激情视频一区 | 国产丝袜| 久草在线国产 | 精品国产乱码久久久久久1区2匹 | 中国成人一区 | 亚州成人av在线 | 日本高清xxxx | 国产一级片观看 | 日韩午夜剧场 | 久草免费在线 | 国产一二三区在线观看 | av大全在线播放 | 五月婷婷深开心 | 天天草天天摸 | 香蕉视频在线看 | 狠狠五月天 | 国产精品第72页 | 99久久精品免费视频 | 国产一级二级三级在线观看 | 69视频网站 | 97免费 | 天天干,天天草 | av综合在线观看 | 最近中文字幕视频网 | 7777xxxx| 98久久| 在线激情小视频 | 九九爱免费视频在线观看 | 欧美激情精品久久久 | 免费成人短视频 | 一本一本久久a久久精品综合 | 在线高清 | 久久久久观看 | 亚洲精品福利在线观看 | 亚洲成人免费在线观看 | 六月丁香在线视频 | 天天草综合| 综合色婷婷 | 中文字幕在线免费观看视频 | 九月婷婷综合网 | 国产一级免费在线 | 中国美女一级看片 | 性色av香蕉一区二区 | 欧美精品三级在线观看 | 五月天中文字幕 | 日韩黄色免费看 | 亚洲国产最新 | 综合网中文字幕 | 亚洲资源视频 | 色视频在线观看 | 91精品视频一区二区三区 | 成人免费视频网 | 成人免费看片网址 | 精品国产一区二区三区久久久蜜月 | 国产精品va视频 | 在线小视频 | 在线观看精品黄av片免费 | 亚洲午夜小视频 | 99色人 | 在线观看欧美成人 | 色精品视频| 91久久影院| www国产在线 | 91香蕉国产 | 国产黄色免费在线观看 | 国产一级二级在线播放 | 日日日爽爽爽 | 日韩精品不卡在线 | 亚洲视频免费在线看 | 亚洲精品tv| www.黄色片网站 | 国产在线精品一区二区三区 | 天天操夜夜爱 | 国产精品亚洲人在线观看 | 国产精品一区电影 | 人人精久| 亚洲精品欧美专区 | 97在线视频观看 | 91成人精品一区在线播放 | 天天综合入口 | www.久久免费视频 | 视频一区二区在线 | 久久高清免费视频 | 99久高清在线观看视频99精品热在线观看视频 | 欧美国产日韩在线观看 | 亚洲一区二区精品 | 黄色网www| 亚洲天堂社区 | 91色蜜桃 | 久草在线免费看视频 | 国产精品久久综合 | 天天操天天爱天天干 | 在线观看亚洲电影 | 色婷婷久久久综合中文字幕 | 精品免费观看 | 日本爽妇网 | avwww在线| 精品一区中文字幕 | 国产精品资源 | 日韩电影在线观看一区 | 国产91av视频在线观看 | 国产精品乱码一区二三区 | 这里只有精品视频在线观看 | 欧美日韩国产一区 | 丁香久久激情 | 欧美国产日韩久久 | 久久国产精品免费看 | 91av手机在线观看 | 亚洲一区二区视频 | 91精品国产99久久久久久红楼 | 97成人在线| 美女视频黄免费的久久 | 欧美视频日韩视频 | 精品久久久久久国产 | 日日干视频 | 99久久精品国产观看 | 久艹视频在线免费观看 | 最近高清中文字幕在线国语5 | av在线电影网站 | 久久久久国产精品免费免费搜索 | 一区三区在线欧 | 五月婷婷毛片 | 成 人 黄 色 视频播放1 | 久久久国产一区二区三区 | 一区二区丝袜 | 少妇bbw揉bbb欧美 | 免费看的黄色的网站 | 久久久久久久久福利 | 欧美激情精品久久 | 欧美小视频在线观看 | 成片人卡1卡2卡3手机免费看 | 久久成人在线 | 久久只精品99品免费久23小说 | 欧美性大战 | 国产精品久久久久久久久毛片 | 免费日韩电影 | 97精品国产手机 | 国产一级在线观看 | www.久久视频| 91在线麻豆| 狠狠躁夜夜a产精品视频 | 国产精品国产三级国产不产一地 | 黄色国产在线观看 | 日韩大片免费观看 | 中文字幕免费成人 | 99在线观看视频 | 国产精品久久久免费 | 亚洲综合视频在线 | 亚洲免费观看在线视频 | 日本精品一区二区三区在线观看 | 四川妇女搡bbbb搡bbbb搡 | 在线网站黄 | 福利片视频区 | 麻豆国产电影 | 日韩电影在线观看一区二区 | 国产91全国探花系列在线播放 | 中文字幕高清视频 | 精壮的侍卫呻吟h | 国产精品手机在线观看 | 成人av片在线观看 | 欧美,日韩 | 福利av在线 | 黄色av成人在线 | 婷婷色在线资源 | 国产精品久久久久久麻豆一区 | 手机成人av在线 | 日韩网站中文字幕 | 精品亚洲国产视频 | 国产裸体视频网站 | 亚洲视频免费 | 久久狠狠一本精品综合网 | 久草网首页 | 激情婷婷丁香 | 免费成人在线观看视频 | 天天天天天天天天操 | 精壮的侍卫呻吟h | 亚洲欧美日韩国产精品一区午夜 | 欧美国产大片 | 久艹在线播放 | 久久久久久久久毛片精品 | 激情 一区二区 | 成人黄色在线 | 亚洲高清在线精品 | 精品国产乱码一区二区三区在线 | 精品国产成人在线 | 玖玖爱免费视频 | 中文在线a√在线 | 亚洲精品免费观看 | 亚洲一级电影在线观看 | 亚洲国产精品电影在线观看 | 人人dvd | 亚洲色图av | 黄色免费看片网站 | 成人免费在线网 | 成人av观看 | 热久久免费国产视频 | 午夜视频播放 | 91精选在线 | 国产小视频免费在线网址 | 日韩精品首页 | 国产精品三级视频 | 在线免费视频一区 | 日韩在线视频一区二区三区 | 麻豆传媒一区二区 | 综合天堂av久久久久久久 | 欧美一区在线观看视频 | 黄色小网站在线 | 日韩欧美综合 | 国产国语在线 | 久久久这里有精品 | 亚洲综合视频在线播放 | 国产黄色观看 | 97成人资源站 | 亚洲中字幕| 久久视频国产精品免费视频在线 | 国产麻豆精品一区二区 | 国产成人久久av977小说 | 91在线精品秘密一区二区 | 色婷婷a | 久久情爱 | 三级免费黄色 | 国产精品一区免费看8c0m | 成人精品在线 | 精品人人人人 | 毛片网站观看 | 四虎影视成人精品国库在线观看 | 国产黄网站在线观看 | 日本精品久久久久影院 | 久久久天堂 | 久久高清国产视频 | 视频在线观看99 | 国产成人精品午夜在线播放 | 亚洲精品福利在线观看 | 天天干,天天射,天天操,天天摸 | 高清av免费看| 91精品婷婷国产综合久久蝌蚪 | 中文有码在线 | 久久日韩精品 | 一本一道久久a久久综合蜜桃 | 成人免费电影 | 69国产成人综合久久精品欧美 | 美女激情影院 | 日韩精品中文字幕在线观看 | 人人干人人添 | 成人性生交视频 | 欧美日韩国产亚洲乱码字幕 | 久久伦理影院 | 午夜精品久久久久久久99 | 久久伊人91 | 在线观看日本高清mv视频 | 在线观看国产亚洲 | 欧美91视频 | 日韩免费大片 | 亚洲精品乱码久久久一二三 | 国内精品久久久久影院优 | 亚洲手机天堂 | 综合久久久久久久 | 国产美女视频一区 | 欧美性黑人 | 精品久久免费看 | 亚洲视屏在线播放 | 国产精品区一区 | 97超碰总站 | 精品国产乱码久久久久久浪潮 | 97超视频免费观看 | 国产美女视频免费观看的网站 | 免费在线观看黄 | 国产精品久久久久久麻豆一区 | 亚洲日本va午夜在线电影 | 色多视频在线观看 | 亚洲精品网页 | 精品久久一二三区 | av日韩精品 | 黄色www | 国产精品久久久久久久久久久免费 | 久久网站av | 亚洲天天在线日亚洲洲精 | 欧美在线视频日韩 | 国产精品免费久久久久影院仙踪林 | 国产福利精品视频 | 日本中文字幕在线视频 | 国产在线观看网站 | 日韩专区在线 | 国产高清视频在线播放 | 久久精品99久久久久久 | 免费看一及片 | 最近免费中文字幕大全高清10 | wwwwwww黄| 国产精品久久久久国产精品日日 | 婷婷丁香六月 | 欧美专区日韩专区 | 亚洲日本va午夜在线电影 | 狠狠干我 | 久久影院精品 | 久久久久欧美精品999 | av黄色国产 | 天天躁日日躁狠狠躁av麻豆 | av短片在线观看 | 国产亚洲人| 久久国产免费视频 | 久久久久成人精品免费播放动漫 | 久久黄网站| 91麻豆精品国产自产在线游戏 | 日韩午夜在线观看 | 国产成人精品在线观看 | 国产精品美女久久久久久 | 免费黄色激情视频 | 中文区中文字幕免费看 | av中文字幕亚洲 | 91精品国自产拍天天拍 | 国产第一福利 | 久久九九影视 | 日韩一级电影网站 | 婷婷网五月天 | 久久精品日本啪啪涩涩 | 狠狠狠色丁香婷婷综合久久88 | 国产视频日韩视频欧美视频 | 国产福利91精品张津瑜 | 欧美日韩在线免费观看视频 | 亚洲一区欧美激情 | 精品二区视频 | 久久丁香网 | 午夜少妇 | 在线观看黄色大片 | 香蕉视频免费看 | av成年人电影| 久久精品中文字幕一区二区三区 | 精品一区二区免费视频 | 91秒拍国产福利一区 | 久久久久福利视频 | 日韩av一区二区三区四区 | 黄色亚洲大片免费在线观看 | 久久久久国产免费免费 | 黄色中文字幕 | 日韩高清不卡在线 | 天天爽天天射 | 一区二区三区电影在线播 | 激情久久网| 女人18毛片a级毛片一区二区 | 日日操天天爽 | 久久永久视频 | 久久免费视频这里只有精品 | a√资源在线 | 中文字幕亚洲欧美日韩 | 欧美日韩中字 | 国产伦精品一区二区三区… | 欧美a在线看 | 手机在线黄色网址 | 久久成人国产 | 99热999| aaawww| 高潮久久久 | a级国产乱理伦片在线观看 亚洲3级 | 日韩影视在线观看 | 久久免费看a级毛毛片 | 久久99视频| 亚洲第一中文字幕 | 丁香六月在线观看 | 日韩在观看线 | 香蕉视频4aa | 国产色视频网站2 | 中日韩男男gay无套 日韩精品一区二区三区高清免费 | 99re热精品视频 | 欧美精品久久久久久久久老牛影院 | 丁香六月伊人 | 伊人色综合久久天天网 | 精品久久免费看 | 在线 精品 国产 | 91精品国产乱码久久桃 | www国产亚洲精品久久麻豆 | 少妇bbb搡bbbb搡bbbb′ | 丰满少妇在线观看 | 日韩电影中文字幕在线 | 色综合久久久久综合体 | 成年人在线视频观看 | 国产 欧美 在线 | 精品在线视频一区 | 男女靠逼app | 久久久久成人精品免费播放动漫 | 久久精品视频免费 | 欧美另类xxx| 一级片免费观看视频 | 在线激情av电影 | 日韩无在线 | 五月天伊人网 | 91亚洲国产成人久久精品网站 | 怡春院av| 中文字幕中文字幕中文字幕 | 亚洲精品在线观 | 国产涩图 | 在线观看 国产 | 久久精品xxx | 亚洲国产久 | 日韩乱理| 狠狠色婷婷丁香六月 | 美女网站在线观看 | av中文字幕网 | 国产久草在线观看 | 四虎www. | 91av在| 91探花国产综合在线精品 | 日韩av午夜 | 十八岁以下禁止观看的1000个网站 | 色欧美综合 | 97国产大学生情侣酒店的特点 | 天天操天天舔天天干 | 精品国产自在精品国产精野外直播 | 中文字幕乱视频 | 国产精品视频全国免费观看 | 右手影院亚洲欧美 | 91精品国产91 | 久久婷亚洲五月一区天天躁 | 免费在线成人av | 国产伦精品一区二区三区… | 少妇bbw搡bbbb搡bbbb | 一区 二区电影免费在线观看 | 伊人激情网 | 免费视频国产 | 国产探花 | 国产精品午夜免费福利视频 | 最新国产在线 | 午夜少妇一区二区三区 | 国产一区观看 | 久久人视频 | 欧美日本不卡高清 | 日韩在线二区 | 久久国产欧美日韩 | 国产不卡在线播放 | 99资源网 | 九九视频免费观看视频精品 | 亚洲日本欧美在线 | 人人舔人人射 | 欧美在线日韩在线 | 黄色www免费 | 最新av在线免费观看 | 日本精品视频一区二区 | www.久久com| 亚洲成av人电影 | 亚洲黄色免费在线 | 18久久久 | 久久精品一区二区三区四区 | 亚洲日本成人网 | 久久国内免费视频 | 国产色视频一区二区三区qq号 | 欧美 另类 交 | 国产免费观看视频 | 中日韩在线视频 | 波多野结衣精品视频 | 亚洲国产精品电影在线观看 | 久久er99热精品一区二区 | 成人永久在线 | 午夜在线免费视频 | 在线你懂的视频 | 亚洲国产欧美一区二区三区丁香婷 | 欧美一级视频一区 | 国产精品久久久久久久免费大片 | 一本一本久久aa综合精品 | 欧洲在线免费视频 | 99久久精品免费看国产免费软件 | 美女网站在线观看 | 亚洲一区二区观看 | 日本少妇久久久 | 久草在线看片 | 中文字幕在线资源 | 五月婷婷久久丁香 | 国产精品成人一区二区三区吃奶 | 一级黄色免费网站 | 日韩在线视频免费观看 | 亚洲欧美日韩国产 | 99电影456麻豆 | 97电影网站 | av电影在线观看完整版一区二区 | 最近最新最好看中文视频 | 国产久草在线 | 99免费观看视频 | 黄色软件视频大全免费下载 | 98涩涩国产露脸精品国产网 | 国产精品久久久久久久免费 | 国产视频亚洲视频 | 欧美精品日韩 | 精品亚洲网| 精品久久久亚洲 | 欧美片网站yy | 黄色av免费电影 | 免费h精品视频在线播放 | 日韩午夜精品福利 | 激情五月看片 | av在线免费不卡 | 久久精品理论 | www.com操| 伊在线视频 | 午夜精品福利一区二区三区蜜桃 | 日本激情视频中文字幕 | 欧美高清成人 | 免费久久网| 人人爽人人爽人人片 | 欧美日韩一区二区三区在线观看视频 | 97网在线观看 | 国产精品麻 | 999成人免费视频 | 中文字幕资源网 | 日韩1页 | 欧美日韩性生活 | 超碰免费成人 | a黄在线观看 | 最新日韩视频 | 久久人人艹| 午夜精选视频 | 麻豆视频在线免费 | 正在播放国产一区 | 狠狠的操狠狠的干 | 六月激情网 | 亚洲精品女人久久久 | 国产又粗又猛又爽又黄的视频先 | 久久婷婷综合激情 | 国产日韩精品一区二区三区在线 | 色九九影院 | 免费成人黄色 | 二区视频在线 | 岛国一区在线 | 免费观看xxxx9999片 | 日本性生活免费看 | 国产不卡在线播放 | 91完整版| 婷婷在线免费视频 | 九九热只有精品 | 精品久久久久久一区二区里番 | 久久精品成人欧美大片古装 | 奇米网网址 | 99视频免费| 久久视频在线看 | 91超级碰碰 | 深夜视频久久 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 久久er99热精品一区二区三区 | 亚洲情感电影大片 | 久久精品久久久久久久 | 日韩av免费观看网站 | 免费日韩高清 | 九九九在线观看视频 | 国产精品少妇 | www.天天操.com | 久久天天拍| 久久综合狠狠综合 | 亚洲精品视频在线看 | 热久精品 | 99精品视频在线观看视频 | 色噜噜噜噜 | 久久国产午夜精品理论片最新版本 | 国产91精品高清一区二区三区 | 狠狠色狠狠色综合系列 | 狠狠狠综合 | 一区二区三区四区五区在线 | 黄色三级在线观看 | 国产精品嫩草69影院 | 免费亚洲精品 | 亚洲国产成人在线观看 | 在线久草视频 | 激情视频一区二区 | www免费网站在线观看 | 久久字幕精品一区 | 美女黄久久 | 国产精品久久久久久久久婷婷 | 亚洲精品午夜久久久久久久久久久 | 天天干人人 | 国产精品久久三 | 国产一区二区中文字幕 | 99久久久国产精品免费99 | 十八岁以下禁止观看的1000个网站 | 最近字幕在线观看第一季 | 日本精品xxxx | 又大又硬又黄又爽视频在线观看 | 国产男女爽爽爽免费视频 | 久久国产网站 | 久久96国产精品久久99软件 | 在线看av的网址 | 中文在线8新资源库 | 99视频播放 | 日韩天天操 | 99 视频 高清| 亚洲欧美日韩精品一区二区 | 中文字幕在线免费播放 | 久久9视频 | 日日干夜夜草 | 欧美一级看片 | 国产视频99| 久久免费毛片 | 日日夜夜精品免费视频 | 日韩精品在线一区 | 在线天堂中文在线资源网 | 一区二区三区免费在线播放 | 亚洲三级毛片 | 日韩精品一卡 | 青青河边草免费观看完整版高清 | 久久久www免费电影网 | 夜夜澡人模人人添人人看 | av一级二级 | 超碰在线99 | 精品日韩在线一区 | 在线免费观看黄色 | 中文字幕乱码日本亚洲一区二区 | 福利片视频区 | 99热最新精品 | 国产福利av在线 | 国产xxxxx在线观看 | 中日韩在线视频 | 国产剧情一区二区在线观看 | 亚洲综合小说 | 国产精品网站一区二区三区 | 国产精品久久久久三级 | av五月婷婷 | 91免费视频国产 | 婷婷av电影 | 黄色软件在线观看视频 | 免费av影视 | 天干啦夜天干天干在线线 | 精品一区精品二区高清 | 婷婷丁香花五月天 | 日韩精品一区二区三区免费观看视频 | 精品视频免费久久久看 | 操操操av | 91视频链接 | 久久视频精品在线观看 | 97超碰在线免费 | 国产不卡精品视频 | 蜜桃av综合网 | 国产亚洲精品无 | 一区二区三区四区久久 | 96国产在线 | 亚洲成a人片在线观看中文 中文字幕在线视频第一页 狠狠色丁香婷婷综合 | 精品亚洲欧美无人区乱码 | 国产资源在线播放 | 午夜av一区二区三区 | 国产麻豆剧传媒免费观看 | 成年人国产精品 | 国色天香永久免费 | 亚洲精区二区三区四区麻豆 | 亚洲理论在线 | 日韩av中文 | 欧美日韩一区二区三区不卡 | 日韩免费电影在线观看 | 日本爱爱片 | 日韩欧美一区二区在线播放 | 久久天天综合网 | 人人揉人人揉人人揉人人揉97 | 美女视频黄免费的 | 国产手机在线观看 | 91网页版在线观看 | www.com久久久 | 波多野结衣一区二区三区中文字幕 | 91一区啪爱嗯打偷拍欧美 | 日韩欧美在线免费 | 欧美国产日韩一区二区三区 | 伊人五月综合 | 国产中年夫妇高潮精品视频 | 91在线视频免费91 | 亚洲日本成人网 | 国产一级视频免费看 | 亚洲特级毛片 | 日本精品一区二区三区在线播放视频 | 婷婷色视频 | 欧美亚洲国产精品久久高清浪潮 | 久久久久国产精品一区二区 | 成人亚洲综合 | 中文字幕在线日 | 久草免费在线观看视频 | 欧美极品xxx| 中文字幕一区二区三区在线观看 | 欧美aa一级片 | 免费成人av在线看 | 天天爽综合网 | 国产97av | 五月婷在线 | 国产精品video| 中文字幕超清在线免费 | 一级片免费观看 | 亚洲精品福利在线 | 亚州欧美精品 | 欧美精品久久久久久久久久白贞 | 亚洲精品视频免费观看 | 亚洲一区二区三区91 | 亚洲国产人午在线一二区 | 欧美中文字幕久久 | 黄色网在线免费观看 | 欧美精品在线视频观看 | 五月婷婷开心中文字幕 | 91激情视频在线观看 | 国产伦理一区二区三区 | 亚洲精品乱码久久久久久蜜桃不爽 | 亚洲美女在线国产 | 国产vs久久 | 久久婷婷综合激情 | 一区二区三区四区五区六区 | 91精品久久久久久综合五月天 | 亚洲 av网站| 97在线视频免费 | 亚洲精品88欧美一区二区 | 欧美一级专区免费大片 | www.com久久久 | 中文字幕亚洲欧美日韩2019 | 亚洲欧美视屏 | 亚洲国产精品999 | a天堂中文在线 | 国产精品白虎 | 91福利影院在线观看 | 国产成人专区 | 国产精品久久久免费看 | 久久 在线 | 国产视频在线观看一区二区 | 丁香五月网久久综合 | 五月在线 | 中文字幕在线免费观看视频 | 免费黄色网址网站 | 一级全黄毛片 | 午夜视频不卡 | 婷婷丁香社区 | 97人人人人 | 天无日天天操天天干 | 久久久久成人精品 | 91av精品 | 久久综合色影院 | 99精品色 | 国产高清区 | 美女网站视频免费黄 | 国产精品一区二区av日韩在线 | 色多视频在线观看 | www久草 | 久久一区二区三区日韩 | 999抗病毒口服液 | 欧美美女激情18p | 精品国产福利在线 | 日韩高清成人在线 | 最近中文字幕国语免费高清6 | 人人讲| 在线免费观看视频a | 亚洲精品一区二区三区四区高清 | 人人爽人人搞 | 免费电影一区二区三区 | 天天干天天在线 | 最近日本韩国中文字幕 | 人人看97 | 亚洲日韩欧美视频 | 日韩欧美视频免费看 | 96亚洲精品久久 | 欧美夫妻生活视频 | 欧美激情视频一区 | 久久色视频| av资源在线观看 | 国产精品一区二区av日韩在线 | 久久久美女 | 久久久久免费网站 | 久久av网址 | 免费看精品久久片 | 天天干天天操天天做 | 99在线视频免费观看 | 精品九九九 | 人人狠狠综合久久亚洲婷 | 亚洲国产剧情av | 精品亚洲视频在线观看 | 欧美精品第一 | 亚洲精品高清在线 | 日韩亚洲国产中文字幕 | 狠狠色丁香九九婷婷综合五月 | 激情婷婷色 | 免费福利在线播放 | av在线在线 | 9999精品视频 | 精品久久久久久久久久久久久久久久久久 | 黄色日本片 | 在线观看国产福利片 | 久草干| 最新国产在线观看 | 久久亚洲影院 | 6080yy精品一区二区三区 | 久久激情日本aⅴ | 亚洲激情在线观看 | 91亚洲精品久久久蜜桃借种 | 久久免费试看 | 色美女在线 | 在线直播av| 久久噜噜少妇网站 | 国产高清中文字幕 | 国产精品九九视频 | 亚洲乱码久久久 | 在线电影播放 | 久草爱视频 | 亚洲色图av | 黄色av一级片 | 久久国产福利 | 精品国产观看 | 日日夜夜草 | 在线a人片免费观看视频 | 视频国产在线观看18 | 亚洲专区路线二 | 在线观看小视频 | 欧美久久久一区二区三区 | 欧美特一级 | 最近中文字幕国语免费高清6 | 国产91勾搭技师精品 | 国产黄免费 | 日韩在线免费不卡 | 天天爽夜夜操 | 免费日韩| 在线有码中文 | 亚洲国产精品成人精品 | 国产成人精品久久久久蜜臀 | 欧美一区二区三区在线看 | av在线a | 久久久国产精品亚洲一区 | 日本久草电影 | 久久精品视频2 | 天天av资源 | 久久国内视频 | 日韩欧美在线第一页 | 免费在线观看一区 | 日韩在线观看一区二区三区 | 亚洲在线免费视频 | 国产午夜精品av一区二区 | 不卡日韩av| 日日干夜夜爱 | 欧美性大胆 | 欧美极品xxxx | 丰满少妇久久久 | 视色网站 | 亚洲精品国久久99热 | 国产在线日本 | 97国产精品一区二区 | 欧美一级片在线免费观看 | 天天干天天操天天爱 | 午夜丁香网 | 99精品视频免费在线观看 | www.久久成人| av中文国产 | 国产午夜亚洲精品 | 在线观看欧美成人 | av日韩精品| 91在线观看视频 | 日韩高清精品一区二区 | 久久精品99国产 | 精品国产免费一区二区三区五区 | 91入口在线观看 | 成人免费影院 | 日韩在线观看a | 日本黄色免费在线观看 | 国产精品成人一区二区 | 五月婷婷视频在线 | 日韩午夜电影院 | 在线电影 你懂得 | 午夜精品久久 | 免费在线观看中文字幕 | 综合天堂av久久久久久久 | 超碰在线观看av.com | 久久国产免费看 | 69国产在线观看 | 天天操天天怕 | 日本mv大片欧洲mv大片 |