<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          MyISAM與InnoDB的索引,究竟有什么差異?

          共 1877字,需瀏覽 4分鐘

           ·

          2021-08-29 06:10

          數(shù)據(jù)庫的索引分為主鍵索引Primary Inkex)與普通索引Secondary Index)。InnoDB和MyISAM是怎么利用B+樹來實現(xiàn)這兩類索引,其又有什么差異呢?這是今天要聊的內(nèi)容。
           
          一,MyISAM的索引
          MyISAM的索引與行記錄是分開存儲的,叫做非聚集索引UnClustered Index)。

          其主鍵索引與普通索引沒有本質(zhì)差異:
          (1)有連續(xù)聚集的區(qū)域單獨存儲行記錄;
          (2)主鍵索引的葉子節(jié)點,存儲主鍵,與對應(yīng)行記錄的指針;
          (3)普通索引的葉子結(jié)點,存儲索引列,與對應(yīng)行記錄的指針;
          畫外音:MyISAM的表可以沒有主鍵。
           
          主鍵索引與普通索引是兩棵獨立的索引B+樹,通過索引列查找時,先定位到B+樹的葉子節(jié)點,再通過指針定位到行記錄。
           
          舉個例子,MyISAM:
          t(id PK, name KEY, sex, flag);
           
          表中有四條記錄:

          1, shenjian, m, A

          3, zhangsan, m, A

          5, lisi, m, A

          9, wangwu, f, B


          其B+樹索引構(gòu)造如上圖:
          (1)行記錄單獨存儲;
          (2)id為PK,有一棵id的索引樹,葉子指向行記錄;
          (3)name為KEY,有一棵name的索引樹,葉子也指向行記錄;
           
          二、InnoDB的索引
          InnoDB的主鍵索引與行記錄是存儲在一起的,故叫做聚集索引Clustered Index):
          (1)沒有單獨區(qū)域存儲行記錄;
          (2)主鍵索引的葉子節(jié)點,存儲主鍵,與對應(yīng)行記錄(而不是指針);
          畫外音:因此,InnoDB的PK查詢是非常快的。
           
          因為這個特性,InnoDB的表必須要有聚集索引
          (1)如果表定義了PK,則PK就是聚集索引;
          (2)如果表沒有定義PK,則第一個非空unique列是聚集索引;
          (3)否則,InnoDB會創(chuàng)建一個隱藏的row-id作為聚集索引;
           
          聚集索引,也只能夠有一個,因為數(shù)據(jù)行在物理磁盤上只能有一份聚集存儲。
           
          InnoDB的普通索引可以有多個,它與聚集索引是不同的:
          (1)普通索引的葉子節(jié)點,存儲主鍵(也不是指針);
           
          對于InnoDB表,這里的啟示是:
          (1)不建議使用較長的列做主鍵,例如char(64),因為所有的普通索引都會存儲主鍵,會導(dǎo)致普通索引過于龐大;
          (2)建議使用趨勢遞增的key做主鍵,由于數(shù)據(jù)行與索引一體,這樣不至于插入記錄時,有大量索引分裂,行記錄移動;
           
          仍是上面的例子,只是存儲引擎換成InnoDB:
          t(id PK, name KEY, sex, flag);
           
          表中還是四條記錄:

          1, shenjian, m, A

          3, zhangsan, m, A

          5, lisi, m, A

          9, wangwu, f, B

           
          其B+樹索引構(gòu)造如上圖:
          (1)id為PK,行記錄和id索引樹存儲在一起;
          (2)name為KEY,有一棵name的索引樹,葉子存儲id;
           
          當(dāng):
          select * from t where name=‘lisi’;
          會先通過name輔助索引定位到B+樹的葉子節(jié)點得到id=5,再通過聚集索引定位到行記錄。
          畫外音:所以,其實掃了2遍索引樹。
           
          三,總結(jié)
          MyISAM和InnoDB都使用B+樹來實現(xiàn)索引:
          (1)MyISAM的索引與數(shù)據(jù)分開存儲;
          (2)MyISAM的索引葉子存儲指針,主鍵索引與普通索引無太大區(qū)別;
          (3)InnoDB的聚集索引數(shù)據(jù)行統(tǒng)一存儲;
          (4)InnoDB的聚集索引存儲數(shù)據(jù)行本身,普通索引存儲主鍵;
          (5)InnoDB一定有且只有一個聚集索引;
          (6)InnoDB建議使用趨勢遞增整數(shù)作為PK,而不宜使用較長的列作為PK;


          ,如何系統(tǒng)學(xué)習(xí)數(shù)據(jù)庫知識體系?


          騰訊技TDSQL術(shù)專家秦瑋聯(lián)手前58集團高級架構(gòu)師陳東,打磨了一套《數(shù)據(jù)庫實戰(zhàn)32講》在線專欄課,幫你快速掌握數(shù)據(jù)庫核心架構(gòu)技術(shù)。


          課題:《數(shù)據(jù)庫實戰(zhàn)32講》
          講師秦瑋、陳東
          時間:8.30-9.1 三天,20:00開始
          費用1.99(原價499粉絲福利價 1.99
          名額:200名,先到先得

          如何參加?

          掃碼報名,耐心等待顧問老師通過


          希望對大家的數(shù)據(jù)庫學(xué)習(xí)有幫助。
          閱讀原文,了解更多。
          瀏覽 26
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

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

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  高中学生妹毛片 | 国产精品自产拍在线 | a在线免费观看视频 | 操逼网在线看 | 国产7777|