精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

我用對了這些場景下的索引,技術(shù)總監(jiān)夸我棒

數(shù)據(jù)庫 MySQL
看了本文相信你會對索引的原理有更清晰的認識。本文將會從以下幾個方面來講述索引的相關(guān)知識。

前言

生產(chǎn)上為了高效地查詢數(shù)據(jù)庫中的數(shù)據(jù),我們常常會給表中的字段添加索引,大家是否有考慮過如何添加索引才能使索引更高效,考慮如下問題

  • 添加的索引是越多越好嗎
  • 為啥有時候明明添加了索引卻不生效
  • 索引有哪些類型
  • 如何評判一個索引設(shè)計的好壞

看了本文相信你會對索引的原理有更清晰的認識。本文將會從以下幾個方面來講述索引的相關(guān)知識,相信大家耐心看了之后肯定有收獲,碼字不易,別忘了「在看」,「轉(zhuǎn)發(fā)」哦。

  • 什么是索引,索引的作用
  • 索引的種類
  • 高性能索引策略
  • 索引設(shè)計準則:三星索引

[[329308]]

什么是索引,索引的作用

當我們要在新華字典里查某個字(如「先」)具體含義的時候,通常都會拿起一本新華字典來查,你可以先從頭到尾查詢每一頁是否有「先」這個字,這樣做(對應(yīng)數(shù)據(jù)庫中的全表掃描)確實能找到,但效率無疑是非常低下的,更高效的方相信大家也都知道,就是在首頁的索引里先查找「先」對應(yīng)的頁數(shù),然后直接跳到相應(yīng)的頁面查找,這樣查詢時候大大減少了,可以為是 O(1)。

 

數(shù)據(jù)庫中的索引也是類似的,通過索引定位到要讀取的頁,大大減少了需要掃描的行數(shù),能極大的提升效率,簡而言之,索引主要有以下幾個作用

  1. 即上述所說,索引能極大地減少掃描行數(shù)
  2. 索引可以幫助服務(wù)器避免排序和臨時表
  3. 索引可以將隨機 IO 變成順序 IO

第一點上文已經(jīng)解釋了,我們來看下第二點和第三點

先來看第二點,假設(shè)我們不用索引,試想運行如下語句

  1. SELECT * FROM user order by age desc

則 MySQL 的流程是這樣的,掃描所有行,把所有行加載到內(nèi)存后,再按 age 排序生成一張臨時表,再把這表排序后將相應(yīng)行返回給客戶端,更糟的,如果這張臨時表的大小大于 tmp_table_size 的值(默認為 16 M),內(nèi)存臨時表會轉(zhuǎn)為磁盤臨時表,性能會更差,如果加了索引,索引本身是有序的 ,所以從磁盤讀的行數(shù)本身就是按 age 排序好的,也就不會生成臨時表,就不用再額外排序 ,無疑提升了性能。

再來看隨機 IO 和順序 IO。先來解釋下這兩個概念。

相信不少人應(yīng)該吃過旋轉(zhuǎn)火鍋,服務(wù)員把一盤盤的菜放在旋轉(zhuǎn)傳輸帶上,然后等到這些菜轉(zhuǎn)到我們面前,我們就可以拿到菜了,假設(shè)裝一圈需要 4 分鐘,則最短等待時間是 0(即菜就在你跟前),最長等待時間是 4 分鐘(菜剛好在你跟前錯過),那么平均等待時間即為 2 分鐘,假設(shè)我們現(xiàn)在要拿四盤菜,這四盤菜隨機分配在傳輸帶上,則可知拿到這四盤菜的平均等待時間是 8 分鐘(隨機 IO),如果這四盤菜剛好緊鄰著排在一起,則等待時間只需 2 分鐘(順序 IO)。

[[329309]]

 

上述中傳輸帶就類比磁道,磁道上的菜就類比扇區(qū)(sector)中的信息,磁盤塊(block)是由多個相鄰的扇區(qū)組成的,是操作系統(tǒng)讀取的最小單元,這樣如果信息能以 block 的形式聚集在一起,就能極大減少磁盤 IO 時間,這就是順序 IO 帶來的性能提升,下文中我們將會看到 B+ 樹索引就起到這樣的作用。

 

如圖示:多個扇區(qū)組成了一個 block,如果要讀的信息都在這個 block 中,則只需一次 IO 讀

而如果信息在一個磁道中分散地分布在各個扇區(qū)中,或者分布在不同磁道的扇區(qū)上(尋道時間是隨機IO主要瓶頸所在),將會造成隨機 IO,影響性能。

