1、關系型數據庫和非關系型數據庫
當前數據庫分為關系型數據庫和非關系型數據庫。這部分主要是參考
1.1 關系型數據庫
1.1.1 關系型數據庫的概念
關系型數據庫是指采用了關系模型來組織數據的數據庫。關系模型指的就是二維表格模型,而一個關系型數據庫就是由二維表及其之間的練習所組成的一個數據組織。
| 關系模型中常用的概念 | |
|---|---|
| 關系 | 一張二維表,每個關系都具有一個關系名,也就是表名 |
| 元組 | 二維表中的一行,在數據庫中被稱為記錄 |
| 屬性 | 二維表中的一列,在數據庫中被稱為字段 |
| 域 | 屬性的取值范圍,也就是數據庫中某一列的取值限制 |
| 關鍵字 | 一組可以唯一標識元組的屬性,數據庫中常稱為主鍵,由一個或多個列組成 |
| 關系模式 | 指對關系的描述。其格式為:關系名(屬性1,屬性2,……,屬性N),在數據庫中成為表結構 |
1.1.2 關系型數據庫存在的優點
-
容易理解:二維表結構是非常貼近邏輯世界的一個概念,關系模型相對網狀、層次等其他模型來說更容易理解。
-
使用方便:通用的
SQL語言使得操作關系型數據庫非常方便。 -
易於維護:豐富的完整性(實體完整性、參照完整性和用戶定義的完整性)大大減低了數據冗余和數據不一致的概率。
-
支持
SQL,可用於復雜的查詢。
1.1.3 關系型數據庫存在的問題
-
網站的用戶並發性非常高,往往達到每秒上萬次讀寫請求,對於傳統關系型數據庫來說,硬盤I/O是一個很大的瓶頸。
-
網站每天產生的數據量是巨大的,對於關系型數據庫,在一張包含海量數據的表中查詢,效率是非常低的。
-
在基於web的結構當中,數據庫是最難進行橫向拓展的,當一個應用系統的用戶量和訪問量與日俱增的時候,數據庫卻沒有辦法像
web server和app server那樣簡單的通過添加更多的硬件和服務節點來拓展性能和負載能力。當需要對數據庫系統進行升級和拓展時,往往需要停機維護和數據遷移。 -
性能欠佳:在關系型數據庫中,導致性能欠佳最主要的原因是多表的關聯查詢,以及復雜的數據分析類型的復雜
SQL報表查詢。為了保證數據庫的ACID特性,必須盡量按照其要求的范式進行涉及,關系型數據庫中的表都是存儲一個格式化的數據結構。
數據庫事務必須具備ACID特性,ACID分別是Atomic原子性,Consistency一致性,Isolation隔離性,Durability持久性。
數據庫的持久存儲,尤其是海量數據的持久存儲,還是需要一種關系數據庫。
1.1.4 當前比較主流的關系型數據庫
1.2 非關系型數據庫
1.2.1 非關系型數據庫的概念
非關系型數據庫是指非關系型的,分布式的,且一般不保證遵循ACID原則的數據存儲系統。
非關系型數據庫以鍵值對存儲,且結構不固定,每一個元組可以有不一樣的字段,每個元組可以根據需要增加一些自己的鍵值對,不局限於固定的結構,可以減少一些時間和空間的開銷。
非關系型數據庫嚴格上不是一種數據庫,應該是一種數據結構化存儲方法的集合。
1.2.2 非關系型數據庫的優點
-
無需經過sql層的解析,讀寫性能很高;
-
基於鍵值對,數據沒有耦合性,容易拓展。
-
存儲數據的格式:
nosql的存儲格式是key,value形式、文檔形式、圖片形式等等,而關系型數據庫則只支持基礎數據類型。
1.2.3 非關系型數據庫存在的問題
-
不提供sql支持,學習和使用成本較高
-
無事務處理,附加功能bi和報表等支持也不好。
1.2.4 非關系型數據庫的分類
非關系型數據庫都是針對某些特定的應用需求出現的,因此,對於該類應用,具有極高的性能。依據結構化方法以及應用場合的不同,主要分為以下幾類。
面向高性能並發讀寫的key-value數據庫
key-value數據庫的主要特點是具有極高的並發讀寫性能。
key-value數據庫是一種以鍵值對存儲數據的一種數據庫,類似於MAP的結構。可以將整個數據庫理解為一個大的MAP,每個鍵都會對應一個唯一的值。
包括:
面向海量數據訪問的面向文檔數據庫
這類數據庫的主要特點是在海量的數據中可以快速的查詢數據。
文檔存儲通常使用內部表示法,可以直接在應用程序中處理,主要是JSON。JSON文檔也可以作為純文本存儲在鍵值存儲或關系數據庫系統中。
包括
面向搜索數據內容的搜索引擎
搜索引擎是專門用於搜索數據內容的NoSQL數據庫管理系統。
主要是用於對海量數據進行實時的處理和分析處理,可用於機器學習和數據挖掘。
包括
面向可拓展性的分布式數據庫
這類數據庫的主要特點是具有很強的可拓展性。
普通的關系型數據庫都是以行為單位來存儲數據的,擅長以行為單位的讀入處理,比如特定條件數據的獲取。因此,關系型數據庫也被稱為面向行的數據庫。相反,面向列的數據庫是以列為單位來存儲數據的,擅長以列為單位讀入數據。
這類數據庫想解決的問題就是傳統數據庫在可拓展性上的缺陷,這類數據庫可以適應數據量的增加以及數據結構的變化,將數據存儲在記錄中,能夠容納大量動態列。由於列名和記錄鍵不是固定的,並且由於記錄可能有數十億列,因此可拓展性存儲可以看做是二維鍵值存儲。
包括
1.3 事務機制ACID和 CAP理論
事務機制ACID和CAP理論是數據管理與分布式系統的兩個重要的概念。
1.3.1 事務機制ACID
事務的定義和實現一直隨着數據管理的發展在演進,當計算機越來越強大,它們就能夠被用來管理越來越多數據,最終,多個用戶可以在一台計算機上共享數據,這就導致了一個問題,當一個用戶修改了數據而另外一個還在使用舊數據進行計算過程中,這里就需要一些機制來保證這種情況不會發生。
ACID規則原來是在1970倍Jim Gray定義,ACID事務解決了很多問題,但是仍然需要和性能做平衡協調,事務越強,性能可能越低,安全可靠性和高性能是一對矛盾。
一個事務是指對數據庫狀態進行改變的一系列操作編程一個單個序列邏輯元操作,數據庫一般在啟動時會提供事務機制,包括事務啟動、停止、取消或回滾。
但是上述事務機制並不真的實現“事務”,一個真正事務應該遵循ACID屬性,ACID事務才真正解決事務,包括並發用戶訪問同一個數據表記錄的頭疼問題。
ACID的定義為:
-
Atomic原子性:一個事務的所有系列操作步驟被看成是一個動作,所有的步驟要么全部完成要么一個也不會完成,如果事務過程中任何一點失敗,將要被改變的數據庫記錄就不會真正被改變。
-
Consistent一致性:數據庫的約束、級聯和觸發機制Trigger都必須滿足事務的一致性。也就是說,通過各種途徑包括外鍵約束等任何寫入數據庫的數據都是有效的,不能發生表與表之間存在外檢約束,但是有數據卻違背這種約束性的情況。所有改變數據庫數據的動作事務必須完成,沒有事務會創建一個無效數據狀態,這是不同於CAP理論的一致性"consistency"的。
-
Isolated隔離性:主要用於實現並發控制。隔離能夠確保並發執行的事務能夠順序一個接一個執行,通過隔離,一個未完成事務不會影響另外一個未完成事務。
-
Durable持久性:一旦一個事務被提交,它應該持久保存,不會因為和其他操作沖突而取消這個事務。很多人認為這意味着事務是持久在磁盤上,但是規范沒有特別定義這點。
1.3.2 CAP理論
CAP理論是分布式系統中進行平衡的理論,它由Eric Brewer發布在2000年。
-
Consistency一致性:同樣數據在分布式系統中所有地方都是被復制成相同的。
-
Available可用性:所有在分布式系統活躍的節點都能夠處理操作且能響應查詢。
-
Partition Tolerant分區容錯性:在兩個復制系統之間,如果發生了計划之外的網絡連接問題,譬如說某節點或者網絡分區故障時,有一種容錯性涉及來保證仍然能夠對外提供滿足一致性和可用性的服務。
一般情況下,CAP理論認為你不能同時擁有上述三種,只能同時選擇兩種,這是一個實踐總結。當有網絡分區情況下,也就是分布系統中,其基本需求就是支持分布式存儲,嚴格一致性和可用性需要互相取舍。
1.3.3 CAP和ACID一致性區別
ACID一致性是有關數據庫規則,如果數據表結構定義一個字段值是唯一的,那么一致性系統將會解決所有操作中導致這個字段值非唯一性的情況,如果帶有一個外鍵的一行記錄被刪除,那么其外鍵相關記錄也應該被刪除,這就是ACID一致性意思。
CAP理論的一致性是保證同樣一個數據在所有不同服務器上的拷貝都是相同的,這是一種邏輯保證,而不是物理,因為光速限制,在不同服務器上這種復制是需要時間的,集群通過阻止客戶端查看不同節點上還未同步的數據維持邏輯視圖。
當跨分布式系統提供ACID時,這兩個概念會混淆在一起。
1.4 關系型與非關系型數據庫的比較
-
成本:非關系型數據庫簡單部署,基本都是開源軟件,不需要像使用Oracle那樣花費大量成本購買使用,相比關系型數據庫價格便宜。
-
查詢速度:非關系型數據庫將數據存儲於緩存之中,而且不需要經過SQL層的解析,關系型數據庫將數據存儲在硬盤中,自然查詢速度遠不及非關系型數據。
-
存儲數據的格式:非關系型數據庫的存儲格式是key,value形式、文檔形式、圖片形式等等,所以可以存儲基礎類型以及對象或者是集合等各種格式,而數據庫則只支持基礎類型。
-
拓展性:關系型數據庫有類似join這樣的多表查詢機制的限制導致拓展很艱難。非關系型數據庫基於鍵值對,數據之間沒有耦合性,所以非常容易水平拓展。
-
持久存儲:非關系型數據庫不適用於持久存儲,海量數據的持久存儲,還是需要關系型數據庫。
-
數據一致性:非關系型數據庫一般強調的是數據最終一致性,不像關系型數據庫一樣強調數據的強一致性,從非關系型數據庫中讀到的有可能還是處於一個中間態的數據。
最近的數據庫排名:https://db-engines.com/en/ranking

