MySQL引擎筆記

2021-09-12 15:08:54 字數 2077 閱讀 7751

mysql中所有的表結構、表資料和索引在伺服器上都是以檔案的形式存放在磁碟中,每個資料庫都對應了乙個資料夾,資料庫中的表存放在對應的資料夾中.

使用b+樹作為索引結構

檔案儲存:以3個檔案儲存在磁碟上,資料檔案與索引檔案分開存放..frm:表結構檔案;.myd (mydata):資料檔案;myi (myindex):索引檔案

主索引:葉子節點key存放的是主鍵的值,資料部分存放的是資料記錄的位址.

輔助索引:結構與主索引一樣的,資料部分存放的是資料記錄的位址,key存放的是輔助索引對應列的值.不同點在於主索引key不能重複,而輔助索引key可以重複.

檢索流程:根據b+樹搜尋演算法搜尋索引,查到指定的key,取出對應的資料域存放的位址,根據獲得的資料位址在資料檔案中讀取相應的記錄.

使用b+樹作為索引結構

檔案儲存:以2個檔案存放在磁碟上,資料與索引存放在乙個檔案中..frm:表結構檔案;.ibd:資料與索引檔案.

聚集索引:主索引檔案中包含了完整的資料記錄.這種聚集索引可以使按主鍵搜尋變得非常高效,但是使用輔助索引搜尋時檢索兩遍索引,先檢索輔助索引得到主鍵,然後通過主鍵在主鍵索引中獲得記錄.

主鍵索引:葉子節點key存放的是主鍵的值,資料部分存放的是完整的資料記錄.

由於innodb中的資料是按主鍵索引聚集在一起的,所以innodb中的表必須要有主鍵,如果沒有顯式指定主鍵的話,mysql系統會自動選擇乙個可以唯一標識資料記錄的列作為主鍵,如果不存在這種列,則mysql自動為innodb表生成乙個隱含字段作為主鍵,這個字段長度為6個位元組,型別為長整形。

輔助索引:innodb中所有的輔助索引都是引用主鍵來作為資料域.使用輔助索引時,每次都需要先通過輔助索引查詢到相應的主鍵,然後通過主索引取出資料記錄.

優化索引:

為什麼不建議使用過長的字段作為主鍵?

因為所有輔助索引都引用主索引,過長的主索引會令輔助索引變得過大

為什麼不建議使用用非自增的字段作為主鍵?例如字串

因為innodb資料是使用b+tree結構存放的,非自增的主鍵會造成在插入新記錄時資料檔案為了維持b+tree的特性而頻繁的**調整,效能低下.而且在資料檢索時經常會使用到< 、<=、>、>=之類的範圍搜尋,使用字串比較效率低.因此建議使用自增整型字段作為主鍵.

最左字首匹配原則,非常重要的原則,mysql會一直向右匹配直到遇到範圍查詢(>、a = 1 and b = 2 and c > 3 and d = 4如果建立(a,b,c,d)順序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引則都可以用到,a,b,d的順序可以任意調整。

=和in可以亂序,比如a = 1 and b = 2 and c = 3建立(a,b,c)索引可以任意順序,mysql的查詢優化器會幫你優化成索引可以識別的形式。

盡量選擇區分度高的列作為索引,區分度的公式是count(distinct col)/count(*),表示欄位不重複的比例,比例越大我們掃瞄的記錄數越少,唯一鍵的區分度是1,而一些狀態、性別字段可能在大資料面前區分度就是0,一般需要join的字段我們都要求是0.1以上,即平均1條掃瞄10條記錄。

索引列不能參與計算,保持列「乾淨」,比如from_unixtime(create_time) = '2014-05-29'就不能使用到索引,原因很簡單,b+樹中存的都是資料表中的字段值,但進行檢索時,需要把所有元素都應用函式才能比較,顯然成本太大。所以語句應該寫成create_time = unix_timestamp('2014-05-29')

盡量的擴充套件索引,不要新建索引。比如表中已經有a的索引,現在要加(a,b)的索引,那麼只需要修改原來的索引即可。

MySql筆記 主要儲存引擎

主要儲存引擎特性對比,最常使用的2種儲存引擎 myisam,舊版本預設儲存引擎 mysql5.5.5 資料檔案和索引檔案可以放置在不同的目錄,平均分布io,獲得更快的速度。innodb是新版本mysql的預設儲存引擎 mysql5.5.5 常用儲存引擎的適用環境 myisam web 資料倉儲 in...

mysql架構引擎 MySQL引擎

一般來說,mysql有以下幾種引擎 isam myisam heap innodb和berkley 資料庫 一般來說,mysql有以下幾種引擎 isam myisam heap innodb和berkley bdb 注意 不同的版本支援的引擎是有差異的。當然啦,如果你感覺自己的確技術高超,你還能夠使...

MySQL讀書筆記 儲存引擎

通過engine欄位可以看出mysql.user表,是乙個myisam表,表中一些字段含義 mysql從2007年開始提供了外掛程式式的儲存引擎api,從此湧出了一系列為不同目的而設計的儲存引擎。percona的xtradb儲存引擎是基於innodb引擎的乙個改進版本,已經包含在percona se...