我們來看一下一個隨機 IO 的時間分布:

 

  • seek Time: 尋道時間,磁頭移動到扇區(qū)所在的磁道
  • Rotational Latency:完成步驟 1 后,磁頭移動到同一磁道扇區(qū)對應(yīng)的位置所需求時間
  • Transfer Time 從磁盤讀取信息傳入內(nèi)存時間

這其中尋道時間占據(jù)了絕大多數(shù)的時間(大概占據(jù)隨機 IO 時間的占 40%)。

隨機 IO 和順序 IO 大概相差百倍 (隨機 IO:10 ms/ page, 順序 IO 0.1ms / page),可見順序 IO 性能之高,索引帶來的性能提升顯而易見!

索引的種類

索引主要分為以下幾類

  • B+樹索引
  • 哈希索引

B+樹索引

B+ 樹索引之前在此文中詳細闡述過,強烈建議大家看一遍,對理解 B+ 樹有很大的幫助,簡單回顧一下吧

 

B+ 樹是以 N 叉樹的形式存在的,這樣有效降低了樹的高度,查找數(shù)據(jù)也不需要全表掃描了,順著根節(jié)點層層往下查找能很快地找到我們的目標數(shù)據(jù),每個節(jié)點的大小即一個磁盤塊(頁)的大小,一次 IO 會將一個磁盤塊的數(shù)據(jù)都讀入(即磁盤預(yù)讀,程序局部性原理:讀到了某個值,很大可能這個值周圍的數(shù)據(jù)也會被用到,干脆一起讀入內(nèi)存),葉子節(jié)點通過指針的相互指向連接,能有效減少順序遍歷時的隨機 IO,而且我們也可以看到,葉子節(jié)點都是按索引的順序排序好的,這也意味著根據(jù)索引查找或排序都是排序好了的,不會再在內(nèi)存中形成臨時表。

哈希索引

哈希索引基本散列表實現(xiàn),散列表(也稱哈希表)是根據(jù)關(guān)鍵碼值(Key value)而直接進行訪問的數(shù)據(jù)結(jié)構(gòu),它讓碼值經(jīng)過哈希函數(shù)的轉(zhuǎn)換映射到散列表對應(yīng)的位置上,查找效率非常高。假設(shè)我們對名字建立了哈希索引,則查找過程如下圖所示:

 

對于每一行數(shù)據(jù),存儲引擎都會對所有的索引列(上圖中的 name 列)計算一個哈希碼(上圖散列表的位置),散列表里的每個元素指向數(shù)據(jù)行的指針,由于索引自身只存儲對應(yīng)的哈希值,所以索引的結(jié)構(gòu)十分緊湊,這讓哈希索引查找速度非常快!

當然了哈希表的劣勢也是比較明顯的,不支持區(qū)間查找,不支持排序,所以更多的時候哈希表是與 B Tree等一起使用的,在 InnoDB引擎中就有一種名為「自適應(yīng)哈希索引」的特殊索引,當 innoDB 注意到某些索引值使用非常頻繁時,就會內(nèi)存中基于 B-Tree 索引之上再創(chuàng)建哈希索引,這樣也就讓 B+ 樹索引也有了哈希索引的快速查找等優(yōu)點,這是完全自動,內(nèi)部的行為,用戶無法控制或配置,不過如果有必要,可以關(guān)閉該功能。