2、經典數據庫簡單了解
2.1 Oralce
Oracle Database,又名Oracle RDBMS,簡稱Oracle。Oracle數據庫系統是美國Oracle(甲骨文)公司提供的以分布式數據庫為核心的一組軟件產品,是目前最流行的B/S體系結構的數據庫之一。
2.1.1 數據庫和實例
Oracle數據庫服務器由一個數據庫和至少一個數據庫實例組成。數據庫是一組存儲數據的文件,而數據庫實例則是管理數據庫文件的內存結構。此外,數據庫是由后台進程組成。數據庫和實例是緊密相連的,所以一般說的Oralce數據庫,通常指的就是實例和數據庫。
在這種體系機構中,Oracle數據庫服務器包括兩個主要部分:文件(Oracle數據庫)和內存(Oracle實例)。

2.1.2 Oracle數據庫
Oracle數據庫的一個基本任務就是存儲數據,其主要概念包含Oracle數據庫的物理和邏輯存儲結構。
物理存儲結構是存儲數據的純文件,當執行一個create database語句來創建一個新的數據庫時,將創建下列文件:
-
數據文件(dbf):數據文件是數據庫的物理存儲單位,包含真實數據,邏輯數據庫結構(如表和索引)的數據被物理存儲在數據文件中。
-
控制文件(ctl):每個Oracle數據庫都有一個包含元數據的控制文件。元數據用來描述包括數據庫名稱和數據文件位置的數據庫物理結構。
-
聯機重做日志文件(log):每個Oracle數據庫都有一個聯機重做日志,里面包含兩個或者多個聯機重做文件。聯機重做日志由重做條目組成,能夠記錄下所有對數據所做的更改。
除這些文件外,Oracle 數據庫還包括如參數文件(ora)、網絡文件、備份文件以及用於備份和恢復的歸檔重做日志文件等重要文件。
而Oracle數據庫使用邏輯存儲結構對磁盤空間使用情況進行精細控制。
-
數據塊(Data blocks):Oracle將數據存儲在數據塊中。數據塊也稱為邏輯塊,Oracle塊或頁,對應於磁盤上的字節數。
-
范圍(Extents):范圍是用於存儲特定類型信息的邏輯連續數據塊的具體數據量。
-
段(Segments):段是分配用於存儲用戶對象(例如表或索引)的一組范圍。
-
表空間(Tablespaces):表空間是段的邏輯容器,Oracle對物理數據庫上相關數據文件(ORA或者DBF文件)的邏輯映射。每個數據庫至少有一個表空間(稱之為system表空間)。

