久久久久久久视色,久久电影免费精品,中文亚洲欧美乱码在线观看,在线免费播放AV片

<center id="vfaef"><input id="vfaef"><table id="vfaef"></table></input></center>

    <p id="vfaef"><kbd id="vfaef"></kbd></p>

    
    
    <pre id="vfaef"><u id="vfaef"></u></pre>

      <thead id="vfaef"><input id="vfaef"></input></thead>

    1. 站長資訊網(wǎng)
      最全最豐富的資訊網(wǎng)站

      一起來聊聊MySQL索引結(jié)構(gòu)

      本篇文章給大家?guī)砹岁P(guān)于mysql的相關(guān)知識,MySQL官方對索引的定義為索引(Index)是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu),可以得到索引的本質(zhì),索引是數(shù)據(jù)結(jié)構(gòu),下面一起來看一下,希望對大家有幫助。

      一起來聊聊MySQL索引結(jié)構(gòu)

      推薦學(xué)習(xí):mysql視頻教程

      簡介

      在數(shù)據(jù)之外,數(shù)據(jù)庫系統(tǒng)還維護(hù)著滿足特定查找算法的數(shù)據(jù)結(jié)構(gòu),這些數(shù)據(jù)結(jié)構(gòu)以某種方式引用(指向)數(shù)據(jù),這樣就可以在這些數(shù)據(jù)結(jié)構(gòu)上實現(xiàn)高級查找算法。這種數(shù)據(jù)結(jié)構(gòu),就是索引。

      一般來說索引本身也很大,不可能全部存儲在內(nèi)存中,因此索引往往以索引文件的形式存儲的磁盤上。

      優(yōu)點:

      1、類似大學(xué)圖書館建書目索引,提高數(shù)據(jù)檢索的效率,降低數(shù)據(jù)庫的IO成本。

      2、通過索引列對數(shù)據(jù)進(jìn)行排序,降低數(shù)據(jù)排序的成本,降低了CPU的消耗。

      缺點:

      1、雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對表進(jìn)行INSERT、UPDATE和DELETE。因為更新表時,MySQL不僅要保存數(shù)據(jù),還要保存一下索引文件。每次更新添加了索引列的字段,都會調(diào)整因為更新所帶來的鍵值變化后的索引信息。

      2、實際上索引也是一張表,該表保存了主鍵與索引字段,并指向?qū)嶓w表的記錄,所以索引列也是要占用空間的

      索引舉例:(用樹結(jié)構(gòu)做索引)

      左邊是數(shù)據(jù)表,一共有兩列七條記錄,最左邊的是數(shù)據(jù)記錄的物理地址。

      一起來聊聊MySQL索引結(jié)構(gòu)

      為了加快Col2的查找,可以維護(hù)一個右邊所示的二叉查找樹,每個節(jié)點分別包含索引鍵值和一個指向?qū)?yīng)數(shù)據(jù)記錄物理地址的指針,這樣就可以運用二叉查找在一定的復(fù)雜度內(nèi)獲取到相應(yīng)數(shù)據(jù),從而快速的檢索出符合條件的記錄。

      索引結(jié)構(gòu)(樹)

      如何通過索引加快數(shù)據(jù)庫表的查詢速度呢?為了方便講解,我們限定于數(shù)據(jù)庫表只包含下面這樣兩個查詢需求:

      1、select* from user where id=1234;

      2、select *from user where id>1234 and id<2345;(按區(qū)間)

      為什么用樹,而不用哈希表

      哈希表按值查詢的性能很好,時間復(fù)雜度是O(1),但它不能支持按照區(qū)間快速查找數(shù)據(jù),因此無法滿足要求。同理,盡管平衡二叉查找樹查詢性能很高,時間復(fù)雜度為O(logn),而且對樹進(jìn)行中序遍歷,可以輸出有序的數(shù)據(jù)序列,但也無法滿足按照區(qū)間快速查找數(shù)據(jù)的需求。

      為了支持按照區(qū)間快速查找數(shù)據(jù),我們對二叉查找樹進(jìn)行改造,將二叉查找樹的葉子節(jié)點用鏈表串起來,如果要查找某個區(qū)間的數(shù)據(jù),只需要用區(qū)間的起始值,在樹中進(jìn)行查找,當(dāng)定位到有序鏈表中的某個節(jié)點之后,再從這個節(jié)點開始順著有序鏈表往后遍歷,直到有序鏈表中的節(jié)點數(shù)據(jù)值大于區(qū)間終止值為止。

      一起來聊聊MySQL索引結(jié)構(gòu)

      又因為樹上的很多操作的時間復(fù)雜程度與樹的高度成正比,降低的樹的高度,就能減少磁盤IO操作。因此我們把索引構(gòu)建成m叉樹(m>2),詳細(xì)介紹可看后文。

      BTree索引

      在介紹B+樹之前,先來了解一下B樹。

      一起來聊聊MySQL索引結(jié)構(gòu)

      1、初始化介紹

      一顆b樹,淺藍(lán)色的塊我們稱之為一個磁盤塊,可以看到每個磁盤塊包含幾個數(shù)據(jù)項(深藍(lán)色所示)和指針(黃色所示),如磁盤塊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。(而且是多條數(shù)據(jù)組成的數(shù)據(jù)區(qū)間:3~ 5,… … ,90~ 99)

      非葉子節(jié)點不存儲真實的數(shù)據(jù),只存儲指引搜索方向的數(shù)據(jù)項,如17、35并不真實存在于數(shù)據(jù)表中。

      2、查找過程

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

      B+Tree索引

      B+樹和B樹類似,B+樹是B樹的改進(jìn)版。 即:m叉查找樹與有序鏈表構(gòu)建成的樹就是B+樹,也就是要存儲的樹索引

      一起來聊聊MySQL索引結(jié)構(gòu)

      如圖:B+樹和B樹的主要區(qū)別有以下兩點:

      1、B+樹的葉子節(jié)點用鏈表來串聯(lián)。 查找某個區(qū)間的數(shù)據(jù),只需要用區(qū)間的起始值,在樹中進(jìn)行查找,當(dāng)定位到有序鏈表中的某個節(jié)點之后,再從這個節(jié)點開始順著有序鏈表往后遍歷,直到有序鏈表中的節(jié)點數(shù)據(jù)值大于區(qū)間終止值為止。

      2、B+樹中的任何節(jié)點都不存儲真實數(shù)據(jù),只是用來索引。 B樹直接通過葉子節(jié)點獲取到數(shù)據(jù);而B+樹每個葉子節(jié)點存儲數(shù)據(jù)行的鍵值和地址信息,當(dāng)查詢到某個葉子節(jié)點時,通過葉子節(jié)點的地址找到真實的數(shù)據(jù)信息。

      聚簇索引與非聚簇索引

      聚簇索引并不是一種單獨的索引類型,而是一種數(shù)據(jù)存儲方式。 術(shù)語‘聚簇’表示數(shù)據(jù)行和相鄰的鍵值聚簇的存儲在一起。

      聚簇索引的好處:

      按照聚簇索引排列順序,查詢顯示一定范圍數(shù)據(jù)的時候,由于數(shù)據(jù)都是緊密相連,數(shù)據(jù)庫不不用從多個數(shù)據(jù)塊中提取數(shù)據(jù),所以節(jié)省了大量的io操作。

      聚簇索引的限制:

      1、對于mysql數(shù)據(jù)庫目前只有innodb數(shù)據(jù)引擎支持聚簇索引,而Myisam并不支持聚簇索引。

      2、由于數(shù)據(jù)物理存儲排序方式只能有一種,所以每個Mysql的表只能有一個聚簇索引。一般情況下就是該表的主鍵。

      3、為了充分利用聚簇索引的聚簇的特性,所以innodb表的主鍵列盡量選用有序的順序id,而不建議用無序的id,比如uuid這種。

      如下圖,左側(cè)的索引就是聚簇索引,因為數(shù)據(jù)行在磁盤的排列和索引排序保持一致。

      一起來聊聊MySQL索引結(jié)構(gòu)

      索引分類

      單值索引

      即一個索引只包含單個列,一個表可以有多個單列索引

      隨表一起建索引: CREATE TABLE customer ( id INT(10) UNSIGNED  AUTO_INCREMENT , customer_no VARCHAR(200), customer_name VARCHAR(200), PRIMARY KEY(id), KEY (customer_name) );   單獨建單值索引: CREATE  INDEX idx_customer_name ON customer(customer_name);    刪除索引: DROP INDEX idx_customer_name  on customer;

      唯一索引

      索引列的值必須唯一,但允許有空值

      隨表一起建索引: CREATE TABLE customer ( id INT(10) UNSIGNED  AUTO_INCREMENT , customer_no VARCHAR(200), customer_name VARCHAR(200),   PRIMARY KEY(id),   KEY (customer_name),   UNIQUE (customer_no) );    單獨建唯一索引: CREATE UNIQUE INDEX idx_customer_no ON customer(customer_no);    刪除索引: DROP INDEX idx_customer_no on customer ;

      主鍵索引

      設(shè)定為主鍵后數(shù)據(jù)庫會自動建立索引,innodb為聚簇索引

      隨表一起建索引: CREATE TABLE customer ( id INT(10) UNSIGNED  AUTO_INCREMENT , customer_no VARCHAR(200), customer_name VARCHAR(200),   PRIMARY KEY(id)  );     CREATE TABLE customer2 ( id INT(10) UNSIGNED   , customer_no VARCHAR(200), customer_name VARCHAR(200),   PRIMARY KEY(id)  );    單獨建主鍵索引: ALTER TABLE customer   add PRIMARY KEY customer(customer_no);     刪除建主鍵索引: ALTER TABLE customer   drop PRIMARY KEY ;     修改建主鍵索引: 必須先刪除掉(drop)原索引,再新建(add)索引

      復(fù)合索引

      即一個索引包含多個列

      隨表一起建索引: CREATE TABLE customer ( id INT(10) UNSIGNED  AUTO_INCREMENT , customer_no VARCHAR(200), customer_name VARCHAR(200),   PRIMARY KEY(id),   KEY (customer_name),   UNIQUE (customer_name),   KEY (customer_no,customer_name) );   單獨建索引: CREATE  INDEX idx_no_name ON customer(customer_no,customer_name);    刪除索引: DROP INDEX idx_no_name  on customer ;

      性能分析

      索引創(chuàng)建場景

      哪些情況需要創(chuàng)建索引

      1、主鍵自動建立唯一索引

      2、頻繁作為查詢條件的字段應(yīng)該創(chuàng)建索引

      3、查詢中與其它表關(guān)聯(lián)的字段,外鍵關(guān)系建立索引

      4、單鍵/組合索引的選擇問題, 組合索引性價比更高

      5、查詢中排序的字段,排序字段若通過索引去訪問將大大提高排序速度

      6、查詢中統(tǒng)計或者分組字段

      哪些情況不要創(chuàng)建索引

      1、表記錄太少

      2、經(jīng)常增刪改的表或者字段 原因:提高了查詢速度,同時卻會降低更新表的速度,如對表進(jìn)行INSERT、UPDATE和DELETE。因為更新表時,MySQL不僅要保存數(shù)據(jù),還要保存一下索引文件

      3、Where條件里用不到的字段不創(chuàng)建索引

      4、過濾性不好的不適合建索引

      推薦學(xué)習(xí):mysql視頻教程

      贊(0)
      分享到: 更多 (0)
      網(wǎng)站地圖   滬ICP備18035694號-2    滬公網(wǎng)安備31011702889846號