1、 mysql查詢緩存mysql
查詢緩存不是mysql的子系統,倒是查詢優化和執行子系統不可缺乏的組成部分。它不只能夠緩存查詢結果,還能夠緩存查詢結果自己。若是某個查詢的結果就在緩存裏, 系統就能夠直接取出那些數據返回給客戶端而跳過整個查詢優化和執行階段;這對那些使用頻繁的查詢來講效果尤爲顯著。這技術是mysql獨有的,其餘數據庫只緩存查詢,不緩存查詢結果。查詢緩存還必須可以處理查詢結果變「髒」的狀況,即數據在上次查詢後發生了一些變化,以及及時不時地對被緩存的查詢進行清理。程序員
查詢緩存是默認打開的,若你想關閉查詢緩存功能,可使用SQL_NO_CACHE SELECT(相對應的SQL_CACHE SELECT) 選項:SELECT SQL_NO_CACHE id,lname from myCustomer;。sql
2、 緩存與緩衝區數據庫
緩存和緩衝區子系統負責保證使用頻率最高的數據(或結構)可以以最有效的方式被訪問。換句話說,使用頻率最高的數據必須隨時駐留在內存裏待用。緩存
2.1 表緩存服務器
表緩存(table cache)是爲了最大限度的打開、讀取和關閉表(磁盤上的.FRM文件)的開銷而建立的。所以,表緩存的主要用途就是把關於表的元數據保存在內存裏。這能夠大大加快有關線程讀取表結構信息的速度而無需每次都打開文件。每一個線程都有它本身的表緩存結構表,於是能夠獨立於其餘線程對錶進行訪問,即便某個線程改變了某個表的模式(但尚未提交那些修改),另外一個線程能夠繼續按照原來的模式使用該表。這種結構是一個封裝表的全部元數據信息的簡單結構,這些結構在內存裏以鏈表的形式存放並與各線程相關。併發
2.2 記錄緩存分佈式
記錄緩存(record cache)是爲了加快存儲引擎的順序讀性能而建立的。所以,記錄緩存一般只用在表掃描期間。它就像是一個預讀緩衝區,每次檢索一個數據塊,從而減小掃描期間的磁盤訪問次數。通常來講,磁盤訪問次數越少,就意味着性能越高。有意思的是,mysql在順序寫數據的時候也要用到記錄緩存:先把新數據(或修改後的數據)寫入記錄緩存,等它寫滿時再把所有數據寫到磁盤上。這樣一來,寫性能也獲得了改善。由於記錄緩存能夠打幅度提升順序讀/寫(稱爲引用的局域性)的性能,因此它最常常與MyISAM存儲引擎(但並不是侷限於此)配合使用。記錄緩存是以一種不可知的方式實現的,與用來訪問存儲引擎API的代碼互不干擾。由於記錄緩存是在API各層的內部實現的,因此程序員無需採用任何額外步驟就能夠享受到記錄緩存的好處。模塊化
2.3 鍵緩存佈局
鍵緩存(key cache)其實就是一個用來緩存索引數據的緩衝區,其內存是一個來自索引文件(B+樹)的數據塊;只有MyISAM表(磁盤上的.MYI)才使用鍵緩存。索引自己被封裝在鍵緩存結構裏,這些結構在內存裏被存儲爲一個鏈表。在第一次打開一個MyISAM表時,系統會爲它建立一個鍵緩存。那麼,系統又是如何知道哪些索引塊被使用過了呢?
緩存有它本身的監控機制,該機制隨時記錄各索引塊的使用頻率。鍵緩存用來記錄各索引塊的「熱度」。在此,熱度指索引塊被使用了多少次。當某個索引塊變「冷」,另外一個索引塊變「熱」時,後者就被讀入鍵緩存而取代前者。這種作法實際上是一種「最近最少使用」(LRU)頁面交換策略。當一個「髒」索引塊被交換出內存時,它的數據被寫入磁盤上的索引文件。若被清理的是一個「乾淨」的索引塊,只要從內存裏刪除就完事了。
2.4 權限緩存
權限緩存(privilege cache)用來存放用戶賬戶的受權數據。權限緩存裏的數據是在用戶登陸上機和初始化期間從各有關權限表裏讀出並集中到權限緩存裏的。
2.5 主機名緩存
主機名緩存(hostname cache)是另一種輔助性的緩存機制,與權限緩存很相似。它也被實現爲一種以結構爲元素的棧。這個緩存的內容是與服務器相鏈接的全部主機名
2.6 其餘緩存機制
Mysql的源代碼裏還有許多隨處可見的小緩存機制,用在複雜的聯結操做裏的聯結緩衝區就是其中一個例子。Eg:有些聯結操做須要把第一個表的一條記錄與第二個表裏的全部記錄進行比較。在這類場合,用一個緩存來存儲那些記錄能夠大大加快聯結操做的速度而無需反覆屢次的把第二個表的記錄讀入內存。
3、 經過插件式存儲引擎訪問文件
插件式存儲引擎使得mysql系統能夠靈活地適應各類數據或文件的存儲和檢索機制。主要有:MyISAM,InnoDB,NDB,Archive,Federated,Memory,Merge,Partner,Community,Custom等。
插件式存儲引擎使得數據庫專家能夠根據具體應用程序的須要爲他們的數據庫選擇一種性能最佳的存儲引擎,好比說:爲用於事務處理的數據庫選用具有各事務控制能力的存儲引擎,爲讀取頻繁但不多被修改的表(例如字典表)選用內存存儲引擎等。
插件式存儲引擎最吸引人的地方是容許你在一個給定的數據庫爲每一個表指定一個不一樣的存儲引擎,你甚至能夠在建立一個表以後改變他的存儲引擎。這種靈活性和模塊化使得數據庫的實現者能夠隨時根據須要建立新的存儲引擎。好比下面這條命令能夠用來改變某個表的存儲引擎:
ALTER TABLE MyTable
ENGINE = InnoDB;
也能夠經過修改服務器配置變量STORAGE_ENGINE的辦法來改變mysql的默認存儲引擎。
3.1 MyISAM
MyISAM存儲引擎是mysql的默認文件訪問機制,在建立時沒有在CREATE語句裏明確設置ENGINE選項的全部表都將使用這種存儲引擎。此外,MyISAM還爲併發操做準備了表級的鎖定機制:當某個進程對某個表進行更新操做時,在這個操做完成以前,其餘進程將不能訪問該表裏的任何數據。MyISAM的優勢是可靠性高、適用範圍廣、數據檢索速度快。在強調數據檢索速度(讀性能)的場合,MyISAM是首選的存儲引擎。
ISAM的最大優勢是索引很是小,絕大多數ISAM表的索引能夠所有放在內存的索引緩存區裏,因此搜索起來很是快。
3.2 InnoDB
InnoDB 幾乎老是用在須要支持事務處理的應用裏。InnoDB支持傳統的ACID(原子性、一致性、隔離性、耐久性)事務處理原則和外鍵約束機制。InnoDB全部索引都採用B-樹結構——把索引放在葉結點裏。InnoDB改進了MyISAM的併發控制,能夠提供行級的鎖定。在強調可靠性和支持事務處理的場合,InnoDB是首席的存儲引擎。
3.3 BDB
BDB存儲引擎被認爲是InnoDB的更新換代產品,支持事務以及COMMIT和ROLLBACK等額外的事務功能。BDB支持散列表、B-樹、簡單的基於記錄編號的存儲機制和永久查詢。可是在不久的未來,BDB也許會成爲不被支持的存儲引擎(不明白?)。
3.4 內存
內存存儲引擎(memory storage engine)(有時被稱爲HEAP表)是一種駐留在內存的表,它使用了一種散列機制來加快經常使用數據的檢索速度這種表比存儲在磁盤上的錶快不少。他們在使用上與其餘存儲引擎沒有什麼不一樣,只不過數據是存儲在內存裏並只在mysql會話期間有效而已。在系統關機(或崩潰)時,HEAP表裏的數據將丟失。內存存儲引擎特別適合用來存儲那些訪問頻繁但不多須要修改的靜態數據,好比郵政編碼、國家、地區、產品目錄之類的字典表等。HEAP表還能夠用在那些利用快照技術提供分佈式或歷史數據訪問服務的數據庫。
3.5 合併
合併存儲引擎(merge storage engine)是用一種有着相同結構(元組佈局或模式)的MyISAM表創建的,其效果是那些表能夠被看成一個單個大表來使用。那些表按照他們各自的位置來區分。並不須要使用額外的分區機制。全部的表必須駐留在同一臺機器上(經過同一個服務器訪問)。用戶只須要使用單個操所或SELECT、UPDATE、INSERT和DELETE等語句就能夠訪問到那些表裏的所有數據。幸虧,對合並表發出的DROP命令只解除那些表的合併關係,並不會改變那些最初的表。
這種表類型的最大優勢是速度。利用合併存儲引擎,能夠把一個大表分紅幾個較小的表並保存在不一樣的磁盤上,在經過一些合併表規則把他們合併起來以便同時對他們進行訪問。但合併存儲引擎有下面幾個缺點:
A、 合併存儲引擎的範圍限制在了MyISAM表上。
B、 不容許進行替換操做
C、 與一個普通的表相比,使用索引去訪問一個合併表的效率要低一些
合併存儲機制適合用在特大型數據庫應用裏,好比一個由於數據量太大而須要把數據分散到多個表、甚至是多個數據庫裏去的數據倉庫。
3.6 檔案
檔案存儲引擎(archive storage engine)是一種把大量數據保存爲某種壓縮格式的機制。檔案存儲機制最適合用來存放和檢索那些不須要頻繁訪問的檔案性或歷史積累性的數據。
檔案存儲引擎沒有提供任何索引機制,惟一的訪問辦法是掃描整個表。所以,檔案存儲引擎不適合用於平常的數據庫存儲和檢索操做。
3.7 聯合
聯合存儲引擎(fedreted storage engine)是一種用來從多個數據庫系統建立一個表的機制。聯合存儲引擎的工做狀況與合併存儲引擎很類似,但他還容許你把來自多個數據庫服務器的數據(表)連接在一塊兒。這個機制的主要用途也正是把來自其餘數據庫系統的表連接起來。聯合存儲引擎最適合用在分佈式環境或數據倉庫環境裏。
聯合存儲引擎最吸引人的地方是它不移動數據,也不要求遠程的表是同一種存儲引擎,聯合存儲引擎會在存儲和檢索有關數據的過程當中自動完成必要的轉換。這充分體現了插件式存儲引擎層的強大威力。
3.8 羣集/NDB
羣集存儲引擎(cluster storage engine)(在須要與集簇產品相區別的場合稱爲NDB)爲mysql提供了集羣服務器的能力。羣集存儲引擎的基本用途是在一個高可用和高性能的環境裏集中使用多個mysql服務器提供數據庫服務。羣集存儲引擎不存儲任何數據,具體的數據存儲和檢索操做由羣集裏的各有關數據庫所使用的存儲引擎負責執行,羣集存儲引擎只負責控制如何把數據分佈到羣集簇中的哥哥數據庫以提供冗餘和改善性能。NDB存儲引擎還提供了一個API供人們建立可擴展的羣集解決方案。
3.9 csv
Csv存儲引擎用來建立和讀寫csv格式的表文件。Csv存儲引擎不須要把數據複製爲另外一種格式,csv表的元數據將他的文件名一塊兒直接保存在服務器上的數據庫文件夾裏。Csv存儲引擎可讓數據庫用戶快速方便的使用由電子表格軟件生成的結構化商務數據。Csv存儲引擎沒有提供任何索引機制。
3.10 黑洞
黑洞存儲引擎(blackhole storage engine)容許系統寫數據,但並不把寫入的數據真正保存起來。不過,若激活了二進制日誌功能,有關的sql語句將被記載到日誌裏。在只想測試一下某個應用以確保它是在寫數據,而不是想把那些數據真正保存起來的場合,這種存儲引擎很是方便。
3.11 定製
定製存儲引擎(custom storage engine)是你爲改進數據庫服務器而自行建立的任何一種存儲引擎。好比說,你想建立一個存儲引擎來讀取XML文件。