2.1.3 Oracle實例
Oracle實例是客戶端應用程序(用戶)和數據庫之間的接口。Oracle實例由三個主要部分組成:系統全局區(SGA),程序全局區(PGA)和后台進程。

更加具體的信息可以看:
2.2 MySQL
MySQL目前屬於Oracle公司,是一個免費開源的關系型數據庫管理系統,但也不意味着該數據庫是完全免費的,其包含兩個版本MySQL Community Server(社區版)和MySQL Enterprise Server(企業版),其中企業版是收費且不能下載的,但是企業版擁有官方的電話技術支持。
MySQL適合中小型軟件,被個人用戶以及中小企業青睞。
MySQL的命名機制如mysql-5.7.20,其中后面三個數字分別為:主版本號,發行級別和此發行系列的版本號。現在,MySQL 5.7是最新開發的穩定(GA)發布系列。
MySQL的特點與優勢有如下幾點:
-
MySQL是開放源代碼的數據庫:開源,並不僅僅意味着免費,而且源代碼開放,任何人都可以下載其源碼進行個性化的優化更改。
-
MySQL的跨平台性:MySQL不僅可以在Windows系列操作系統上運行,還可以在Unix、Linux和Mac OS等操作系統上運行。對比與微軟公司的SQL Server數據庫來說,這是MySQL的一個很大的優勢。
-
價格優勢:MySQL數據庫是一個自由軟件,任何人都可以從MySQL的官方網站上下載該軟件。
-
功能強大且使用方便:MySQL是一個真正的多用戶、多線程SQL數據庫服務器。它能夠快速、有效和安全地處理大量的數據。相對於Oracle等數據庫來說,MySQL的使用時非常簡單的。MySQL主要目標是快速、健壯和易用。
MySQL與常用的駐留數據庫Oracle、SQL Server相比,主要特點就是免費,並且在任何平台上都能使用,占用的空間相對較小。但是對於大型項目來說,MySQL的容量和安全性就略遜於Oracle數據庫。
更加具體的信息可以看:
2.3 Microsoft SQL Server
對比於Oracle和MySQL,微軟公司的SQL Server接觸的就更少了。
SQL Server是Microsoft公司推出的關系型數據庫管理系統。具有使用方便可伸縮性好與相關軟件繼承程度高等有點,可跨越從運行Microsoft Windows 98的膝上型電腦到運行Microsoft Windows 2012的大型處理器的服務器等多種平台使用。Microsoft SQL Server是一個全面的數據庫平台,使用繼承的商業智能(BI)工具提供了企業級的數據管理。Microsoft SQL Server數據庫引擎為關系型數據和結構化數據提供了更安全可靠的存儲功能,使您可以構建和管理用於業務的高可用和高性能的數據庫應用程序。
MySQL Server 2005的組件包含:數據庫引擎、Reporting Services、Analysis Services、Notification Services、Integration Services、全文搜索、復制、Service Broker。

具體信息在:
2.4 PostgreSQL
PostgreSQL是以加州大學伯克利分校計算機系開發的
PostgreSQL是最初的伯克利代碼的開源繼承者,它支持大部分SQL標准並且提供了許多現代特性:復雜查詢、外鍵、觸發器、可更新視圖、事務完整性、多版本並發控制。
同樣,PostgreSQL可以用許多方法拓展,比如,通過增加新的:數據類型、函數、操作符、聚集函數、索引方法、過程語言。
而且PostgreSQL是開源的,任何人都可以以任何目的免費試用、修改和分發PostgreSQL,不管是私用、商用還是學術研究目的。
PostgreSQL 10.1 手冊 在線手冊:
2.5 MongoDB
MongoDB是一個由C++語言編寫的基於分布式文件存儲的開源數據庫系統。在高負載的情況下,添加更多的節點,可以保證服務器性能。
MongoDB旨在為WEB應用提供可拓展的高性能數據存儲解決方案。
MongoDB將數據存儲為一個文檔,數據結構由鍵值(key=>value)對組成。MongoDB文檔類似於JSON對象。字段值可以包含其他文檔、數組及文檔數組。

更多:
2.6 Redis
Redis是完全開源的,遵守BSD協議,是一個高性能的key-value數據庫。
Redis包含以下特點:
-
Redis支持數據的持久化,可以將內存中的數據保存在磁盤中,重啟時可以再次加載使用。
-
Redis不僅僅支持簡單的key-value類型的數據,同樣還提供list、set、zset、hash等數據結構的存儲。
-
Redis支持數據的備份,即master-slave模式的數據備份。
更多:
3、數據庫引擎淺談
數據庫引擎時用於存儲、處理和保護數據的核心服務。利用數據庫引擎可控制訪問權限並快速處理事務,從而滿足企業內要求極高而且需要處理大量數據的應用需要。
沒有找到比較確切的說法,對數據庫引擎大概有兩種說法:查詢引擎和存儲引擎。(以下說法可能不夠准確,僅僅用於了解一下)。
3.1 SQL 引擎(查詢引擎)
參考
SQL引擎的內容涵蓋6個開源領導者:Hive、Impala、Spark SQL、Drill、HAWQ以及Presto,還加上Calcite、Kylin、Phoenix、Tajo和Trafodion。以及2個商業化選擇Orale Big Data SQL和IBM Big SQL,IBM尚未將后者更名為“Watson SQL”。
但是,這里僅僅了解Hive、Impala、Spark SQL。
3.1.1 背景介紹
不像關系型數據庫,SQL引擎獨立於數據存儲系統。關系型數據庫將查詢引擎和存儲引擎綁定到一個單獨的緊耦合系統中,這允許某些類型的優化。而SQL引擎的存在,拆分了它們,提供了更大的靈活性,同時也存在潛在的性能損失。
但是以SQL引擎來作為稱呼是有點隨意的,比如說,Hive不是一個引擎,它的框架使用MapReduce、TeZ或者Spark引擎去執行查詢,而且它並不運行SQL,而是HiveQL,一種類似SQL的語言,非常接近SQL。而統稱為"SQL-in-Hadoop"也不適用,雖然Hive和Impala主要使用Hadoop,但是Spark、Drill、HAWQ和Presto還可以和各種其他的數據存儲系統配合使用。
Hive、Impala、Spark SQL、Drill、HAWQ以及Presto這幾個開源SQL引擎中,雖然Impala、Spark SQL、Drill、HAWQ以及Presto一直在運行性能、並發量和吞吐量上擊敗Hive,但是Hive仍然是最流行的。
3.1.2 Apache Hive
Apache Hive是Hadoop生態系統中的第一個SQL框架。Facebook的工程師在2007年介紹了Hive,並在2008年將代碼捐贈給Apache軟件基金會。2010年9月,Hive畢業成為Apache頂級項目。Hadoop生態系統中的每個主要參與者都分布和支持Hive,包括Cloudera、MapR、Hortonworks和IBM。Amazon Web Services在Elastic MapReduce(EMR)中提供了Hive的修改版作為雲服務。
早期發布的Hive使用MapReduce運行查詢。復雜查詢需要多次傳遞數據,這會降低性能。所以Hive不適合交互式分析。由Hortonworks領導的Stinger明顯提高了Hive的性能,尤其是通過使用Apache Tez,衣蛾經典MapReduce代碼的應用框架。Tez和ORCfile,一種新的存儲格式,對Hive的查詢產生了明顯的提速。
Cloudera實驗室帶領了一個並行項目重新設計Hive的后端,使其運行在Apache Spark上。經過長期測試后,Cloudera在2016年初發布了Hive-on-Sprak的正式版本。
在2016年,Hive有100多人的貢獻者。該團隊在2月份發布了Hive 2.0,並在6月份發布了Hie 2.1。Hive 2.0的改進包括了對Hive-on-Spark的多個改進,以及性能、可用性、可支持性和穩定性增強。Hive 2.1包括了Hive LLAP(Live Long and Process),它結合持久化的查詢服務器和優化后的內存緩存,來實現高性能。
2012年,Cloudera推出了Impala,一個開源的MPP SQL引擎,作為Hive的高性能替代品。Impala使用HDFS和HBase,並利用了Hive元數據。但是它繞開了使用MapReduce運行查詢。
3.1.4 Spark SQL
Spark SQL是Spark用於結構化數據處理的組件。Apache Spark團隊在2014年發布了Spark SQL,並吸收了一個叫Spark的早期的Hive-on-Spark項目,它迅速稱為最廣泛使用的Spark模塊。
Spark SQL用戶可以運行SQL查詢,從Hive中讀取數據,或者使用它來創建Spark Dataset和DataFrame(Dataset是分布式的數據集合,DataFrame是同一命名的Dataset列)。Spark SQL的接口向Spark提供了數據結構和執行操作的信息,Spark的Catalyst優化器使用這些信息來構造一個高效的查詢。
3.2 MySQL引擎(存儲引擎)
存儲引擎是數據庫的發動機,決定數據庫提供的功能和性能。
在Oracle和SQL Server等數據庫中只有一種存儲引擎,所有數據存儲管理機制都是一樣的。而作為開源數據庫,MySQL數據庫提供了多種存儲引擎。用戶可以根據不同的需求選擇不同的存儲引擎,用戶也可以根據自己的需要編寫自己的存儲引擎。
相對而言,討論的比較多的也就是Mysql相關的這些引擎。
3.2.1 show ENGINES

