MyISAM 和 InnoDB 索引結構及其實現原理


  1. 數據庫索引,是數據庫管理系統中一個排序的數據結構,以協助快速查詢、更新數據庫表中數據。

  2. 索引的實現通常使用B_TREE。
    B_TREE索引加速了數據訪問,因為存儲引擎不會再去掃描整張表得到需要的數據;
    相反,它從根節點開始,根節點保存了子節點的指針,存儲引擎會根據指針快速尋找數據。

  3. MyISAM引擎 使用B+Tree作為索引結構,葉節點的data域存放的是數據記錄的地址.
    即:MyISAM索引文件和數據文件是分離的,MyISAM的索引文件僅僅保存數據記錄的地址。
    MyISAM中索引檢索的算法為首先按照B+Tree搜索算法搜索索引,
    如果指定的Key存在,則取出其data域的值,然后以data域的值為地址,讀取相應數據記錄。
    MyISAM的索引方式也叫做“非聚集”的。
    物理文件結構為:
    .frm文件:與表相關的元數據信息都存放在frm文件,包括表結構的定義信息等。
    .myd(mysql data)文件:myisam存儲引擎專用,用於存儲myisam表的數據
    .myi(mysql index)文件:myisam存儲引擎專用,用於存儲myisam表的索引相關信息

  4. InnoDB引擎 也使用B+Tree作為索引結構,但是InnoDB的數據文件本身就是索引文件,葉節點data域保存了完整的數據記錄。
    這個索引的key是數據表的主鍵,因此InnoDB表數據文件本身就是主索引。這種索引叫做“聚焦索引”。
    InnoDB的輔助索引的data域存儲相應記錄主鍵的值而不是地址。
    換句話說,InnoDB的所有輔助索引都引用主鍵作為data域。
    聚集索引這種實現方式使得按主鍵的搜索十分高效,但是輔助索引搜索需要檢索兩遍索引:
    首先檢索輔助索引獲得主鍵,然后用主鍵到主索引中檢索獲得記錄。
    InnoDB的索引實現后,不建議使用過長的字段作為主鍵,因為所有輔助索引都引用主索引,過長的主索引會令輔助索引變得過大。
    在InnoDB中也不建議使用非單調的字段作為主鍵,
    因為InnoDB數據文件本身是一顆B+Tree,非單調的主鍵會造成在插入新記錄時數據文件為了維持B+Tree的特性而頻繁的分裂調整,十分低效,建議使用自增字段作為主鍵。
    物理文件結構為:
    .frm與表相關的元數據信息都存放在frm文件,包括表結構的定義信息等。
    .ibd文件和.ibdata文件:
    這兩種文件都是存放innodb數據的文件,之所以用兩種文件來存放innodb的數據,是因為innodb的數據存儲方式能夠通過配置來決定是使用共享表空間存放存儲數據,還是用獨享表空間存放存儲數據。
    獨享表空間存儲方式使用.ibd文件,並且每個表一個ibd文件;
    共享表空間存儲方式使用.ibdata文件,所有表共同使用一個ibdata文件;
    覺得使用哪種方式的參數在mysql的配置文件中 innodb_file_per_table;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM