成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MySQL索引背后的數(shù)據(jù)結(jié)構(gòu)及算法之索引實(shí)現(xiàn)

數(shù)據(jù)庫 MySQL 算法
在MySQL中,索引屬于存儲(chǔ)引擎級(jí)別的概念,不同存儲(chǔ)引擎對(duì)索引的實(shí)現(xiàn)方式是不同的,本文主要討論MyISAM和InnoDB兩個(gè)存儲(chǔ)引擎的索引實(shí)現(xiàn)方式。

MyISAM索引實(shí)現(xiàn)

MyISAM引擎使用B+Tree作為索引結(jié)構(gòu),葉節(jié)點(diǎn)的data域存放的是數(shù)據(jù)記錄的地址。下圖是MyISAM索引的原理圖:

圖8

這里設(shè)表一共有三列,假設(shè)我們以Col1為主鍵,則圖8是一個(gè)MyISAM表的主索引(Primary key)示意。可以看出MyISAM的索引文件僅僅保存數(shù)據(jù)記錄的地址。在MyISAM中,主索引和輔助索引(Secondary key)在結(jié)構(gòu)上沒有任何區(qū)別,只是主索引要求key是唯一的,而輔助索引的key可以重復(fù)。如果我們?cè)贑ol2上建立一個(gè)輔助索引,則此索引的結(jié)構(gòu)如下圖所示:

圖9

同樣也是一顆B+Tree,data域保存數(shù)據(jù)記錄的地址。因此,MyISAM中索引檢索的算法為首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,則取出其data域的值,然后以data域的值為地址,讀取相應(yīng)數(shù)據(jù)記錄。

MyISAM的索引方式也叫做“非聚集”的,之所以這么稱呼是為了與InnoDB的聚集索引區(qū)分。

#p#

InnoDB索引實(shí)現(xiàn)

雖然InnoDB也使用B+Tree作為索引結(jié)構(gòu),但具體實(shí)現(xiàn)方式卻與MyISAM截然不同。

第一個(gè)重大區(qū)別是InnoDB的數(shù)據(jù)文件本身就是索引文件。從上文知道,MyISAM索引文件和數(shù)據(jù)文件是分離的,索引文件僅保存數(shù)據(jù)記錄的地址。而在InnoDB中,表數(shù)據(jù)文件本身就是按B+Tree組織的一個(gè)索引結(jié)構(gòu),這棵樹的葉節(jié)點(diǎn)data域保存了完整的數(shù)據(jù)記錄。這個(gè)索引的key是數(shù)據(jù)表的主鍵,因此InnoDB表數(shù)據(jù)文件本身就是主索引。

圖10

圖10是InnoDB主索引(同時(shí)也是數(shù)據(jù)文件)的示意圖,可以看到葉節(jié)點(diǎn)包含了完整的數(shù)據(jù)記錄。這種索引叫做聚集索引。因?yàn)镮nnoDB的數(shù)據(jù)文件本身要按主鍵聚集,所以InnoDB要求表必須有主鍵(MyISAM可以沒有),如果沒有顯式指定,則MySQL系統(tǒng)會(huì)自動(dòng)選擇一個(gè)可以唯一標(biāo)識(shí)數(shù)據(jù)記錄的列作為主鍵,如果不存在這種列,則MySQL自動(dòng)為InnoDB表生成一個(gè)隱含字段作為主鍵,這個(gè)字段長(zhǎng)度為6個(gè)字節(jié),類型為長(zhǎng)整形。

第二個(gè)與MyISAM索引的不同是InnoDB的輔助索引data域存儲(chǔ)相應(yīng)記錄主鍵的值而不是地址。換句話說,InnoDB的所有輔助索引都引用主鍵作為data域。例如,圖11為定義在Col3上的一個(gè)輔助索引:

圖11

這里以英文字符的ASCII碼作為比較準(zhǔn)則。聚集索引這種實(shí)現(xiàn)方式使得按主鍵的搜索十分高效,但是輔助索引搜索需要檢索兩遍索引:首先檢索輔助索引獲得主鍵,然后用主鍵到主索引中檢索獲得記錄。

了解不同存儲(chǔ)引擎的索引實(shí)現(xiàn)方式對(duì)于正確使用和優(yōu)化索引都非常有幫助,例如知道了InnoDB的索引實(shí)現(xiàn)后,就很容易明白為什么不建議使用過長(zhǎng)的字段作為主鍵,因?yàn)樗休o助索引都引用主索引,過長(zhǎng)的主索引會(huì)令輔助索引變得過大。再例如,用非單調(diào)的字段作為主鍵在InnoDB中不是個(gè)好主意,因?yàn)? InnoDB數(shù)據(jù)文件本身是一顆B+Tree,非單調(diào)的主鍵會(huì)造成在插入新記錄時(shí)數(shù)據(jù)文件為了維持B+Tree的特性而頻繁的分裂調(diào)整,十分低效,而使用自增字段作為主鍵則是一個(gè)很好的選擇。

下一章將具體討論這些與索引有關(guān)的優(yōu)化策略。

原文鏈接:http://www.cnblogs.com/leoo2sk/archive/2011/07/10/mysql-index.html

【編輯推薦】

  1. MySQL中創(chuàng)建及優(yōu)化索引組織結(jié)構(gòu)的思路
  2. 微博 請(qǐng)問你是怎么優(yōu)化數(shù)據(jù)庫的?
  3. MySQL技巧:結(jié)合相關(guān)參數(shù) 做好Limit優(yōu)化
  4. MySQL數(shù)據(jù)庫的優(yōu)化(下)MySQL數(shù)據(jù)庫的高可用架構(gòu)方案
  5. MySQL數(shù)據(jù)庫的優(yōu)化(上)單機(jī)MySQL數(shù)據(jù)庫的優(yōu)化
責(zé)任編輯:艾婧 來源: EricZhang's Technology Blog
相關(guān)推薦

2011-07-11 13:11:54

MySQL索引數(shù)據(jù)結(jié)構(gòu)

2011-07-11 16:05:42

MySQL索引

2021-10-12 07:58:10

MySQL索引數(shù)據(jù)

2023-04-12 16:45:07

MySQL索引數(shù)據(jù)結(jié)構(gòu)

2011-07-11 15:28:19

MySQL索引優(yōu)化

2017-05-11 11:59:12

MySQL數(shù)據(jù)結(jié)構(gòu)算法原理

2023-12-28 10:54:58

MySQL記錄存儲(chǔ)

2023-04-28 08:53:09

2021-09-12 17:31:17

Python數(shù)據(jù)結(jié)構(gòu)

2015-10-30 15:55:43

MySQL

2018-01-18 16:10:42

數(shù)據(jù)庫MySQLOracle

2011-05-30 10:36:49

MySQL

2023-09-25 12:23:18

Python

2011-10-13 09:44:49

MySQL

2014-04-04 11:14:18

JavaScriptStack遞歸

2021-12-10 11:27:59

數(shù)據(jù)結(jié)構(gòu)算法單調(diào)遞增的數(shù)字

2020-12-31 05:31:01

數(shù)據(jù)結(jié)構(gòu)算法

2020-10-12 11:48:31

算法與數(shù)據(jù)結(jié)構(gòu)

2015-04-21 13:09:01

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

2020-10-30 09:56:59

Trie樹之美
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 亚洲国产中文字幕 | 日韩久久久久久久 | 伊人久久精品一区二区三区 | 九九久久精品 | 伊人国产精品 | 性一交一乱一透一a级 | 中文字幕在线免费观看 | 成人午夜免费视频 | 亚洲一区二区三区在线免费观看 | www.se91| 亚洲在线一区 | 在线一区| 欧美精品二区 | 久草影视在线 | 精品欧美久久 | 伊人久久大香线 | 国产高清免费视频 | 午夜爽爽爽男女免费观看影院 | 人人干在线| 国产成人综合在线 | 国产一区二区三区四区 | 999久久久久久久久6666 | 精品久久久久久久久久久久久久久久久 | 四虎影院在线免费观看 | 熟女毛片 | 国产激情视频在线观看 | 国产91亚洲精品 | 国产精品亚洲一区二区三区在线观看 | 翔田千里一区二区 | 日日操日日干 | 一区二区三区视频在线 | 九九久久99 | 午夜久久久久久久久久一区二区 | 最新中文字幕在线 | 欧美电影大全 | 麻豆毛片| www.国产一区 | 一区二区三区免费 | 成人在线免费电影 | 国产成在线观看免费视频 | v亚洲 |