使用show ENGINES 查看MySQL中的引擎,可以看到包含:
-
INNODB:用於事務處理應用程序,具有眾多特性,包括ACID事務支持(提供行級鎖)。 -
MRG_MYISAM:存儲引擎,可用於水平分表。要求關聯的子表都是MYISAM類型。 -
MEMORY/HEAP:將所有數據保存在RAM中,在需要快速查找引用和其他類似數據的環境下,可提供極快的訪問。 -
BLACKHOLE:用於臨時禁止對數據庫的應用程序輸入。 -
MYISAM:默認的MySQL插件式存儲引擎,它是在Web、數據倉儲和其他應用環境下最常使用的存儲引擎之一。注意:通過更改STORAGE_ENGINE配置變量,能夠方便地更改MySQL服務器的默認存儲引擎。 -
CSV:引用由逗號隔開的用作數據庫表的文件。 -
ARCHIVE:為大量很少引用的歷史、歸檔或安全審計信息的存儲和檢索提供了完美的解決方案。 -
PERFORMANCE_SCHEMA:用於監控MySQL server在一個較低級別的運行過程中的資源消耗、資源等待等情況。 -
Federated:能夠將多個分離的MySQL服務器鏈接起來,從多個物理服務器創建一個邏輯服務器。十分適合於分布式環境或數據集市環境。
除此之外還有:
-
BDB:可替代INNODB的事務引擎,支持COMMIT、ROLLBACK和其他事務特性。 -
Merge:允許MySQL DBA或開發人員將一系列等同的MyISAM表以邏輯方式組合在一起,並作為1個對象引用它們。對於諸如數據倉儲等VLDB環境十分適合. -
Cluster/NDB:MySQL的簇式數據庫引擎,尤其適合於具有高性能查找要求的應用程序,這類查找需求還要求具有最高的正常工作時間和可用性。 -
Example引擎:可為快速創建定制的插件式存儲引擎提供幫助。
MySQL數據庫引擎取決於MySQL在安裝的時候是如何被編譯的,要添加一個心的引擎,就必須重新編譯MySQL。在缺省情況下,MySQL支持:ISAM、MYISAM和HEAP,以及INNODB、BERKLEY(BDB),還可以使用MySQL+API自己做一個引擎。
3.2.2 ISAM/MYISAM
ISAM是一個定義明確且歷經時間考驗的數據表格管理方法,它在設計之初就考慮到數據庫被查詢的次數要遠大於更新的次數。因此,ISAM執行讀取操作的速度很快,而且不占用大量的內存和存儲資源,其不足之處在於,它不支持事務處理,也不能夠容錯。如果你的硬盤崩潰了,那么數據文件就無法恢復了。
MyISAM則是MySQL的ISAM拓展格式和缺省的數據庫引擎。除了提供ISAM里所沒有的索引和字段管理的大量功能,MyISAM還使用一種表格鎖定的機制來優化多個並發的讀寫操作,其代價是你需要經常運行OPTIMIZE TABLE命令,來恢復被更新機制所浪費的空間。MyISAM還有一些有用的拓展,例如用來修復數據庫文件的MyIAMCHK工具和用來恢復浪費空間的MyISAMPACK工具。MyISAM強調了快速讀取操作,這可能就是為什么MySQL收到了WEB開發如此青睞的主要原因(在WEB開發中你所進行的大量數據操作都是讀取操作)。所以,大多數虛擬主機提供商和INTERNET平台提供商只允許使用MyISAM格式。MyISAM格式的一個重要缺陷就是不能在表損壞后恢復數據。
3.2.3 INNODB
InnoDB數據庫引擎都是造就MySQL靈活性技術的直接產品,這項技術就是MYSQL+API。在使用MySQL的時候,你所面對的每一個挑戰幾乎都源於ISAM和MyISAM數據庫引擎不支持事務處理(transaction process),也不支持外來鍵。盡管要比ISAM和MyISAM引擎慢很多,但是InnoDB包括了對事務處理的外來鍵的支持,這兩點都是前兩個引擎所沒有的。
3.2.4 MEMORY/HEAP
HEAP允許創建只駐留在內存里的臨時表格。駐留在內存里讓HEAP比ISAM和MyISAM都快,但是它所管理的數據是不穩定的,而且如果在關機之前沒有進行保存,那么所有的數據都會丟失。在數據行被刪除的時候,HEAP也不會浪費大量的空間。HEAP表格在你需要使用SELECT表達式來選擇和操控數據的時候非常有空。要記住在用完表格之后就刪除表格。
3.2.5 存儲引擎的選擇

Memory:所有的數據都在內存中,數據的處理速度快,但是安全性不高。如果需要很快的讀寫速度,對數據的安全性要求比較低,可以選擇Memory。它對表的大小有要求,不能建立太大的表,所以這類數據庫只使用在相對較小的數據庫表。
MyISAM:插入數據塊,空間和內存使用比較低。如果表主要是用於插入新紀錄和讀出記錄,那么選擇MyISAM能實現處理高效率。如果應用的完整性、並發性要求比較低,也可以使用。
InnoDB:支持事務處理,支持外鍵,支持奔潰修復能力和並發控制。如果對事務的完整性要求比較高(如銀行),要求實現並發控制(如售票),那選擇InnoDB有很大的優勢。如果需要頻繁的更新、刪除操作的數據庫,也可以選擇InnoDB。InnoDB是事務型數據庫的首選引擎。
如果要提供提交、回滾、崩潰恢復能力的事物安全(ACID兼容)能力,並要求實現並發控制,InnoDB是一個好的選擇
如果數據表主要用來插入和查詢記錄,則MyISAM引擎能提供較高的處理效率
如果只是臨時存放數據,數據量不大,並且不需要較高的數據安全性,可以選擇將數據保存在內存中的Memory引擎,MySQL中使用該引擎作為臨時表,存放查詢的中間結果
如果只有INSERT和SELECT操作,可以選擇Archive,Archive支持高並發的插入操作,但是本身不是事務安全的。Archive非常適合存儲歸檔數據,如記錄日志信息可以使用Archive。
使用哪一種引擎需要靈活選擇,一個數據庫中多個表可以使用不同引擎以滿足各種性能和實際需求
參考
