如果你是個賽車手,並且按一下按鈕就能夠立即更換引擎而不需要把車開到車庫裡去換,那會是什麼感覺呢?mysql資料庫為開發人員所做的就好像是按按鈕換引擎;它讓你選擇資料庫引擎,並給你一條簡單的途徑來切換它。
mysql的自帶引擎肯定是夠用了,但是在有些情況下,其他的引擎可能要比手頭所用更適合完成任務。如果願意的話,你甚至可以使用mysql++ api來建立自己的資料庫引擎,就像打穿氣缸裝上自己的化油器。現在讓我們來看看你該如何選擇引擎,以及如何在可用引擎之間切換。
選擇你的引擎
你能用的資料庫引擎取決於mysql在安裝的時候是如何被編譯的。要新增乙個新的引擎,就必須重新編譯mysql。僅僅為了新增乙個特性而編譯應用程式的概念對於windows的開發人員來說可能很奇怪,但是在unix世界裡,這已經成為了標準。在預設情況下,mysql支援三個引擎:isam、myisam和heap。另外兩種型別innodb和berkley(bdb),也常常可以使用。
isam
isam是乙個定義明確且歷經時間考驗的資料**管理方法,它在設計之時就考慮到資料庫被查詢的次數要遠大於更新的次數。因此,isam執行讀取操作的速度很快,而且不占用大量的記憶體和儲存資源。isam的兩個主要不足之處在於,它不支援事務處理,也不能夠容錯:如果你的硬碟崩潰了,那麼資料檔案就無法恢復了。如果你正在把isam用在關鍵任務應用程式裡,那就必須經常備份你所有的實時資料,通過其複製特性,mysql能夠支援這樣的備份應用程式。
myisam
myisam是mysql的isam擴充套件格式和預設的資料庫引擎。除了提供isam裡所沒有的索引和字段管理的大量功能,myisam還使用一種**鎖定的機制,來優化多個併發的讀寫操作。其代價是你需要經常執行optimize table命令,來恢復被更新機制所浪費的空間。myisam還有一些有用的擴充套件,例如用來修復資料庫檔案的myisamchk工具和用來恢復浪費空間的myisampack工具。
myisam強調了快速讀取操作,這可能就是為什麼mysql受到了web開發如此青睞的主要原因:在web開發中你所進行的大量資料操作都是讀取操作。所以,大多數虛擬主機提供商和internet平台提供商(internet presence provider,ipp)只允許使用myisam格式。
heap
heap允許只駐留在記憶體裡的臨時**。駐留在記憶體裡讓heap要比isam和myisam都快,但是它所管理的資料是不穩定的,而且如果在關機之前沒有進行儲存,那麼所有的資料都會丟失。在資料行被刪除的時候,heap也不會浪費大量的空間。heap**在你需要使用select表示式來選擇和操控資料的時候非常有用。要記住,在用完**之後就刪除**。讓我再重複一遍:在你用完**之後,不要忘記刪除**。
innodb和berkley db
innodb和berkley db(bdb)資料庫引擎都是造就mysql靈活性的技術的直接產品,這項技術就是mysql++ api。在使用mysql的時候,你所面對的每乙個挑戰幾乎都源於isam和myisam資料庫引擎不支援事務處理也不支援外來鍵。儘管要比isam和myisam引擎慢很多,但是innodb和bdb包括了對事務處理和外來鍵的支援,這兩點都是前兩個引擎所沒有的。如前所述,如果你的設計需要這些特性中的一者或者兩者,那你就要被迫使用後兩個引擎中的乙個了。
如果感覺自己的確技術高超,你還能夠使用mysql++來建立自己的資料庫引擎。這個api為你提供了操作字段、記錄、**、資料庫、連線、安全帳號的功能,以及建立諸如mysql這樣dbms所需要的所有其他無數功能。深入講解api已經超出了本文的範圍,但是你需要了解mysql++的存在及其可交換引擎背後的技術,這一點是很重要的。估計這個外掛程式式資料庫引擎的模型甚至能夠被用來為mysql建立本地的xml提供器(xml provider)。(任何讀到本文的mysql++開發人員可以把這一點當作是個要求。)
讓所有的靈活性成為可能的開關是提供給ansi sql的mysql擴充套件——type引數。mysql能夠讓你在**這一層指定資料庫引擎,所以它們有時候也指的是table formats。下面的示例**表明了如何建立分別使用myisam、isam和heap引擎的**。要注意,建立每個**的**是相同的,除了最後的type引數,這一引數用來指定資料引擎。
create table tblmyisam (
id int not null auto_increment,
primary key (id),
value_a tinyint
) type=myisam
create table tblisam (
id int not null auto_increment,
primary key (id),
value_a tinyint
) type=isam
create table tblheap (
id int not null auto_increment,
primary key (id),
value_a tinyint
) type=heap
你也可以使用alter table命令,把原有的**從乙個引擎移動到另乙個引擎。下面的**顯示了如何使用alter table把myisam**移動到innodb的引擎:
alter table tblmyisam change type=innodb
mysql用三步來實現這一目的。首先,這個**的乙個副本被建立。然後,任何輸入資料的改變都被排入佇列,同時這個副本被移動到另乙個引擎。最後,任何排入佇列的資料改變都被送交到新的**裡,而原來的**被刪除。
alter table捷徑
如果只是想把**從isam更新為myisam,你可以使用mysql_convert_table_format命令,而不需要編寫alter table表示式。
你可以使用show table命令(這是mysql對ansi標準的另乙個擴充套件)來確定哪個引擎在管理著特定的**。show table會返回乙個帶有多資料列的結果集,你可以用這個結果集來查詢獲得所有型別的資訊:資料庫引擎的名稱在type欄位裡。下面的示例**說明了show table的用法:
show table status from tblinnodb
show table的替換方法
你可以用show create table [tablename]來取回show table能夠取回的資訊。最後,如果你想使用沒有被編譯成mysql也沒有被啟用的引擎,那是沒有用的,mysql不會提示這一點。而它只會給你提供乙個預設格式(myisam)的**。除了使用預設的**格式外,還有辦法讓mysql給出錯誤提示,但是就現在而言,如果不能肯定特定的資料庫引擎是否可用的話,你要使用show table來檢查**格式。
更多的選擇意味著更好的效能
用於特定**的引擎都需要重新編譯和追蹤,考慮到這種的額外複雜性,為什麼你還是想要使用非預設的資料庫引擎呢?答案很簡單:要調整資料庫來滿足你的要求。
可以肯定的是,myisam的確快,但是如果你的邏輯設計需要事務處理,你就可以自由使用支援事務處理的引擎。進一步講,由於mysql能夠允許你在**這一層應用資料庫引擎,所以你可以只對需要事務處理的**來進行效能優化,而把不需要事務處理的**交給更加輕便的myisam引擎。對於mysql而言,靈活性才是關鍵。
通過資料庫來實現tomcat集群
前段時間一直在學習tomcat的集群,tomcat5已經配置成功了,無奈到了tomcat6上,總是不成功,出現的問題是乙個tomcat無法發現另外乙個tomcat,今天又在網上看了下,發現了乙個新的方法來實現集群。集群無非就是實現兩個關鍵點,乙個是負載的均衡,乙個是session的複製。負載的均衡通...
MySql通過資料庫檔案恢復資料庫
以表 table 為例 如型別是myisam,資料檔案則以 table.frm table.myd table.myi 三個檔案儲存於 data databasename 目錄中.如型別是innodb,資料檔案則儲存在 innodb data home dir 中的ibdata1檔案中 一般情況 結...
HeePHP通過資料庫讀取資料
從資料庫讀取資料 讀取多條記錄 讀取所有記錄 list table users all 根據條件讀取多條記錄 list table product where color red select 根據條件讀取多條記錄後分頁 list table product where size l page 讀取...