innoDB 引擎本身是不支持顯式創(chuàng)建哈希索引的,我們可以在 B+ 樹的基礎(chǔ)上創(chuàng)建一個偽哈希索引,它與真正的哈希索引不是一回事,它是以哈希值而非鍵本身來進行索引查找的,這種偽哈希索引的使用場景是怎樣的呢,假設(shè)我們在 db 某張表中有個 url 字段,我們知道每個 url 的長度都很長,如果以 url 這個字段創(chuàng)建索引,無疑要占用很大的存儲空間,如果能通過哈希(比如CRC32)把此 url 映射成 4 個字節(jié),再以此哈希值作索引 ,索引占用無疑大大縮短!不過在查詢的時候要記得同時帶上 url 和 url_crc,主要是為了避免哈希沖突,導(dǎo)致 url_crc 的值可能一樣

  1. SELECT id FROM url WHERE url = "http://www.baidu.com"  AND url_crc = CRC32("http://www.baidu.com"

這樣做把基于 url 的字符串索引改成了基于 url_crc 的整型索引,效率更高,同時索引占用的空間也大大減少,一舉兩得,當然人可能會說需要手動維護索引太麻煩了,那可以改進觸發(fā)器實現(xiàn)。

除了上文說的兩個索引 ,還有空間索引(R-Tree),全文索引等,由生產(chǎn)中不是很常用,這里不作過多闡述

高性能索引策略

不同的索引設(shè)計選擇能對性能產(chǎn)生很大的影響,有人可能會發(fā)現(xiàn)生產(chǎn)中明明加了索引卻不生效,有時候加了雖然生效但對搜索性能并沒有提升多少,對于多列聯(lián)合索引,哪列在前,哪列在后也是有講究的,我們一起來看看

加了索引,為何卻不生效

加了索引卻不生效可能會有以下幾種原因

1、索引列是表示式的一部分,或是函數(shù)的一部分

如下 SQL:

  1. SELECT book_id FROM BOOK WHERE book_id + 1 = 5; 

或者

  1. SELECT book_id FROM BOOK WHERE TO_DAYS(CURRENT_DATE) - TO_DAYS(gmt_create) <= 10 

上述兩個 SQL 雖然在列 book_id 和 gmt_create 設(shè)置了索引 ,但由于它們是表達式或函數(shù)的一部分,導(dǎo)致索引無法生效,最終導(dǎo)致全表掃描。

2、隱式類型轉(zhuǎn)換

以上兩種情況相信不少人都知道索引不能生效,但下面這種隱式類型轉(zhuǎn)換估計會讓不少人栽跟頭,來看下下面這個例子:

假設(shè)有以下表:

  1. CREATE TABLE `tradelog` ( 
  2.   `id` int(11) NOT NULL
  3.   `tradeid` varchar(32) DEFAULT NULL
  4.   `operator` int(11) DEFAULT NULL
  5.   `t_modified` datetime DEFAULT NULL
  6.    PRIMARY KEY (`id`), 
  7.    KEY `tradeid` (`tradeid`), 
  8.    KEY `t_modified` (`t_modified`) 
  9. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; 

執(zhí)行 SQL 語句

  1. SELECT * FROM tradelog WHERE tradeid=110717; 

交易編號 tradeid 上有索引,但用 EXPLAIN 執(zhí)行卻發(fā)現(xiàn)使用了全表掃描,為啥呢,tradeId 的類型是 varchar(32), 而此 SQL 用 tradeid 一個數(shù)字類型進行比較,發(fā)生了隱形轉(zhuǎn)換,會隱式地將字符串轉(zhuǎn)成整型,如下:

  1. mysql> SELECT * FROM tradelog WHERE CAST(tradid AS signed int) = 110717; 

這樣也就觸發(fā)了上文中第一條的規(guī)則 ,即:索引列不能是函數(shù)的一部分。

3、隱式編碼轉(zhuǎn)換

這種情況非常隱蔽,來看下這個例子

  1. CREATE TABLE `trade_detail` (  
  2.  `id` int(11) NOT NULL,  
  3.  `tradeid` varchar(32) DEFAULT NULL,  
  4.  `trade_step` int(11) DEFAULT NULL, /*操作步驟*/  
  5.  `step_info` varchar(32) DEFAULT NULL, /*步驟信息*/  
  6.    PRIMARY KEY (`id`), KEY `tradeid` (`tradeid`) 
  7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

trade_defail 是交易詳情, tradelog 是操作此交易詳情的記錄,現(xiàn)在要查詢 id=2 的交易的所有操作步驟信息,則我們會采用如下方式

  1. SELECT d.* FROM tradelog l, trade_detail d WHERE d.tradeid=l.tradeid AND l.id=2; 

由于 tradelog 與 trade_detail 這兩個表的字符集不同,且 tradelog 的字符集是 utf8mb4,而 trade_detail 字符集是 utf8, utf8mb4 是 utf8 的超集,所以會自動將 utf8 轉(zhuǎn)成 utf8mb4。即上述語句會發(fā)生如下轉(zhuǎn)換:

  1. SELECT d.* FROM tradelog l, trade_detail d WHERE (CONVERT(d.traideid USING utf8mb4)))=l.tradeid AND l.id=2; 

自然也就觸發(fā)了 「索引列不能是函數(shù)的一部分」這條規(guī)則。怎么解決呢,第一種方案當然是把兩個表的字符集改成一樣,如果業(yè)務(wù)量比較大,生產(chǎn)上不方便改的話,還有一種方案是把 utf8mb4 轉(zhuǎn)成 utf8,如下

  1. mysql> SELECT d.* FROM tradelog l , trade_detail d WHERE d.tradeid=CONVERT(l.tradeid USING utf8) AND l.id=2;  

這樣索引列就生效了。

4、使用 order by 造成的全表掃描

  1. SELECT * FROM user ORDER BY age DESC 

上述語句在 age 上加了索引,但依然造成了全表掃描,這是因為我們使用了 SELECT *,導(dǎo)致回表查詢,MySQL 認為回表的代價比全表掃描更大,所以不選擇使用索引,如果想使用到 age 的索引,我們可以用覆蓋索引來代替:

  1. SELECT age FROM user ORDER BY age DESC 

或者加上 limit 的條件(數(shù)據(jù)比較小)

  1. SELECT * FROM user ORDER BY age DESC limit 10 

這樣就能利用到索引。

無法避免對索引列使用函數(shù),怎么使用索引

有時候我們無法避免對索引列使用函數(shù),但這樣做會導(dǎo)致全表索引,是否有更好的方式呢。

比如我現(xiàn)在就是想記錄 2016 ~ 2018 所有年份 7月份的交易記錄總數(shù)

  1. mysql> SELECT count(*) FROM tradelog WHERE month(t_modified)=7; 

由于索引列是函數(shù)的參數(shù),所以顯然無法用到索引,我們可以將它改造成基本字段區(qū)間的查找如下

  1. SELECT count(*) FROM tradelog WHERE 
  2.     -> (t_modified >= '2016-7-1' AND t_modified<'2016-8-1'or 
  3.     -> (t_modified >= '2017-7-1' AND t_modified<'2017-8-1'or  
  4.     -> (t_modified >= '2018-7-1' AND t_modified<'2018-8-1'); 

前綴索引與索引選擇性

之前我們說過,如于長字符串的字段(如 url),我們可以用偽哈希索引的形式來創(chuàng)建索引,以避免索引變得既大又慢,除此之外其實還可以用前綴索引(字符串的部分字符)的形式來達到我們的目的,那么這個前綴索引應(yīng)該如何選取呢,這叫涉及到一個叫索引選擇性的概念

索引選擇性:不重復(fù)的索引值(也稱為基數(shù),cardinality)和數(shù)據(jù)表的記錄總數(shù)的比值,比值越高,代表索引的選擇性越好,唯一索引的選擇性是最好的,比值是 1。

畫外音:我們可以通過 SHOW INDEXES FROM table 來查看每個索引 cardinality 的值以評估索引設(shè)計的合理性

怎么選擇這個比例呢,我們可以分別取前 3,4,5,6,7 的前綴索引,然后再比較下選擇這幾個前綴索引的選擇性,執(zhí)行以下語句

  1. SELECT  
  2.  COUNT(DISTINCT LEFT(city,3))/COUNT(*) as sel3, 
  3.  COUNT(DISTINCT LEFT(city,4))/COUNT(*) as sel4, 
  4.  COUNT(DISTINCT LEFT(city,5))/COUNT(*) as sel5, 
  5.  COUNT(DISTINCT LEFT(city,6))/COUNT(*) as sel6, 
  6.  COUNT(DISTINCT LEFT(city,7))/COUNT(*) as sel7 
  7. FROM city_demo 

得結(jié)果如下

sel3 sel4 sel5 sel6 sel7
0.0239 0.0293 0.0305 0.0309 0.0310

可以看到當前綴長度為 7 時,索引選擇性提升的比例已經(jīng)很小了,也就是說應(yīng)該選擇 city 的前六個字符作為前綴索引,如下

  1. ALTER TABLE city_demo ADD KEY(city(6)) 

我們當前是以平均選擇性為指標的,有時候這樣是不夠的,還得考慮最壞情況下的選擇性,以這個 demo 為例,可能一些人看到選擇 4,5 的前綴索引與選擇 6,7 的選擇性相差不大,那就得看下選擇 4,5 的前綴索引分布是否均勻了

  1. SELECT  
  2.     COUNT(*) AS  cnt,  
  3.     LEFT(city, 4) AS pref 
  4.   FROM city_demo GROUP BY pref ORDER BY cnt DESC LIMIT 5 

可能會出現(xiàn)以下結(jié)果

cnt pref
305 Sant
200 Toul
90 Chic
20 Chan

可以看到分布極不均勻,以 Sant,Toul 為前綴索引的數(shù)量極多,這兩者的選擇性都不是很理想,所以要選擇前綴索引時也要考慮最差的選擇性的情況。

前綴索引雖然能實現(xiàn)索引占用空間小且快的效果,但它也有明顯的弱點,MySQL 無法使用前綴索引做 ORDER BY 和 GROUP BY ,而且也無法使用前綴索引做覆蓋掃描,前綴索引也有可能增加掃描行數(shù)。

假設(shè)有以下表數(shù)據(jù)及要執(zhí)行的 SQL

id email
1 zhangssxyz@163.com
2 zhangs1@163.com
3 zhangs1@163.com
4 zhangs1@163.com
  1. SELECT id,email FROM user WHERE email='zhangssxyz@xxx.com'

如果我們針對 email 設(shè)置的是整個字段的索引,則上表中根據(jù) 「zhangssxyz@163.com」查詢到相關(guān)記記錄后,再查詢此記錄的下一條記錄,發(fā)現(xiàn)沒有,停止掃描,此時可知只掃描一行記錄,如果我們以前六個字符(即 email(6))作為前綴索引,則顯然要掃描四行記錄,并且獲得行記錄后不得不回到主鍵索引再判斷 email 字段的值,所以使用前綴索引要評估它帶來的這些開銷。

另外有一種情況我們可能需要考慮一下,如果前綴基本都是相同的該怎么辦,比如現(xiàn)在我們?yōu)槟呈械氖忻窠⒁粋€人口信息表,則這個市人口的身份證雖然不同,但身份證前面的幾位數(shù)都是相同的,這種情況該怎么建立前綴索引呢。

一種方式就是我們上文說的,針對身份證建立哈希索引,另一種方式比較巧妙,將身份證倒序存儲,查的時候可以按如下方式查詢:

  1. SELECT field_list FROM t WHERE id_card = reverse('input_id_card_string'); 

這樣就可以用身份證的后六位作前綴索引了,是不是很巧妙 ^_^

實際上上文所述的索引選擇性同樣適用于聯(lián)合索引的設(shè)計,如果沒有特殊情況,我們一般建議在建立聯(lián)合索引時,把選擇性最高的列放在最前面,比如,對于以下語句:

  1. SELECT * FROM payment WHERE staff_id = xxx AND customer_id = xxx; 

單就這個語句而言, (staff_id,customer_id) 和 (customer_id, staff_id) 這兩個聯(lián)合索引我們應(yīng)該建哪一個呢,可以統(tǒng)計下這兩者的選擇性。

  1. SELECT  
  2.  COUNT(DISTINCT staff_id)/COUNT(*) as staff_id_selectivity, 
  3.  COUNT(DISTINCT customer_id)/COUNT(*) as customer_id_selectivity, 
  4.  COUNT(*) 
  5. FROM payment 

結(jié)果為: ;

  1. staff_id_selectivity: 0.0001 
  2. customer_id_selectivity: 0.0373 
  3. COUNT(*): 16049 

從中可以看出 customer_id 的選擇性更高,所以應(yīng)該選擇 customer_id 作為第一列。

索引設(shè)計準則:三星索引

上文我們得出了一個索引列順序的經(jīng)驗 法則:將選擇性最高的列放在索引的最前列,這種建立在某些場景可能有用,但通常不如避免隨機 IO 和 排序那么重要,這里引入索引設(shè)計中非常著名的一個準則:三星索引。

如果一個查詢滿足三星索引中三顆星的所有索引條件,理論上可以認為我們設(shè)計的索引是最好的索引。什么是三星索引

  • 第一顆星:WHERE 后面參與查詢的列可以組成了單列索引或聯(lián)合索引
  • 第二顆星:避免排序,即如果 SQL 語句中出現(xiàn) order by colulmn,那么取出的結(jié)果集就已經(jīng)是按照 column 排序好的,不需要再生成臨時表
  • 第三顆星:SELECT 對應(yīng)的列應(yīng)該盡量是索引列,即盡量避免回表查詢。

所以對于如下語句:

  1. SELECT age, name, city where age = xxx and name = xxx order by age 

設(shè)計的索引應(yīng)該是 (age, name,city) 或者 (name, age,city)

當然 了三星索引是一個比較理想化的標準,實際操作往往只能滿足期望中的一顆或兩顆星,考慮如下語句:

  1. SELECT age, name, city where age >= 10 AND age <= 20 and city = xxx order by name desc 

假設(shè)我們分別為這三列建了聯(lián)合索引,則顯然它符合第三顆星(使用了覆蓋索引),如果索引是(city, age, name),則雖然滿足了第一顆星,但排序無法用到索引,不滿足第二顆星,如果索引是 (city, name, age),則第二顆星滿足了,但此時 age 在 WHERE 中的搜索條件又無法滿足第一星,

另外第三顆星(盡量使用覆蓋索引)也無法完全滿足,試想我要 SELECT 多列,要把這多列都設(shè)置為聯(lián)合索引嗎,這對索引的維護是個問題,因為每一次表的 CURD 都伴隨著索引的更新,很可能頻繁伴隨著頁分裂與頁合并。

綜上所述,三星索引只是給我們構(gòu)建索引提供了一個參考,索引設(shè)計應(yīng)該盡量靠近三星索引的標準,但實際場景我們一般無法同時滿足三星索引,一般我們會優(yōu)先選擇滿足第三顆星(因為回表代價較大)至于第一,二顆星就要依賴于實際的成本及實際的業(yè)務(wù)場景考慮。

總結(jié)

本文簡述了索引的基本原理,索引的幾種類型,以及分析了一下設(shè)計索引盡量應(yīng)該遵循的一些準則,相信我們對索引的理解又更深了一步。另外強烈建議大家去學(xué)習(xí)一下附錄中的幾本書。文中的挺多例子都是在文末的參考資料中總結(jié)出來的,讀經(jīng)典書籍,相信大家會受益匪淺!

本文轉(zhuǎn)載自微信公眾號「碼海」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系碼海公眾號。

 

責任編輯:武曉燕 來源: 碼海
相關(guān)推薦

2020-06-12 09:07:03

技術(shù)總監(jiān)數(shù)據(jù)庫

2019-06-24 08:32:09

技術(shù)總監(jiān)JavaC++

2018-06-04 08:55:15

技術(shù)套路開發(fā)

2019-05-06 10:51:49

總監(jiān)技術(shù)場景

2019-05-13 08:51:53

總監(jiān)技術(shù)CTO

2022-10-26 11:47:45

2020-10-26 08:56:32

技術(shù)總監(jiān)程序員

2013-12-18 16:20:20

雷軍小米

2021-04-21 07:53:12

Java限流器管理

2019-10-08 10:37:46

設(shè)計技術(shù)程序員

2013-06-18 09:12:00

技術(shù)開發(fā)

2020-08-26 10:03:31

MySQL索引

2013-06-18 09:28:12

程序員技術(shù)病

2025-07-02 03:00:00

2020-03-09 08:00:00

技術(shù)管理套路

2018-03-26 09:05:18

CTO

2019-07-26 15:45:50

技術(shù)經(jīng)理項目管理

2021-07-20 05:37:17

項目面試簡歷

2015-08-04 09:59:29

編程學(xué)編程

2020-12-28 10:20:57

數(shù)據(jù)可視化工具大數(shù)據(jù)
點贊
收藏

51CTO技術(shù)棧公眾號

在线观看日韩av电影| 深夜激情久久| 国产精品免费av| 亚洲aa中文字幕| 五月天婷婷综合网| 精品久久久久久久久久久下田| 欧美日韩精品免费| 18禁裸男晨勃露j毛免费观看 | 欧美日韩一区在线| 免费看黄色a级片| 免费在线稳定资源站| 久久99精品国产麻豆不卡| 久久久久久久影院| 免费成人深夜天涯网站| 中文无码日韩欧| 欧美在线综合视频| 欧美深夜福利视频| 欧美日本一道| 久久久久国产成人精品亚洲午夜| 91亚洲永久免费精品| 日本免费在线观看视频| 亚洲色图网站| 尤物tv国产一区| 91玉足脚交白嫩脚丫| 欧美韩国日本| 欧美日韩亚洲精品内裤| 亚洲高潮无码久久| 在线观看完整版免费| 99热国产精品| 亚洲qvod图片区电影| 国内av在线播放| 在线亚洲伦理| 欧美激情精品久久久久久| 精品一区二区6| 免费精品国产的网站免费观看| 日韩三级高清在线| 99re精彩视频| 亚洲www啪成人一区二区| 午夜免费久久看| 国产日本欧美在线| 69久久精品| 日本一二三不卡| 欧美视频1区| 午夜国产在线观看| 不卡欧美aaaaa| 99精彩视频在线观看免费| 亚洲中文字幕在线一区| 首页国产欧美久久| 日韩av电影国产| 亚洲欧美精品一区二区三区| 91久久黄色| 久久久免费观看视频| 午夜免费激情视频| 亚洲一区二区| 久久av红桃一区二区小说| 91n在线视频| 久久福利影院| 日韩三级成人av网| 国产黄色的视频| 欧美.日韩.国产.一区.二区| 久久国产精品免费视频| www日韩在线| 午夜精品影院| 欧美精品电影在线| 国产午夜精品无码一区二区| 国产在线日韩| 97在线观看视频国产| 国产成人亚洲精品自产在线| 国产精品毛片在线看| 欧美在线精品免播放器视频| 免费污污视频在线观看| 久色成人在线| 成人h猎奇视频网站| 精品国自产拍在线观看| 丁香桃色午夜亚洲一区二区三区| 国产精品久久九九| 亚洲三区在线播放| 中文字幕高清一区| 国产在线拍揄自揄拍无码| 50度灰在线| 香蕉av福利精品导航| 男人天堂999| 美女视频一区| 日韩美女视频一区二区在线观看| 亚洲av成人精品一区二区三区 | 九9re精品视频在线观看re6| 视频一区二区三区国产| 国产精品毛片a∨一区二区三区| 国产高清精品软男同| 精精国产xxxx视频在线中文版| 精品日韩中文字幕| 国产三级国产精品国产专区50| 国产亚洲高清在线观看| 亚洲精品大尺度| 黑人と日本人の交わりビデオ| 亚洲九九视频| 91产国在线观看动作片喷水| 国产精品自拍第一页| 激情偷乱视频一区二区三区| 国内一区在线| 日本在线免费| 狠狠综合久久av一区二区小说| 欧美一级特黄a| 999久久精品| 在线电影中文日韩| 久久午夜无码鲁丝片| 日韩中文字幕区一区有砖一区 | 91在线公开视频| bt7086福利一区国产| 在线看视频不卡| 成人教育av| 日韩精品在线一区二区| 性欧美一区二区| 精品福利av| 成人免费观看a| 黄视频在线观看免费| 一区二区成人在线| 午夜久久久精品| 香蕉久久99| 欧美大片大片在线播放| 中文人妻熟女乱又乱精品| 波多野结衣视频一区| 中文字幕日韩一区二区三区不卡 | 五月婷中文字幕| 亚洲精品国产高清久久伦理二区| 任你操这里只有精品| 99热这里只有精品首页 | 久久99九九| 欧美日韩经典丝袜| 91精品国产麻豆| 国精产品视频一二二区| 午夜亚洲一区| 狠狠干一区二区| 直接在线观看的三级网址| 欧美婷婷六月丁香综合色| 日韩 中文字幕| 亚洲久色影视| 成人黄色片视频网站| wwwav在线| 9191国产精品| 日韩va亚洲va欧美va清高| 青青草成人在线观看| 日本亚洲导航| 亚洲电影有码| 永久免费精品影视网站| 中文字幕免费视频观看| 国产午夜精品在线观看| 精品国产成人av在线免| 亚洲成a人片77777在线播放 | 久久久综合久久久| 国产suv精品一区二区三区| 26uuu成人| 99精品美女视频在线观看热舞| 日日狠狠久久偷偷四色综合免费 | 天堂а√在线中文在线鲁大师| 免费一区视频| 另类欧美小说| 日韩天堂在线| 中文字幕不卡av| 影音先锋黄色网址| 中文字幕一区二区三区精华液| 五月天中文字幕在线| 999国产精品永久免费视频app| 国产狼人综合免费视频| 色多多视频在线观看| 91精品久久久久久久99蜜桃| 超碰手机在线观看| 成人av资源在线| 欧美国产激情视频| 欧美一区电影| 亚洲一区二区三区在线免费观看| av在线免费播放| 欧美成人女星排名| 在线能看的av| 中文成人av在线| 一级做a爱视频| 亚洲第一黄网| 日本欧美色综合网站免费| 亚洲国产伊人| 97视频在线看| 91在线品视觉盛宴免费| 欧美一区2区视频在线观看| 久久精品国产亚洲av麻豆色欲| 91美女视频网站| 亚洲欧美另类动漫| 欧美黄污视频| 免费99视频| 日韩欧国产精品一区综合无码| 欧美另类高清videos| 五月天婷婷社区| 欧美午夜免费电影| 久久久夜色精品| 国产日韩v精品一区二区| 国产伦精品一区二区三区妓女下载 | 日韩黄色免费观看| 91丨九色丨蝌蚪富婆spa| 国产一二三区av| 亚洲特级毛片| 亚洲国内在线| 日韩大胆成人| 999国产在线| 欧美日韩五区| 久久理论片午夜琪琪电影网| 成人18在线| 亚洲成av人乱码色午夜| 精品乱码一区内射人妻无码| 亚洲精品国产精品乱码不99| 免费看91的网站| 国产.欧美.日韩| 天天爽夜夜爽一区二区三区 | 北条麻妃在线观看| 欧美日韩蜜桃| 一区二区欧美日韩| 要久久电视剧全集免费| 成人黄色片视频网站| 欧美成人三级| 国产91在线视频| 国产ktv在线视频| 久久久av亚洲男天堂| 国产小视频在线| 亚洲精品一区二区三区四区高清| 色婷婷久久综合中文久久蜜桃av| 五月综合激情日本mⅴ| 欧美精品xxxxx| 中文字幕在线免费不卡| 中文字幕伦理片| 久久美女高清视频| 国产精品一区二区无码对白| 国产在线观看一区二区| 在线免费观看av的网站| 久久一二三四| 久久久免费视频网站| 亚洲精品激情| 99在线免费视频观看| 午夜精品久久久久99热蜜桃导演 | 最近中文字幕无免费| 国产福利精品一区| 91亚洲一区二区| 激情综合色播五月| 国产免费中文字幕| 蓝色福利精品导航| 一区二区三区 欧美| 日韩成人免费在线| 免费激情视频在线观看| 久久一区二区三区超碰国产精品| 国产h视频在线播放| 亚洲人www| 国产成人无码a区在线观看视频| 亚洲精品少妇| 国产91xxx| 校园激情久久| 波多野结衣家庭教师在线| 亚洲美女黄网| 无罩大乳的熟妇正在播放| 亚洲一区二区三区高清| 免费无码国产v片在线观看| 久久久久中文| 亚洲国产精品毛片av不卡在线| 久久综合伊人| 在线免费观看av的网站| 狠狠色2019综合网| 黑人性生活视频| 成人激情av网| 在线观看日韩精品视频| 国产日本一区二区| 成人性视频免费看| 亚洲欧美乱综合| 亚洲精品在线观看av| 黑人精品xxx一区| 台湾佬中文在线| 精品视频123区在线观看| 一区二区日韩在线观看| 日韩免费高清av| 日韩精品系列| 一区三区二区视频| 成人免费网站在线观看视频| 久久久久国产视频| 97久久香蕉国产线看观看| 91精品久久久久久久久久久| 2021年精品国产福利在线| 久久久福利视频| 91欧美大片| 黄网站欧美内射| 美女视频网站黄色亚洲| 亚洲三级在线视频| 91麻豆国产精品久久| 欧美福利在线视频| 亚洲福利视频三区| 国产偷人爽久久久久久老妇app| 日韩欧美一区在线| 日本一区高清| 欧美成人一区二区三区电影| 美女露胸视频在线观看| 成人免费视频网址| 色婷婷久久久| 中文字幕中文字幕在线中一区高清 | 男女激烈动态图| 性8sex亚洲区入口| 蜜桃视频无码区在线观看| 国产三级三级三级精品8ⅰ区| 亚洲色图综合区| 色94色欧美sute亚洲线路二| 国产草草影院ccyycom| 亚洲天堂开心观看| 欧美xxxx做受欧美88bbw| 国产精品美女久久| 精品视频自拍| ijzzijzzij亚洲大全| 首页国产欧美久久| 88av在线播放| 亚洲欧洲制服丝袜| 香蕉污视频在线观看| 亚洲成人久久一区| 国产在线高潮| 国产精品旅馆在线| 亚洲va久久久噜噜噜久久| 久久久久久av无码免费网站下载| 免费成人你懂的| 黄色污在线观看| 一区二区三区日本| 91在线你懂的| 国产一区二区av| 日韩在线伦理| 国产伦精品一区二区三区视频免费 | 亚洲国产欧美在线成人app| 国产在线激情| 国产精品香蕉国产| 波多野结衣的一区二区三区| 欧美日韩成人免费视频| 国产传媒久久文化传媒| 手机看片国产日韩| 欧美在线|欧美| 黄视频在线播放| 日本在线精品视频| 亚洲自拍电影| 37pao成人国产永久免费视频| 成人免费三级在线| 久久免费精彩视频| 欧美成人精品二区三区99精品| 国产鲁鲁视频在线观看特色| 国产精品永久免费| 欧美电影一二区| 色天使在线观看| 中文字幕一区二区不卡| 在线观看国产一区二区三区| 在线性视频日韩欧美| 日韩欧美一区二区三区免费观看 | 国产精品91av| 亚洲在线一区二区三区| 亚洲精品久久久久avwww潮水| 欧美精品性视频| 中文在线综合| 亚洲人精品午夜射精日韩| 成人免费黄色在线| 精品成人久久久| 日韩成人中文电影| 欧美gay视频| 日本亚洲导航| 毛片一区二区三区| 日韩三级在线观看视频| 日韩一级片网站| 丁香高清在线观看完整电影视频| 国产伦精品一区二区三区照片91 | 国产精品福利一区二区三区| 亚洲一级片免费看| 蜜月aⅴ免费一区二区三区 | 日韩高清dvd| 免费观看成人av| 日韩成人毛片视频| 亚洲白虎美女被爆操| 日韩高清中文字幕一区二区| 日韩亚洲视频在线| 国产一区不卡在线| 久久久久久久久久久久国产| 亚洲国产精品yw在线观看| 欧美最新精品| 国产精品美女在线播放| 不卡视频一二三四| www.久久视频| 久久亚洲精品国产亚洲老地址| 亚洲国产一区二区三区网站| 欧美日韩亚洲一| 国产精品麻豆99久久久久久| 性猛交富婆╳xxx乱大交天津 | 一区高清视频| 成人性生交大片免费看中文网站| 影音先锋在线国产| 久久av中文字幕| 偷拍亚洲精品| 欧美一级免费在线| 日韩欧美aⅴ综合网站发布| 久久综合之合合综合久久| 国产精品亚洲综合| 青青草97国产精品免费观看| 久久久久噜噜噜亚洲熟女综合| 亚洲人成在线免费观看| 视频在线亚洲| 91色国产在线| 一个色综合av| 最新97超碰在线|